为了让问题和答案更简单,我会将我的问题从 3d 减少到 2d。
我有一个二维网格,在二维空间中有 X*Y 单元格。它由 X、Y、bBoxMin2d 和 bBoxMax2d 简单定义。
在 GPU(目前在 VBO 中)上,我有 X*Y(无符号 8 位)整数,它定义了单元格的亮度。因此,对于 X=Y=3,如果 VBO 包含 {4, 7, 3, 2, 9, 4, 7, 2, 1},则应使用以下亮度的补丁来渲染网格:
4 7 3
2 9 4
7 2 1
我知道我可以创建另一个包含每个单元中心的世界位置的 VBO,并使用几何着色器创建一个要传递给片段着色器的补丁。
但是,我想提高效率并且不需要第二个 VBO。我的想法是,如果几何着色器的每个实例都有自己的线程索引(类似于 CUDA),它可以仅使用该索引创建单元格的补丁,以及来自例如 UBO 的 bBoxMin2d 和 bBoxMax2d。然后片段着色器会从 VBO 读取颜色,我会很高兴。
但似乎没有几何着色器线程索引。那么,我该如何解决我的问题呢?
请不要告诉我在位置上使用另一个 VBO - 这会将内存需求从 sizeof(uint8_t) = 每个单元 1 字节增加到至少 sizeof(float3) + sizeof(uint8_t) = 13 字节。而且我有很多细胞:|