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 整除时,灰度纹理数据布局不匹配

纹理中的 OpenGL 片段着色器

使用 GStreamer 和 NVENC 编码 OpenGL 纹理?

如何在 1D 缓冲区中生成 2D 纹理并将其加载到 OpenGL 中?

OpenGL入门05.纹理贴图

使用单通道纹理(OpenGL 2)?