And*_*man 2 javascript shader opengl-es webgl
我通过这本书一步一步地学习了 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);
Run Code Online (Sandbox Code Playgroud)
它工作正常,但我有一个关于gl_FragColor初始化的问题:为什么我不能替换
gl.uniform4f(u_FragColor, 1.0, 0.0, 0.0, 1.0);
Run Code Online (Sandbox Code Playgroud)
在
gl.uniform1f(u_FragColor, 1.0);
Run Code Online (Sandbox Code Playgroud)
? 我预计这是一样的。但是在这种情况下,我在控制台中收到错误消息:

您必须使用正确的类型来设置制服。如果您的制服是,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
Run Code Online (Sandbox Code Playgroud)
来自 OpenGL ES 2.0 规范第 2.10.4 节
所使用的 Uniform* 命令必须与着色器中声明的制服尺寸相匹配。例如,要加载声明为 bvec2 的制服,可以使用 Uniform2i{v} 或 Uniform2f{v}。如果尝试使用不匹配的 Uniform* 命令,将生成 INVALID_OPERATION 错误。在这个例子中使用 Uniform1iv 会产生一个错误
对于所有其他统一类型,所使用的 Uniform* 命令必须与着色器中声明的统一的大小和类型相匹配。不进行类型转换。例如,要加载声明为 vec4 的制服,必须使用 Uniform4f{v}。要加载 3x3 矩阵,必须使用 UniformMatrix3fv。如果尝试使用不匹配的 Uniform* 命令,将生成 INVALID_OPERATION 错误。在这个例子中,使用 Uniform4i{v} 会产生一个错误