【问题标题】:for-loop in shader code working with hardcoded number but not with uniform variable着色器代码中的 for 循环使用硬编码数字但不使用统一变量
【发布时间】:2013-09-20 20:48:43
【问题描述】:

我在this question 中寻求有关 OpenGL ES 2.0 问题的帮助。 似乎答案对我来说很奇怪。 因此,我决定提出这个问题,希望能够了解发生了什么。

这是一段错误的顶点着色器代码:

// a bunch of uniforms and stuff...
uniform int u_lights_active;

void main()
{
    // some code...

    for ( int i = 0; i < u_lights_active; ++i )
    {
        // do some stuff using u_lights_active
    }

    // some other code...
}

我知道这看起来很奇怪,但这实际上是解释问题/错误行为所需的所有代码。

我的问题是:为什么当我为 u_lights_active 传入一些大于 0 的值时,循环没有被执行? 当我硬编码一些整数时,例如4、不用统一的u_lights_active,它工作得很好。

还有一点,它只出现在 Android 上,而不出现在桌面上。我使用 LibGDX 在两个平台上运行相同的代码。

如果需要更多信息,您可以查看original question,但我不想在这里复制和粘贴所有内容。 我希望这种保持简短的方法受到赞赏,否则我将复制所有内容。

我期待一个解释:)

谢谢!

【问题讨论】:

    标签: android opengl-es-2.0 glsl libgdx vertex-shader


    【解决方案1】:

    基本上 GLSL 指定实现可以限制循环在它们上具有“恒定”边界。这是为了更简单地优化代码以并行运行(不同像素的不同循环计数会很复杂)。我相信在某些实现中,常数甚至必须很小。请注意,规范仅指定“最小”行为,因此某些设备可能支持比规范要求更复杂的循环控制。

    这是一个很好的约束总结: http://www.khronos.org/webgl/public-mailing-list/archives/1012/msg00063.html

    这是 GLSL 规范(请参阅附录 A 的第 4 节): http://www.khronos.org/registry/gles/specs/2.0/GLSL_ES_Specification_1.0.17.pdf

    【讨论】:

      【解决方案2】:

      【讨论】:

        【解决方案3】:

        一种有趣的半答案,或者,我选择的基本问题的解决方案。

        以下调用的函数使用“id”作为着色器脚本块的 ID 传递,“swap”用 [[ThingToReplace, ReplaceWith],] 字符串格式的 2 个组件数组填充。在创建着色器之前调用。

        在javascript中:

        var ReplaceWith = 6;
        
        function replaceinID(id,swaps){
            var thingy = document.getElementById(id);
            for(var i=0;i<swaps.length;i++){
                thingy.innerHTML = thingy.innerHTML.replace(swaps[i][0], swaps[i][1]);
            }
        }
        
        replaceinID("My_Shader",[['ThingToReplace',ReplaceWith],]);
        

        来自 C,这是一种非常类似于宏的方法,因为它模拟了预处理器。

        在 GLSL 中:

        for(int i=0;i<ThingToReplace;i++){
            ;//whatever goes here
        }
        

        或者;

        const int val = ThingToReplace;
        
        for(int i=0;i<val;i++){
            ;//whatever goes here
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-05-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多