首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当使用glReadPixels时,不可能不夹紧数据吗?

当使用glReadPixels时,不可能不夹紧数据吗?
EN

Stack Overflow用户
提问于 2019-04-24 13:16:43
回答 1查看 337关注 0票数 3

我正在开发一个代码,我用assimp加载一个3d模型,用3d坐标和法线填充,然后我想要将我的纹理检索到CPU。

我尝试使用"glReadPixels“来检索纹理,但是我的数据被夹在0 1之间,就像它们在这里中描述的那样。

我使用的纹理示例:

代码语言:javascript
运行
复制
    glGenTextures(1, &pos3d);
    glBindTexture(GL_TEXTURE_2D, pos3d);
    glViewport(0, 0, width, height);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_FLOAT, NULL);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + gpos3dLayout, GL_TEXTURE_2D, pos3d, 0);
    glBindTexture(GL_TEXTURE_2D, 0);

然后我用这个检索:

代码语言:javascript
运行
复制
    glActiveTexture(GL_TEXTURE0);
    glEnable(GL_TEXTURE_2D);
    glBindTexture(GL_TEXTURE_2D, pos3d);
    glReadBuffer(GL_COLOR_ATTACHMENT0);
    std::vector<GLfloat> positions3d(width * height * 4); // 4 because of RGBA * 1 float
    glReadPixels(0, 0, width, height, GL_RGBA, GL_FLOAT, &positions3d[0]);

正如我所说的,我的值似乎被限制在0到1之间。那么有什么方法可以禁用这个夹紧吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-24 13:32:36

数据被夹紧,因为附加到帧缓冲区的颜色平面上的纹理的内部格式是GL_RGBA (与GL_RGBA8相同)。这种格式是一种无符号规范化定点格式,为每个彩色通道提供8位,其中0表示0.0,所有8位集(255)代表1.0。

这导致在纹理的数据存储中数据的表示被夹紧。glReadPixels从连接到帧缓冲区颜色平面的数据存储区读取数据。

在使用GL_RGBA16F指定二维纹理图像时,将纹理的内部格式更改为浮点格式(例如glTexImage2D )

代码语言:javascript
运行
复制
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, width, height, 0, GL_RGBA, GL_FLOAT, NULL);

当从缓冲区读取像素时,它们可能被夹紧到0.0,1.0范围内。这取决于glClampColor的设置。

OpenGL 4.6API核心文件规范- 18.2.8最终转换,第535页

读取颜色夹紧由调用控制。 void ClampColor( enum target, enum clamp ) 目标设置为CLAMP_READ_COLOR。如果钳位为TRUE,则启用读色夹紧;如果钳位为FALSE,则禁用读色夹持。..。 对于浮点的RGBA颜色,如果类型为FLOATHALF_FLOAT,则每个组件被夹紧为0,如果启用读颜色夹紧,则为1。

注意,在OpenGL ES中,颜色在任何情况下都是夹紧的。

glGetTexImage仅在桌面OpenGL中提供,不夹紧颜色。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55831002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档