我有一个位数字表示一个图像掩码,存储在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;
Run Code Online (Sandbox Code Playgroud)