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");
źródło
Zarządzanie modułami cieniującymi (a tym samym materiałowymi) jest dość trudnym problemem, na który natrafisz, gdy twój system graficzny staje się bardziej złożony i zauważasz, że ciężkie kodowanie każdego modułu cieniującego prowadziłoby do ogromnego powielania kodu. Oto kilka alternatywnych sposobów rozwiązania tego problemu:
Jeśli chodzi o nazwy atrybutów i mundurów, wystarczy zastosować spójne nazewnictwo we wszystkich modułach cieniujących.
źródło