gpt4 book ai didi

c++ - 使用 glReadPixels 时是否可以不限制数据?

转载 作者:搜寻专家 更新时间:2023-10-31 02:03:14 29 4
gpt4 key购买 nike

我正在尝试开发一个代码,在其中我使用 assimp 加载 3d 模型,使用 3d 坐标和顶点法线做一些事情,然后我想将我的纹理检索到 CPU。

我尝试使用“glReadPixels”检索纹理,但我的数据被限制在 [0 1] 之间,正如他们在 here 中描述的那样.

我使用的纹理示例:

    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);

然后我用这个检索:

    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 之间。那么有没有办法禁用这种限制?

最佳答案

数据被限制了,因为附加到帧缓冲区颜色平面的纹理的内部格式是 GL_RGBA(与 GL_RGBA8 相同)。此格式是无符号归一化定点格式,为每个颜色 channel 提供 8 位,其中 0 表示 0.0,所有 8 位集 (255) 表示 1.0。
这导致纹理数据存储中的数据表示被限制。 glReadPixels从附加到 frambuffer 颜色平面的数据存储中读取数据。

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

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, width, height, 0, GL_RGBA, GL_FLOAT, NULL);

当从缓冲区中读取像素时,它们可能会被限制在 [0.0, 1.0] 范围内。这取决于 glClampColor 的设置.

参见 OpenGL 4.6 API Core Profile Specification - 18.2.8 Final Conversion , 第 535 页

Read color clamping is controlled by calling

void ClampColor( enum target, enum clamp )

with target set to CLAMP_READ_COLOR. If clamp is TRUE, read color clamping is enabled; if clamp is FALSE, read color clamping is disabled. [...]
For a floating-point RGBA color, if type is FLOAT or HALF_FLOAT, each component is clamped to [0, 1] if read color clamping is enabled.

请注意,在 OpenGL ES 中,颜色在任何情况下都会被限制。


glGetTexImage仅在桌面 OpenGL 中提供,不会限制颜色。

关于c++ - 使用 glReadPixels 时是否可以不限制数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55831002/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com