WebGL:将统一数组传递给着色器

Dmi*_*try 5 arrays shader glsl uniform webgl

试图像这样做:将数组传递给着色器 并像这样:将一组向量传递给一个制服

但仍然没有运气.我想我喜欢那里,但它不起作用:

这是我的JavaScript代码:

shaderProgram.lightsUniform = gl.getUniformLocation(shaderProgram, "lights"); // Getting location
gl.uniform1f(shaderProgram.lightsUniform, new Float32Array([3,1,2,3,4,5])); // Let's try to send some light (currently each light is one float) as array.
Run Code Online (Sandbox Code Playgroud)

顶点着色器代码:

uniform float lights[6]; // Declaration

...

vLight *= lights[0]; // Let's try to mutliply our light by the first array item. There should be 3.0.
Run Code Online (Sandbox Code Playgroud)

简介:我将一个数组发送到具有非零浮点数的着色器.

结果:全黑!即灯[0]包含0.0但预期为3.0.如果我尝试灯[1],灯[2]等,它们都会给出相同的结果!

我们现在尝试只传递一个浮点数.我改变

gl.uniform1f(shaderProgram.lightsUniform, new Float32Array([3,1,2,3,4,5])); 
Run Code Online (Sandbox Code Playgroud)

gl.uniform1f(shaderProgram.lightsUniform, 3); // I want to send just float 3.0
Run Code Online (Sandbox Code Playgroud)

总结:我发送的只是float 3.0,而不是发送数组.

结果:有效!lights [0]包含3.0(但我只发送了float,而不是数组).

我做错了什么?如何传递到着色器制服阵列?

Nic*_*las 8

这些答案都使用了这个功能uniform3fv.v如在vector.

所以你应该使用uniform1fv,而不是uniform1f制服阵列.将来,请在阅读答案时更加小心.或者如果没有,请在提问之前检查您的OpenGL错误.

  • “在提问之前检查你的 OpenGL 错误” 这本身就是一个具有挑战性的领域,并且可能会令人难以置信。这是一个结构良好的问题,有一个有用且直接的答案,这就是 StackOverflow 的要点。没有理由告诉某人他们不应该问问题。 (16认同)