我有这个代码:
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
,无需每次分配新的颜色。