Ich versuche, OpenGL ES 2.0 zu lernen, und frage mich, welche Methode zum "Verwalten" von Shadern am häufigsten angewendet wird.
Ich stelle diese Frage, weil ich in den Beispielen, die ich gefunden habe (wie in der API-Demo, die mit dem android sdk geliefert wurde), normalerweise alles in der GLRenderer-Klasse sehe und die Dinge lieber trennen möchte, damit ich sie haben kann. Zum Beispiel ein GLImage-Objekt, das ich wiederverwenden kann, wenn ich ein texturiertes Quad zeichnen möchte (ich konzentriere mich momentan nur auf 2D), so wie ich es in meinem OpenGL ES 1.0-Code getan habe. In fast jedem Beispiel, das ich gefunden habe, werden Shader nur als Klassenattribute definiert. Beispielsweise:
public class Square {
public final String vertexShader =
"uniform mat4 uMVPMatrix;\n" +
"attribute vec4 aPosition;\n" +
"attribute vec4 aColor;\n" +
"varying vec4 vColor;\n" +
"void main() {\n" +
" gl_Position = uMVPMatrix * aPosition;\n" +
" vColor = aColor;\n" +
"}\n";
public final String fragmentShader =
"precision mediump float;\n" +
"varying vec4 vColor;\n" +
"void main() {\n" +
" gl_FragColor = vColor;\n" +
"}\n";
// ...
}
Ich entschuldige mich im Voraus, wenn einige dieser Fragen dumm sind, aber ich habe noch nie mit Shadern gearbeitet.
1) Ist der obige Code der gebräuchliche Weg, um Shader zu definieren (öffentliche Eigenschaften der letzten Klasse)?
2) Sollte ich eine separate Shader-Klasse haben?
3) Wenn Shader außerhalb der Klasse definiert sind, die sie verwendet, wie würde ich die Namen ihrer Attribute kennen (z. B. "aColor" im folgenden Code), damit ich sie binden kann?
colorHandle = GLES20.glGetAttribLocation(program, "aColor");
quelle
Das Shader-Management (und damit auch das Material-Management) ist ein ziemlich kniffliges Problem, wenn Ihr Grafiksystem komplexer wird und Sie bemerken, dass hartes Codieren bei jedem Shader zu massiven Code-Duplikationen führen würde. Hier sind einige alternative Lösungsmöglichkeiten:
Für die Attribut- und Uniformnamen und dergleichen verwenden Sie einfach eine einheitliche Benennung für alle Shader.
quelle