gpt4 book ai didi

arrays - 我可以在 WebGL 的 GLSL 中将什么用作数组索引?

转载 作者:行者123 更新时间:2023-12-03 15:58:59 25 4
gpt4 key购买 nike

是否只允许使用常量,或者我可以将其用于循环索引或任何其他动态值?

最佳答案

WebGL / GLES2 : 是的,只允许使用常量。但是,如果您的代码可以展开(由您自己或由编译器),那么它会被视为一个常量,并且您有一个解决方法。例如,

问题:

uniform int i;
...
int a[4];
a[2] = 42; // ✓ a constant index, no worries
a[i] = 42; // ✗ dynamic indexing is not allowed

解决方法:
if (i == 0) a[0] = 42;
if (i == 1) a[1] = 42;
if (i == 2) a[2] = 42;
if (i == 3) a[3] = 42;

好吧,这很痛苦。让编译器这样做:
for (int k = 0; k < 4; ++k)
if (i == k)
a[k] = 42; // ✓ k is a constant because the loop is bounded by one

有时嵌套分支可以使事情变得更快(在这种情况下并不总是也不一定,这只是一个例子):
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;

对于确实有动态索引的桌面 GL,这仍然非常有用。特别是在动态索引数组的情况下,展开循环和使用常量允许将值放在寄存器中,并且可以大大提高速度。作为另一个说明,如果 int[4]数组是动态索引的,它被放置到本地内存中,每个元素是 padded to 16 bytes (即 ivec4[4] ),循环展开也修复了。

关于arrays - 我可以在 WebGL 的 GLSL 中将什么用作数组索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30585265/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com