C++ 使用glReadPixels时是否可能不钳制数据?

C++ 使用glReadPixels时是否可能不钳制数据?,c++,opengl,C++,Opengl,我正在尝试开发一个代码,我用assimp加载一个3d模型,处理3d坐标和垂直的法线,然后我想把我的纹理检索到CPU 我尝试使用“glReadPixels”检索纹理,但我的数据在[0 1]之间钳制,如中所述 我使用的纹理示例如下: glGenTextures(1, &pos3d); glBindTexture(GL_TEXTURE_2D, pos3d); glViewport(0, 0, width, height); glTexImage2D(GL_TEX

我正在尝试开发一个代码,我用assimp加载一个3d模型,处理3d坐标和垂直的法线,然后我想把我的纹理检索到CPU

我尝试使用“glReadPixels”检索纹理,但我的数据在[0 1]之间钳制,如中所述

我使用的纹理示例如下:

    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]);
glActiveTexture(GL_TEXTURE0);
glEnable(GL_纹理_2D);
glBindTexture(GL_纹理_2D、pos3d);
glReadBuffer(GL_COLOR_ATTACHMENT0);
标准::矢量位置3d(宽度*高度*4);//4因为RGBA*1浮动
glReadPixels(0、0、宽度、高度、GL_RGBA、GL_FLOAT和位置3d[0]);

正如我所说,我的值似乎被限制在0和1之间。那么有没有办法禁用此钳制?

数据被钳制,因为附加到帧缓冲区颜色平面的纹理的内部格式是
GL\u RGBA
(与
GL\u RGBA8
相同)。此格式是无符号规范化定点格式,为每个颜色通道提供8位,其中0表示0.0,所有8位集(255)表示1.0。
这会导致纹理的数据存储中的数据表示被钳制。从附加到frambuffer颜色平面的数据存储中读取数据

通过以下方式指定二维纹理图像时,将纹理的内部格式更改为浮点格式(例如,
GL\u RGBA16F
):


当从缓冲器读取像素时,它们可能被钳制在[0.0,1.0]范围内。 这取决于的设置

见,第535页

读取颜色夹紧通过调用

void ClampColor(枚举目标,枚举钳制)

将目标设置为
夹紧\u读取\u颜色
。如果夹紧为
,则启用读取颜色夹紧;如果夹紧为
,则禁用读取颜色夹紧。[…]
对于浮点RGBA颜色,如果类型为
FLOAT
HALF_FLOAT
,则如果启用读取颜色钳制,则每个组件将钳制为[0,1]

注意,在OpenGL ES中,颜色在任何情况下都是固定的



仅在桌面OpenGL中提供,不钳制颜色

我尝试了那个和GL_RGBA32F,但我仍然只得到钳制值。是否还有其他问题?@user6138759在着色器程序中执行什么操作?对于pos3d纹理,在加载3D模型后,我加载3D坐标,我的第一个着色器仅执行vec4(inPos,1.0)将其转换为RGBA。我在其他着色器的pos3d纹理上使用了sampler2D,但我不修改内容。@user6138759请尝试,它不会改变任何内容。但是,当我使用而不是glReadPixels时,结果不会被钳制。你知道为什么吗?
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA16F, width, height, 0, GL_RGBA, GL_FLOAT, NULL);