用OpenGL渲染位数组
Rendering a bit array with OpenGL
我有一个表示图像掩码的位数组,存储在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)获取单个位的值,最后进行简单的点绘制。
相关文章:
- 在 glsl opengl 中将嵌套结构数组作为统一传递
- 如果我使用malloc()而不是堆栈数组,OpenGL不会渲染对象
- OpenGL 顶点数组对象与 tinyobjloader
- 假设传递给 OpenGL 的结构数组的内存布局存在潜在错误
- OpenGL:使用指向静态数据的指针数组传递缓冲区数据
- 如何从OpenGL 4.5中的单个Cube地图纹理中创建Cube地图数组纹理
- 如何使用OpenImageio将RGB值存储在数组中?(使用C ,OpenGL)
- 将 OpenGL 颜色附件存储在 constexpr GLenum 数组中
- opengl:两个不同的矢量可以绑定到同一个顶点数组对象吗
- 正确初始化 OpenGL 的结构数组
- 将opengl纹理保存到Byte数组中
- OpenGL 批处理:为什么我的绘制调用超出了数组缓冲区边界
- 将坐标数组传递给主数组(openGL,C++)
- 在 OpenGL 中重新组织图像/图片数组以适应 2 种纹理大小的幂
- openGL drawElements - 一个额外的三角形,使用索引数组
- Opengl 数组纹理,适用于原始数据,但不适用于图像数据
- 在 OpenGL 中呈现三角形结构引用数组
- OpenGL:两个顶点数组 + 两个索引数组
- OpenGL与C++:将类数组传递给glTexImage2d时出现vtable问题
- 纹理每个多边形在顶点数组- OpenGL