Sto cercando di imparare OpenGL ES 2.0 e mi chiedo quale sia la pratica più comune per "gestire" gli shader.
Sto ponendo questa domanda perché negli esempi che ho trovato (come quello incluso nella demo dell'API fornita con Android SDK), di solito vedo tutto all'interno della classe GLRenderer e preferirei separare le cose in modo che io possa avere, per esempio, un oggetto GLImage che posso riutilizzare ogni volta che voglio disegnare un quad testurizzato (al momento mi sto concentrando sul 2D), proprio come nel mio codice OpenGL ES 1.0. In quasi tutti gli esempi che ho trovato, gli shader sono semplicemente definiti come attributi di classe. Per esempio:
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";
// ...
}
Mi scuso in anticipo se alcune di queste domande sono stupide, ma non ho mai lavorato con shader prima.
1) Il codice sopra è il modo comune per definire shader (proprietà pubbliche della classe finale)?
2) Dovrei avere una classe Shader separata?
3) Se gli shader vengono definiti al di fuori della classe che li utilizza, come faccio a sapere i nomi dei loro attributi (ad esempio "aColor" nel seguente pezzo di codice) in modo da poterli associare?
colorHandle = GLES20.glGetAttribLocation(program, "aColor");