Estoy tratando de aprender OpenGL ES 2.0 y me pregunto cuál es la práctica más común para "administrar" sombreadores.
Estoy haciendo esta pregunta porque en los ejemplos que he encontrado (como el que se incluye en la demostración de API proporcionada con el SDK de Android), generalmente veo todo dentro de la clase GLRenderer y prefiero separar las cosas para poder tener, por ejemplo, un objeto GLImage que puedo reutilizar cuando quiera dibujar un quad con textura (me estoy enfocando en 2D solo en este momento), tal como lo hice en mi código OpenGL ES 1.0. En casi todos los ejemplos que he encontrado, los sombreadores solo se definen como atributos de clase. Por ejemplo:
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";
// ...
}
Pido disculpas de antemano si algunas de estas preguntas son tontas, pero nunca he trabajado con sombreadores antes.
1) ¿Es el código anterior la forma común de definir sombreadores (propiedades públicas de clase final)?
2) ¿Debería tener una clase de sombreador separada?
3) Si los sombreadores se definen fuera de la clase que los usa, ¿cómo sabría los nombres de sus atributos (por ejemplo, "aColor" en el siguiente fragmento de código) para poder vincularlos?
colorHandle = GLES20.glGetAttribLocation(program, "aColor");
fuente
La administración del sombreador (y, por lo tanto, el material) es un problema bastante complicado que se encuentra cuando su sistema de gráficos se vuelve más complejo y nota que la codificación dura de cada sombreador conduciría a una duplicación masiva de código. Aquí hay algunas formas alternativas de resolverlo:
En cuanto a los nombres de atributos y uniformes y demás, solo usa un nombre coherente en todos los sombreadores.
fuente