Я пытаюсь изучить 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");
источник
Управление шейдерами (и, следовательно, материалом) - довольно сложная проблема, с которой вы сталкиваетесь, когда ваша графическая система усложняется, и вы замечаете, что жесткое кодирование каждого шейдера приведет к массовому дублированию кода. Вот несколько альтернативных способов ее решения:
Что касается атрибутов и унифицированных имен и тому подобного, вы просто используете согласованные имена для всех шейдеров.
источник