用OpenGL渲染位数组

Rendering a bit array with OpenGL

本文关键字:数组 OpenGL      更新时间:2023-10-16

我有一个表示图像掩码的位数组,存储在uint8_t[]容器数组中,按行第一顺序。因此,对于每个字节,我有8像素。

现在,我需要用OpenGL(>= 3.0)渲染它。正位绘制为白色像素,负位绘制为黑色像素。

我怎么能这么做?请

我想到的第一个想法是为此开发一个特定的着色器。有人能给点提示吗?

你一定要为此写一个着色器。首先,你要防止OpenGL实现将B/W位图的整数位重新解释为一定范围内的数字,并将它们映射到[0…1]浮点数。这意味着你必须将你的比特加载成整数图像格式。由于您的图像格式是二进制像素的八位组(字节是一个相当不具体的术语,可以指任何数量的位,尽管通常是8位),因此单通道格式8位格式似乎是正确的选择。OpenGL-3的绰号是GL_R8UI。请记住,纹理的"宽度"将是你的黑白图像实际宽度的1/8。对于非规范化访问,您必须使用usampler(用于无符号)或isampler(用于有符号)(感谢@derhass注意到这里写得不正确)。

要访问单个位,使用通常的位操作符。由于您不希望您的位被过滤,因此必须使用texel fetch访问。因此,要访问位于整数位置x,y的二进制像素,将使用以下命令:

uniform usampler2D tex;
uint shift = x % 8;
uint mask = 1 << shift;
uint octet = texelFetch(tex, ivec2(x/8,y)).r;
value = (octet & mask) >> shift;

最好的解决方案是使用着色器,你也可以像这样破解:

std::bitset<8> bits = myuint;

然后使用bits.at(position)获取单个位的值,最后进行简单的点绘制。