WebGL碎片着色器颜色未生效



我有这个代码:

var FSHADER_SOURCE = `
  precision mediump float;
  uniform vec4 u_FragColor;
  void main() {
    gl_FragColor = u_FragColor;
  }`;

也是更改碎片着色器颜色的功能:

var gl = getWebGLContext(canvas);
var u_FragColor = gl.getUniformLocation(gl.program, 'u_FragColor');
// lines to set rgb
gl.uniform4f(u_FragColor, rgb[0], rgb[1], rgb[2], rgb[3]);

奇怪的是,我可以看到RGB设置为诸如[0,1,0,1]之类的东西,但是碎片着色器的颜色无论如何都是黑色的。即使我将代码更改为:

// still black
gl.uniform4f(u_FragColor, 0.0, 1.0, 0.0, 1.0);

更改颜色的唯一方法是无需使用u_FragColor即可直接修改RGB通道。我在这里缺少什么?


如果有用的话也可以完成代码。

在链接程序后,可以获得一个主动程序资源,例如统一变量的位置:

gl.linkProgram(gl.program);
var u_FragColor = gl.getUniformLocation(gl.program, 'u_FragColor'); 

但是,要设置统一变量的值,该程序必须安装为当前程序。uniform *将值设置为与当前使用程序的位置相关的制服。注意,gl.uniform4f没有程序的参数,受影响的程序是当前程序:

gl.useProgram(gl.program);
gl.uniform4f(u_FragColor, rgb[0], rgb[1], rgb[2], rgb[3]);

如果我做这样的事情,它对我有用:

var color = new Float32Array([rgb[0], rgb[1], rgb[2], rgb[3]]);

...然后:

gl.uniform4fv(program.uniforms['u_fragColor'], color);

所以,我相信这里的问题只是uniform4f而不是uniform4fv中的转换。

请注意,稍后您可以将颜色组件直接设置为Float32Array,无需每次分配新的颜色。

最新更新