在WebGL / GLES2中:是,仅允许使用常量。但是,如果您的代码可以(由您自己或由编译器)展开,则它将视为一个常量,并且您有一种解决方法。例如,
问题:
uniform int i;
...
int a[4];
a[2] = 42; // ? a constant index, no worries
a[i] = 42; // ? dynamic indexing is not allowed
Run Code Online (Sandbox Code Playgroud)
解决方法:
if (i == 0) a[0] = 42;
if (i == 1) a[1] = 42;
if (i == 2) a[2] = 42;
if (i == 3) a[3] = 42;
Run Code Online (Sandbox Code Playgroud)
好的,那很痛苦。让编译器执行此操作:
for (int k = 0; k < 4; ++k)
if (i == k)
a[k] = 42; // ? k is a constant because the loop is bounded by one
Run Code Online (Sandbox Code Playgroud)
有时嵌套分支可以使事情变得更快(在这种情况下并不总是且不一定,这只是一个示例):
if (i == 0)
a[0] = 42;
else
{
if (i == 1)
a[1] = 42;
else
{
if (i == 2)
a[2] = 42;
else
{
if (i == 3)
a[3] = 42;
}
}
}
// or equivalently...
for (int k = 0; k <= i && k < 4; ++k)
if (i == k)
a[k] = 42;
Run Code Online (Sandbox Code Playgroud)
对于具有动态索引的桌面GL,这仍然非常有用。尤其是在动态索引数组的情况下,展开循环并使用常量可以将值放置在寄存器中,从而可以大大提高速度。另一个要注意的是,如果该int[4]数组是动态索引的,则将其放置在本地内存中,每个元素填充为16个字节(即ivec4[4]),这也可以解决循环展开问题。
| 归档时间: |
|
| 查看次数: |
1714 次 |
| 最近记录: |