我通过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);
?我预计这是一样的。但是这种情况我在控制台中收到错误:
答案 0 :(得分:2)
您必须使用正确的类型来设置制服。如果你的制服是vec4
,那么你必须使用gl.uniform4f
或gl.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}将生成错误