繁体   English   中英

着色器代码中的 for 循环使用硬编码数字但不使用统一变量

[英]for-loop in shader code working with hardcoded number but not with uniform variable

我就这个问题中的 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 的值时,循环没有被执行? 当我硬编码一些 integer 例如 4,而不是使用统一的 u_lights_active 时,它工作得很好。

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

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

基本上 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

一种有趣的半答案,和-或,我选择的潜在问题的解决方案。

以下函数使用作为着色器脚本块的 ID 传递的“id”调用,并用 [[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
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM