为什么我的WebGL变化无法将值从顶点着色器传递到片段着色器?

时间:2018-11-07 10:51:10

标签: canvas glsl webgl

我的目标是在多维数据集上拍一个纹理。 我在Chrome上使用的是webGL 1。 我的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

我看到我的立方体,它从纹理中获取颜色,但仅对整个形状使用第一个纹理像素的颜色。这表明我的紫外线矢量是空的。

我可以通过尝试使用我的uv矢量中的数据作为颜色来确认这一点:

gl_FragColor = vec4(v_uv,0,1);

哪些给了我以下内容:

canvas printscreen #2

一个黑色立方体。我的紫外线矢量中没有值...

奇怪的是,如果我像这样在顶点着色器中使用uv矢量:

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

突然我在片段着色器的uv向量中获取值,该值用作颜色值会产生以下结果:

canvas printscreen #3

或者像Uv这样在我的纹理中进行协调:

gl_FragColor = texture2D(u_texSampler, v_uv).bgra;

产生以下内容:

canvas printscreen #4

可以从我的纹理中正确获取颜色...

为什么我的变量除非将它们用于gl_Position,否则不会将值传递给片段着色器?

1 个答案:

答案 0 :(得分:0)

我发现了我的错误。

我将gl对象的位置存储在不同的数组中,例如:

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

在我的gl.EnableVertexAttribArray调用中,我引用了错误的数组。即: 我在打电话

gl.EnableVertexAttribArray(webGlShaders[0]);

我什么时候应该打电话

gl.EnableVertexAttribArray(webGlAttribLocations[0]);