为什么我不能使用uniform1f而不是uniform4f来设置vec4制服?

时间:2015-02-18 13:16:59

标签: javascript opengl-es webgl shader

我通过this book逐步学习WebGL。我尝试通过使用缓冲区(gl.ARRAY_BUFFER)而不是循环来绘制三个点(正如我之前在本书的其他示例中所做的那样)。

  var u_FragColor = gl.getUniformLocation(gl.program, 'u_FragColor');
  if(!u_FragColor){
    console.log('Can\'t to get the "u_FragColor" variable.');
    return -1;
  }

  // gl.uniform1f(u_FragColor, 1.0); // <- this variant doesn't work! Why?
  gl.uniform4f(u_FragColor, 1.0, 0.0, 0.0, 1.0);

它工作正常,但我对gl_FragColor初始化有疑问:为什么我无法替换

gl.uniform4f(u_FragColor, 1.0, 0.0, 0.0, 1.0);

上的

gl.uniform1f(u_FragColor, 1.0);

?我预计这是一样的。但是这种情况我在控制台中收到错误:

enter image description here

1 个答案:

答案 0 :(得分:2)

您必须使用正确的类型来设置制服。如果你的制服是vec4,那么你必须使用gl.uniform4fgl.uniform4fv

uniform       valid
type          functions
----------------------------------------------
float         gl.uniform1f    gl.uniform1fv
vec2          gl.uniform2f    gl.uniform2fv
vec3          gl.uniform3f    gl.uniform3fv
vec4          gl.uniform4f    gl.uniform4fv
int           gl.uniform1i    gl.uniform1iv
ivec2         gl.uniform2i    gl.uniform2iv
ivec3         gl.uniform3i    gl.uniform3iv
ivec4         gl.uniform4i    gl.uniform4iv
sampler2D     gl.uniform1i    gl.uniform1iv
samplerCube   gl.uniform1i    gl.uniform1iv

mat2          gl.uniformMatrix2fv
mat3          gl.uniformMatrix3fv
mat4          gl.uniformMatrix4fv

bool          gl.uniform1i gl.uniform1f gl.uniform1iv gl.uniform1fv
bvec2         gl.uniform2i gl.uniform2f gl.uniform2iv gl.uniform2fv
bvec3         gl.uniform3i gl.uniform3f gl.uniform3iv gl.uniform3fv
bvec4         gl.uniform4i gl.uniform4f gl.uniform4iv gl.uniform4fv

From the OpenGL ES 2.0 spec第2.10.4节

  

使用的Uniform *命令必须与着色器中声明的制服大小相匹配。例如,要加载声明为bvec2的制服,可以使用Uniform2i {v}或Uniform2f {v}。如果尝试使用不匹配的Uniform *命令,将生成INVALID_OPERATION错误。在此示例中,使用Uniform1iv会生成错误

     

对于所有其他统一类型,使用的Uniform *命令必须与着色器中声明的制服的大小和类型相匹配。没有进行类型转换。例如,要加载声明为vec4的制服,必须使用Uniform4f {v}。要加载3x3矩阵,必须使用UniformMatrix3fv。如果尝试使用不匹配的Uniform *命令,将生成INVALID_OPERATION错误。在此示例中,使用Uniform4i {v}将生成错误