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

2024-03-09

我通过以下方式逐步学习WebGL这本书 https://sites.google.com/site/webglbook/。我尝试通过使用缓冲区来绘制三个点(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);

on the

gl.uniform1f(u_FragColor, 1.0);

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


您必须使用正确的类型来设置制服。如果你的制服是vec4那么你必须使用gl.uniform4f or 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

来自 OpenGL ES 2.0 规范 https://www.khronos.org/registry/gles/specs/2.0/es_full_spec_2.0.25.pdf第2.10.4节

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我不能使用uniform1f而不是uniform4f来设置vec4制服? 的相关文章

随机推荐