GLSL 1.10 - 着色器的 25 个输入布尔值
GLSL 1.10 - 25 input booleans for shader
我目前正在编写一个着色器 (Java/LibGDX/OpenGL ES),它需要输入 25 个布尔值才能实现所需的功能。由于着色器应该在几乎每个 Android 设备上工作,我仅限于 OpenGL ES 2.0(GLSL 版本 1.10),这让事情变得非常困难。 OpenGL ES 3.0 需要 Android 4.3+,而 OpenGL ES 2.0 可从 Android 2.2.
获得
起初我试图通过使用单个整数来减少提供给GPU的数据量,该整数通过Java由位运算填充。然后着色器在位操作的帮助下检查所需的标志 ("booleans")。编码完成后,我意识到 GLSL 1.3 及更高版本支持位操作,因此我不能将它们用于我的目的。
第二次尝试使用长度为 25 的数组。这会增加需要加载到 GPU 上的数据量,但效果不佳。我收到以下错误:
Shader compilation failed!
From Vertex Shader:
Error: varying variables do not fit in 16 vectors.
From Fragment Shader:
Error: varying variables do not fit in 16 vectors.
我无法确切地知道这意味着什么,但我认为我仅限于大小 <= 16 的数组。
GLSL 1.2 提供了多维数组,因此 array[5][5]
也不可能。
当然我可以使用 25 套制服,但这似乎是一个很奇怪的解决方案。
TL;DR
如果我仅限于 GLSL 1.10 和 OpenGL ES 2.0,将数据(25 个布尔值/标志)发送到片段着色器的最佳方式是什么?
您可以保留将它们编码为整数的方法,但不要使用按位运算,只需将整数除以您要检查的位,然后 modulo 2.
例如假设我们的位模式是 101101...
Bit values: 32 16 8 4 2 1
Bits: 1 0 1 1 0 1
^
要检查是否设置了 8 位,只需除以 8 然后 mod 结果除以 2。
101101 = 十进制 45
45 / 8 = 5
5mod2=1,就是答案!
对 16 位做同样的事情会得到 (45 / 16) mod 2 = 0
简单!
我目前正在编写一个着色器 (Java/LibGDX/OpenGL ES),它需要输入 25 个布尔值才能实现所需的功能。由于着色器应该在几乎每个 Android 设备上工作,我仅限于 OpenGL ES 2.0(GLSL 版本 1.10),这让事情变得非常困难。 OpenGL ES 3.0 需要 Android 4.3+,而 OpenGL ES 2.0 可从 Android 2.2.
获得起初我试图通过使用单个整数来减少提供给GPU的数据量,该整数通过Java由位运算填充。然后着色器在位操作的帮助下检查所需的标志 ("booleans")。编码完成后,我意识到 GLSL 1.3 及更高版本支持位操作,因此我不能将它们用于我的目的。
第二次尝试使用长度为 25 的数组。这会增加需要加载到 GPU 上的数据量,但效果不佳。我收到以下错误:
Shader compilation failed!
From Vertex Shader:
Error: varying variables do not fit in 16 vectors.
From Fragment Shader:
Error: varying variables do not fit in 16 vectors.
我无法确切地知道这意味着什么,但我认为我仅限于大小 <= 16 的数组。
GLSL 1.2 提供了多维数组,因此 array[5][5]
也不可能。
当然我可以使用 25 套制服,但这似乎是一个很奇怪的解决方案。
TL;DR
如果我仅限于 GLSL 1.10 和 OpenGL ES 2.0,将数据(25 个布尔值/标志)发送到片段着色器的最佳方式是什么?
您可以保留将它们编码为整数的方法,但不要使用按位运算,只需将整数除以您要检查的位,然后 modulo 2.
例如假设我们的位模式是 101101...
Bit values: 32 16 8 4 2 1
Bits: 1 0 1 1 0 1
^
要检查是否设置了 8 位,只需除以 8 然后 mod 结果除以 2。
101101 = 十进制 45 45 / 8 = 5 5mod2=1,就是答案!
对 16 位做同样的事情会得到 (45 / 16) mod 2 = 0
简单!