Я пытаюсь понять, как шейдеры вершин и фрагментов работают в OpenGL ES 2.0.Настройка векторов в шейдерах, как это работает? OpenGL GLSL
Мои шейдеры выглядеть следующим образом:
вершинные шейдеры:
// 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);
}
Программа, которая использует эти шейдеры рисует простой 2D прямоугольник текстура (изображение). Сначала он передает вершины прямоугольника и текстурные коорды в вершинный шейдер с атрибутами. Затем вершинный шейдер передает текстурные координаты с изменением на фрагментарный шейдер.
Что меня смущает, так это то, что векторы 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);
}
Возможно ли это? Могу ли я передать все точки, которые нужны мне шейдерам? Это хорошая идея?
Большое спасибо за этот подробный ответ – Alexanus