RGBA 整数值到 OpenGL 纹理
Posted
技术标签:
【中文标题】RGBA 整数值到 OpenGL 纹理【英文标题】:RGBA integer values to OpenGL Texture 【发布时间】:2012-04-02 16:08:35 【问题描述】:我正在用 C++ 编写一个光线投射器,它将其结果输出到常规图像文件。现在,我想将内部 RGBA 表示(4 个整数)渲染到 GLUT 提供的 OpenGL 窗口。
我已经知道我必须使用 glTexImage2D 来生成一个纹理,将该纹理分配给一个四边形,然后将这个四边形渲染到相机的正前方。
http://www.opengl.org/sdk/docs/man/xhtml/glTexImage2D.xml
我遇到的问题是我不知道我应该如何将数据呈现给 glTexImage2D 函数:如何构造这个包含我的数据的 gluByte 数据块,来自一个简单的 4 整数 RGBA 表示?
【问题讨论】:
为了记录,我最终这样做了:unsigned char* data = (data goes here in array);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,width,height,0,GL_RGBA,GL_UNSIGNED_BYTE,data);
【参考方案1】:
如何存储数据或多或少取决于您自己。最后三个参数为glTexImage2D
(以及附加参数)describe how your data is formatted。关于如何存储数据存在一些限制(除了每像素 4 字节对齐之外,您不能有太多填充,并且组件必须相邻),但有很多可用的变化。
作为一个宽 x 高 x 4 大小的数组,每个组件都有一个无符号整数:RGBARGBARGBA...?
这是一种方法,但不是唯一的方法。
【讨论】:
【参考方案2】:将您的 0-(2^32-1) 范围转换为 0-(2^8-1)。
或使用GL_UNSIGNED_INT
for format
。
【讨论】:
【参考方案3】:数据块只是指向 RGBA 表示的指针。你会想打电话给glTexImage2D(GL_TEXTURE_2D, 0, 4, width, height, 0, GL_RGBA, GL_UNSIGNED_INT, dataBuffer);
。纹理中的一条线必须具有宽度 * sizeof(GLuint) 字节才能正常工作。
【讨论】:
那我该如何存储我的数据呢?作为一个宽 x 高 x 4 大小的数组,每个组件都有一个无符号整数:RGBARGBARGBA... ? 没错。请注意,您使用的 OpenGL 驱动程序可能会将无符号整数转换为例如上传前内部的无符号字符。为了节省内存,您可能仍需要手动将 uint 转换为 chars。以上是关于RGBA 整数值到 OpenGL 纹理的主要内容,如果未能解决你的问题,请参考以下文章
OpenGL:当尺寸不能被 4 整除时,灰度纹理数据布局不匹配
使用 GStreamer 和 NVENC 编码 OpenGL 纹理?