我试图实现使用OpenGL和GLSL八叉树遍历方案,并希望保持数据的纹理。 虽然有格式一个大的选择要使用的纹理数据(浮点和不同大小的整数)的我有一些麻烦搞清楚,如果有一种方法,以具有对位更精确的控制,因此实现更高的效率和紧凑的存储。 这可能是一个普遍的问题,不仅适用于OpenGL和GLSL。
作为一个简单的玩具例子,让我们说,我有一个包含16位整数纹元。 我想每1位的2个布尔值,一个10位整数值,然后在4位的整数值编码为纹理像素此。 是否有创建纹理时,该编码,然后用GLSL着色器采样纹理时解码这些部件的技术?
编辑:看来我其实找位操作技术。 因为他们似乎得到支持,我以后应该多一些研发罚款。
整数和位操作GLSL着色器,因为里面的OpenGL 3的支持(这样出现在DX10一流的硬件,如果告诉你更多)。 所以,你可以做你自己的着色器内该位mainulation。
但随着整数工作是一回事,把它们带出质感是另一回事。 该标准的OpenGL纹理格式(你可能被用来)可直接存储浮标(如GL_R16F
)或归一化的固定点值(例如GL_R16
,有效整数的门外汉;)),但由它们读取(使用texture
, texelFetch
或无论)将净你漂浮值在着色器,从中可以不是容易或可靠地推断出内部存储的整数的原始位模式。
所以,你真的需要使用什么是整数的质感,这需要的OpenGL 3,太(或者也许是GL_EXT_texture_integer
扩展,但硬件配套,将可能有GL3反正)。 因此,对于你的纹理,你需要使用一个实际的整数内部格式,例如像GL_R16UI
在constrast(对于1件16位无符号整数),通常的定点格式(例如像GL_R16
的标准化[0,1] -颜色16位精度)。
然后在着色器,你需要使用一个整数取样型,例如像usampler2D
一个无符号整数2D纹理(以及类似isampler...
的签署变种)实际上从你得到一个无符号整数texture
或texelFetch
电话:
中央处理器:
glTexImage2D(GL_TEXTURE_2D, 0, GL_R16UI, ..., GL_R, GL_UNSIGNED_SHORT, data);
GPU:
uniform usampler2D tex;
...
uint value = texture(tex, ...).r;
bool b1 = (value&0x8000) == 0x8000,
b2 = (value&0x4000) == 0x4000;
uint i1 = (value>>4) & 0x3FF,
i2 = value & 0xF;