Estou tentando aprender o OpenGL ES 2.0 e estou me perguntando qual é a prática mais comum para "gerenciar" shaders.
Estou fazendo essa pergunta porque nos exemplos que encontrei (como o incluído na demonstração da API fornecida com o Android SDK), geralmente vejo tudo dentro da classe GLRenderer e prefiro separar as coisas para que eu possa ter, por exemplo, um objeto GLImage que eu possa reutilizar sempre que quiser desenhar um quad texturizado (estou focando 2D apenas no momento), como havia no código OpenGL ES 1.0. Em quase todos os exemplos que encontrei, os shaders são apenas definidos como atributos de classe. Por exemplo:
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";
// ...
}
Peço desculpas antecipadamente se algumas dessas perguntas são idiotas, mas nunca trabalhei com shaders antes.
1) O código acima é a maneira comum de definir shaders (propriedades públicas de classe final)?
2) Devo ter uma classe Shader separada?
3) Se shaders forem definidos fora da classe que os utiliza, como eu saberia os nomes de seus atributos (por exemplo, "aColor" no seguinte trecho de código) para poder vinculá-los?
colorHandle = GLES20.glGetAttribLocation(program, "aColor");