Opengl 布尔纹理

Opengl 布尔纹理,opengl,graphics,textures,shader,Opengl,Graphics,Textures,Shader,我需要一种从openGL纹理中提取布尔值的有效方法。布尔数组将是一个巨大的3D数组,我不能浪费空间,这意味着我不能将布尔编码为每个1字节 现在我的解决方案是把它编码成一个由整数组成的一维缓冲纹理。使用着色器中的逐位操作,我可以获取布尔值 我的解决方案存在两个影响性能的问题。我为布尔值计算的索引自然是一个3d坐标,这意味着如果我想提高效率并利用硬件,我应该使用3d纹理来减少3d->1D索引转换的性能损失(我的想法正确吗?) 另一个问题,没有上面的问题那么糟糕,是从整数提取中解码布尔值 我注意到,如

我需要一种从openGL纹理中提取布尔值的有效方法。布尔数组将是一个巨大的3D数组,我不能浪费空间,这意味着我不能将布尔编码为每个1字节

现在我的解决方案是把它编码成一个由整数组成的一维缓冲纹理。使用着色器中的逐位操作,我可以获取布尔值

我的解决方案存在两个影响性能的问题。我为布尔值计算的索引自然是一个3d坐标,这意味着如果我想提高效率并利用硬件,我应该使用3d纹理来减少3d->1D索引转换的性能损失(我的想法正确吗?)

另一个问题,没有上面的问题那么糟糕,是从整数提取中解码布尔值

我注意到,如果我在3D纹理中编码布尔值,我将不得不进行不同但同样昂贵的3D->1D索引转换,因为在整数中存储位无论如何都是1D。基本上,它就像每个texel存储一个布尔立方体,你用1D坐标索引它。因此,我似乎没有获得任何性能,因为还需要从3D纹理解码东西

我目前的解决方案是最佳选择还是有更好的方案?我想知道这里是否有openGL支持的压缩图像格式可用

我应该使用3D纹理来减少3D->1D索引转换的性能损失(我这样想对吗?)

事实上,如果你很聪明的话,这种转换可以非常有效的完成。如果你的纹理尺寸是二的幂,它可以归结为位偏移和掩蔽

我注意到,如果我在3D纹理中对布尔值进行编码,我将不得不进行不同的3D->1D索引转换,因为在整数中存储位无论如何都是1D。基本上,它就像每个texel存储一个布尔立方体,你用1D坐标索引它。因此,我似乎没有获得任何性能,因为还需要从3D纹理解码东西

这就是我的建议。使用位操作实现转换非常简单。你可以往每个方向走两个单位。2→ 二元的。你有三个维度,所以正好是3位。因此,要在8位立方体中找到特定的位,只需移动x、y和z子纹理位置(分别移动0、1和2到更高的位),即

如果texcoord是[0;1]范围内的浮点vec3,则首先必须将其转换为整数坐标

我想知道这里是否有openGL支持的压缩图像格式可用


不,因为有些是基于有损压缩的。

你的意思是3D索引。在什么范围内?您还可以使用mean 1D纹理来存储布尔值。这是否意味着您了解硬件中纹理大小的限制?例如,如果纹理的大小受4096 texel的限制,则最多可以使用131072个布尔值。
subbit = (x & 1) | ((y & 1) << 1) | ((z & 1) << 2);
ivec3 sub_texel = ivec3(texcoord.x  & 1, texcoord.y  & 1,  texcoord.z & 1);
ivec3     texel = ivec3(texcoord.x >> 1, texcoord.y >> 1, texcoord.z >> 1);