Почему мой WebGL не передает значения из моего вершинного шейдера в фрагментный шейдер? - PullRequest
0 голосов
/ 07 ноября 2018

Моя цель - ударить текстуру по Кубу. Я использую webGL 1 на Chrome. Не похоже, что мои UV-координаты меняются должным образом. Похоже, что значения не передаются фрагментному шейдеру.

Код вершинного шейдера:

attribute vec3 a_position;
attribute vec2 a_vertexUV;

uniform mat4 u_mvp;

varying vec2 v_uv;

void main() {
    v_uv = a_vertexUV;
    gl_Position = u_mvp * vec4(a_position, 1);
}

Код шейдера фрагмента:

precision mediump float; 

varying vec2 v_uv;

uniform sampler2D u_texSampler;

void main() {
    gl_FragColor = texture2D(u_texSampler, v_uv).bgra;
}

Запуск моей программы выдает следующее:

canvas printscreen

Я вижу мой куб, он берет цвет из текстуры, но использует только цвет первого текселя для всей фигуры. Что говорит о том, что мой УФ-вектор пуст.

Я могу подтвердить это, пытаясь использовать данные из моего ультрафиолетового вектора в качестве цвета:

gl_FragColor = vec4(v_uv,0,1);

Что дает мне следующее:

canvas printscreen #2

черный куб. В моем векторе UV нет значений ...

Странная вещь в том, что если я использую вектор uv в вершинном шейдере, вот так:

gl_Position = u_mvp * vec4(v_uv, 0, 1);

Внезапно я получаю значения в моем ультрафиолетовом векторе во фрагментном шейдере, который, используя в качестве значений цвета, дает следующее:

canvas printscreen #3

Или как UV-координаты в моей текстуре, вот так:

gl_FragColor = texture2D(u_texSampler, v_uv).bgra;

Производит следующее:

canvas printscreen #4

Который правильно исходит из моей текстуры ...

Почему мой вариант не передает значения фрагментному шейдеру, если он не используется в gl_Position?

1 Ответ

0 голосов
/ 12 ноября 2018

Я нашел свою ошибку.

Я храню мои объекты GL в разных массивах, например:

webGlBuffers = [];
webGlShaders = [];
webGlPrograms = [];
webGlAttribLocations = [];
webGlUniformLocations = [];
webGlTextures = [];

В моих вызовах gl.EnableVertexAttribArray я ссылался на неправильный массив. то есть: Я звонил

gl.EnableVertexAttribArray(webGlShaders[0]);

Когда я должен звонить

gl.EnableVertexAttribArray(webGlAttribLocations[0]);
...