Я намагаюся навчитися OpenGL ES 2.0 і мені цікаво, що є найпоширенішою практикою «керування» шейдерами.
Я задаю це запитання, тому що в знайдених нами прикладах (як, наприклад, в демонстраційному інтерфейсі API, який надається з Android sdk), я зазвичай бачу все всередині класу GLRenderer, і я вважаю за краще окремі речі, щоб мати можливість, наприклад, об'єкт GLImage, який я можу використовувати повторно, коли хочу малювати текстурований квадратик (я зосереджуюсь на 2D лише в даний момент), як і в коді OpenGL ES 1.0. Майже в кожному знайденому нами прикладі шейдери просто визначаються як атрибути класу. Наприклад:
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";
// ...
}
Я заздалегідь вибачаюся, якщо деякі з цих питань німі, але я ніколи раніше не працював із шейдерами.
1) Чи є наведений вище код загальним способом визначення шейдерів (загальнодоступних властивостей останнього класу)?
2) Чи повинен я мати окремий клас Шейдер?
3) Якщо шейдери визначені поза класом, який їх використовує, то як я можу знати назви їх атрибутів (наприклад, "aColor" у наступному фрагменті коду), щоб я міг їх зв'язати?
colorHandle = GLES20.glGetAttribLocation(program, "aColor");