3

我需要一些快速的建议。

我想在 GPU 上模拟一个元胞自动机(来自A Simple, Efficient Method for Realistic Animation of Clouds )。但是,我仅限于不支持任何位运算的 OpenGL ES 2.0 着色器(在 WebGL 中)。

由于此元胞自动机中的每个单元都代表一个布尔值,因此每个单元存储 1 位将是理想的。那么在 OpenGL 的纹理格式中表示这些数据的最有效方法是什么?有什么技巧还是我应该坚持使用直接的 RGBA 纹理?

编辑:这是我到目前为止的想法......

目前我正在考虑使用普通的 GL_RGBA8、GL_RGBA4 或 GL_RGB5_A1:

  • 可能我可以选择 GL_RGBA8,并尝试使用浮点运算提取原始位。例如x*255.0,给出一个近似整数值。但是,提取单个位有点麻烦(即除以 2 并四舍五入几次)。我也对精度问题保持警惕。

  • 如果我选择 GL_RGBA4,我可以为每个组件存储 1.0 或 0.0,但我也可以尝试与之前使用 GL_RGBA8 相同的技巧。在这种情况下,它只是x*15.0. 不确定它是否会更快或看不到,因为提取位的操作应该更少,但每次纹理读取的信息更少。

  • 使用 GL_RGB5_A1 我可以尝试看看是否可以将我的单元格与一些附加信息打包在一起,例如每个体素的颜色,其中 alpha 通道存储 1 位单元格状态。

4

1 回答 1

1

创建第二个纹理并将其用作查找表。在纹理的每个 256x256 块中,您可以表示一个布尔运算,其中输入由行/列表示,输出是纹理值。实际上,在每个 RGBA 纹理中,您可以表示每个 256x256 区域的四个布尔运算。不过要注意纹理压缩和 MIP 贴图!

于 2010-10-20T18:31:46.560 回答