使用OpenGL渲染位数组

时间:2016-10-15 14:25:50

标签: c++ arrays opengl

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

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

我怎么能这样做?请

首先想到的是为此开发一个特定的着色器。任何人都可以给出一些暗示吗?

2 个答案:

答案 0 :(得分:6)

你必须为此写一个着色器。首先,您要阻止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;

答案 1 :(得分:-1)

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

std::bitset<8> bits = myuint;

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