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

标签 android opengl-es libgdx glsl opengl-es-2.0

我在 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但我不想在这里复制和粘贴所有内容。 我希望这种保持简短的方法受到赞赏,否则我会复制所有内容。

最佳答案

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

关于android - 着色器代码中的 for 循环使用硬编码数字但不使用统一变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18925615/

相关文章:

java - 如何将 LocalBroadcast 从 BroadcastReceiver 发送到正在运行的服务?

Android:如何在 root 设备上执行 chmod

android - 以编程方式在android中进行选项卡布局

iphone - EAGL : What does it stand for exactly?

opengl-es - Spritekit 和 OpenGL : smooth smoke trail

java - 使用 Eclipse 和 Libgdx 的可执行 Jar

libgdx - 数学或 MathUtils - Libgdx

android - 使用 ShareActionProvider-v7 的 ActionBar 上的 ShareAction 图标大小问题

android - GLSurfaceView : Do I need to to call onPause/onResume?

java - 如何在Eclipse跨平台Libgdx项目中更改android Activity