我的目标是在多维数据集上拍一个纹理。 我在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;
}
运行我的程序会产生以下结果:
我看到我的立方体,它从纹理中获取颜色,但仅对整个形状使用第一个纹理像素的颜色。这表明我的紫外线矢量是空的。
我可以通过尝试使用我的uv矢量中的数据作为颜色来确认这一点:
gl_FragColor = vec4(v_uv,0,1);
哪些给了我以下内容:
一个黑色立方体。我的紫外线矢量中没有值...
奇怪的是,如果我像这样在顶点着色器中使用uv矢量:
gl_Position = u_mvp * vec4(v_uv, 0, 1);
突然我在片段着色器的uv向量中获取值,该值用作颜色值会产生以下结果:
或者像Uv这样在我的纹理中进行协调:
gl_FragColor = texture2D(u_texSampler, v_uv).bgra;
产生以下内容:
可以从我的纹理中正确获取颜色...
为什么我的变量除非将它们用于gl_Position,否则不会将值传递给片段着色器?
答案 0 :(得分:0)
我发现了我的错误。
我将gl对象的位置存储在不同的数组中,例如:
webGlBuffers = [];
webGlShaders = [];
webGlPrograms = [];
webGlAttribLocations = [];
webGlUniformLocations = [];
webGlTextures = [];
在我的gl.EnableVertexAttribArray调用中,我引用了错误的数组。即: 我在打电话
gl.EnableVertexAttribArray(webGlShaders[0]);
我什么时候应该打电话
gl.EnableVertexAttribArray(webGlAttribLocations[0]);