Я пытаюсь понять, как работают вершинные и фрагментные шейдеры в OpenGL ES 2.0.
Мои шейдеры выглядят так:
вершинный шейдер:
// source code for the vertex shader
attribute vec4 vPosition
attribute vec2 a_texCoord;
varying vec2 v_texCoord;
void main() {
gl_Position = vPosition;
v_texCoord = a_texCoord;
}
фрагментный шейдер:
// source code for the fragment shader
precision mediump float;
uniform sampler2D s_texture;
varying vec2 v_texCoord;
void main() {
gl_FragColor = texture2D(s_texture, v_texCoord);
}
Программа, использующая эти шейдеры, рисует простой двухмерный прямоугольник с текстурой (изображением). Сначала он передает вершины прямоугольника и координаты текстуры вершинному шейдеру с атрибутами. Затем вершинный шейдер передает текстурные координаты в зависимости от фрагментного шейдера.
Что меня смущает, так это то, что векторы vPosition, a_texCoord и v_texCoord могут сохранить только 1 точку, но должны сохранить 4 разных точки. Я где-то читал, что вершинный шейдер будет вызываться для каждой вершины. Означает ли это, что вершинный и фрагментный шейдеры будут обрабатываться 4 раза для каждого изображения, которое я хочу нарисовать? Когда я определяю атрибуты (glVertexAttribPointer), я использую массив с 4 точками, как шейдеры могут сохранить 4 точки в переменной, которая может хранить только 1 точку?
Хочу использовать униформу вместо атрибутов, читаю лучше. Также мне не нужна переменная. Я бы хотел, чтобы это было так:
вершинный шейдер:
// source code for the vertex shader
uniform vec4 vPosition;
void main() {
gl_Position = vPosition;
}
фрагментный шейдер:
// source code for the fragment shader
precision mediump float;
uniform sampler2D s_texture;
uniform vec2 v_texCoord;
void main() {
gl_FragColor = texture2D(s_texture, v_texCoord);
}
Это возможно? Могу ли я передать шейдерам все необходимые баллы? Это хорошая идея?