OpenGL 从 4*float 格式上传像素数据(C++)

Posted

技术标签:

【中文标题】OpenGL 从 4*float 格式上传像素数据(C++)【英文标题】:OpenGL uploading pixel data from 4*float format (C++) 【发布时间】:2015-04-06 06:23:00 【问题描述】:

我有一个std::container 格式的图像数据:

struct C

    float r;
    float g;
    float b;
    float a;

看起来像:

std::vector<C> colours(width*height);

其中宽度和高度是我的图像的大小。

现在,我想将其推送到 OpenGL 中的纹理中。

glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X,0,GL_RGBA8,width,height,0,GL_RGBA,GL_FLOAT,colours.data());

(总共有 6 个,立方体贴图的每一侧一个。宽度和高度也与立方体贴图的要求相同)。

但我得到了黑色纹理。 GLIntercept 没有给我任何问题的迹象。

所以,在查看https://www.opengl.org/sdk/docs/man/docbook4/xhtml/glTexImage2D.xml 之后,我相信我应该这样称呼它:

glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X,0,GL_RGBA8,width,height,0,GL_RGBA32F,GL_FLOAT,colours.data());

变化是我表示我的像素数据是 32 位浮点数,每个像素有 4 个。

但是,这也给了我一个黑色纹理,以及 GLIntercept 告诉我这个调用正在生成一个GL_INVALID_ENUM

查看相同的文档告诉我,glTexImage2D 在某些情况下会导致GL_INVALID_ENUM,我没有遇到过。

基本上,我只想将我的 4 个浮动容器放入纹理中。

【问题讨论】:

【参考方案1】:

我觉得你应该试试

glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X, 0, GL_RGBA32F,
             width, height, 0, GL_RGBA, GL_FLOAT, colours.data());

您似乎以错误的方式使用了internalformatformat

【讨论】:

不,不是这样。不过你是对的,我对internalFormatformat 感到困惑。但这并没有解决问题。据我了解,internalformat 无关紧要,因为 OpenGL 会将我发送的任何内容转换为该格式。 GL_RGBAformat 表示将有 4 个组件,type 表示每个组件将是一个 GL_FLOAT。仍然不确定我做错了什么...... 其实internalformat定义了OGL内部如何存储纹素,format定义了输入纹素数据的格式。顺便说一句,OGL ES 2.0 中的internalformat 必须等于format,所以也许您还应该尝试将GL_RGBA32F 用于internalformatformat 文档清楚地说明了选项是什么,这不是常规 OpenGL 的选项之一。我相信我已经找到了答案,但我现在正在调试。我认为问题还处于早期阶段;与上述无关。

以上是关于OpenGL 从 4*float 格式上传像素数据(C++)的主要内容,如果未能解决你的问题,请参考以下文章

试图理解 OpenGL 中的像素和 GL_POINTS

OpenGL学习笔记4:纹理

OpenGL纹理内存布局和查找速度

Win32 像素格式描述符学习

OpenGL 如何解析像素格式基于整数的多采样 FBO 附加颜色缓冲区?

通过 glTexSubImage3d 上传纹理数据时,像素传输格式可以改变吗?