我需要一些快速的建议。
我想在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位单元格状态。