【问题标题】:WebGL: passing uniform arrays to shaderWebGL:将统一数组传递给着色器
【发布时间】:2013-07-26 02:21:54
【问题描述】:

试着像这里一样做:Pass array to shader 就像这里:Passing an array of vectors to a uniform

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

这是我的 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.

顶点着色器代码:

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.

总结:我将一个数组发送到非零浮点数的着色器。

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

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

gl.uniform1f(shaderProgram.lightsUniform, new Float32Array([3,1,2,3,4,5])); 

gl.uniform1f(shaderProgram.lightsUniform, 3); // I want to send just float 3.0

总结:我不发送数组,而是只发送浮点 3.0。

结果:有效! light[0] 包含 3.0(但我发送的只是浮点数,而不是数组)。

我做错了什么?如何传递给制服的着色器数组?

【问题讨论】:

    标签: arrays glsl webgl shader uniform


    【解决方案1】:

    这些答案都使用函数uniform3fvvvector 一样。

    所以对于制服数组,您应该使用uniform1fv,而不是uniform1f。以后请大家在阅读答案时更加小心。否则,请在提问前检查您的 OpenGL 错误。

    【讨论】:

    • 我遇到了类似的问题。但是当我更改为uniform1fv时,出现以下控制台错误:无法在'WebGLRenderingContext'上执行'uniform1fv':未找到与提供的签名匹配的函数。
    • “在提问之前检查你的 OpenGL 错误”这是一个天生具有挑战性的空间,并且可能会令人难以置信的压倒性。这是一个格式正确的问题,有一个有用且直接的答案,这就是 StackOverflow 的重点。没有理由告诉别人他们不应该问问题。
    【解决方案2】:

    1:确保您的 if 语句位于 函数 内。

    2:确保precision声明制服之前设置。

          #ifdef GL_FRAGMENT_PRECISION_HIGH
            precision highp float;
          #else
            precision mediump float;
          #endif
          precision mediump int;
    

    3:确保比较类型正确:

    这将失败

    uniform vec3 neon_whatever;
    if(neon_whatever.x == 0){
    
    };
    

    这将失败

    uniform vec3 neon_whatever;
    if(neon_whatever == 0.0){
    
    };
    

    这将工作

    uniform vec3 neon_whatever;
    if(neon_whatever.x == 0.0){
    
    };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-07
      • 2017-01-24
      相关资源
      最近更新 更多