Próbuję nauczyć się OpenGL ES 2.0 i zastanawiam się, jaka jest najczęstsza praktyka „zarządzania” modułami cieniującymi.
Zadaję to pytanie, ponieważ w przykładach, które znalazłem (takich jak ten zawarty w Demo API dostarczonym wraz z Androidem SDK), zwykle widzę wszystko w klasie GLRenderer i wolę rozdzielić rzeczy, aby móc, na przykład obiekt GLImage, którego mogę użyć ponownie, gdy chcę narysować teksturowany kwadrat (w tej chwili koncentruję się na 2D), tak jak w moim kodzie OpenGL ES 1.0. W prawie każdym znalezionym przykładzie shadery są po prostu zdefiniowane jako atrybuty klasy. Na przykład:
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";
// ...
}
Z góry przepraszam, jeśli niektóre z tych pytań są głupie, ale nigdy wcześniej nie pracowałem z shaderami.
1) Czy powyższy kod jest powszechnym sposobem definiowania shaderów (właściwości publicznej klasy końcowej)?
2) Czy powinienem mieć osobną klasę Shader?
3) Jeśli moduły cieniujące są zdefiniowane poza klasą, która ich używa, skąd mam znać nazwy ich atrybutów (np. „AColor” w poniższym fragmencie kodu), aby móc je powiązać?
colorHandle = GLES20.glGetAttribLocation(program, "aColor");