gpt4 book ai didi

c++ - 如何使用 glReadPixels 读取 float 据

转载 作者:行者123 更新时间:2023-11-30 02:54:45 25 4
gpt4 key购买 nike

几天来,我一直在尝试使用 glReadPixels 读取 float 据。

我的 cpp 代码:

//expanded to whole screen quad via vertex shader
glDrawArrays( GL_TRIANGLES, 0, 3 );

int size = width * height;
GLfloat* pixels = new GLfloat[ size ];
glReadPixels( 0, 0, width, height, GL_RED, GL_FLOAT, pixels );

pixelVector.resize( size );
for ( int i = 0; i < size; i++ ) {
pixelVector[i] = (float) pixels[i];
}

和我的着色器代码:

out float data;

void main()
{
data = 0.02;
}

奇怪的是我得到 0.0196078 作为输出。但是当数据为 0.2 时,一切都很好。如果数据为 0.002,则全为 0。什么可能导致这种情况?

最佳答案

这是因为您将浮点值存储在规范化整数中,然后将其读回并将其转换为浮点值。

除非您使用 framebuffer object ,很有可能您当前的帧缓冲区正是您从 OpenGL 上下文中获得的。这可能使用 GL_RGBA8 作为 image format .这是每个 channel 8 位,无符号和规范化,存储为整数。所以你写的 float 被钳制在[0, 1]范围内,然后通过乘以255和四舍五入转换成整数,然后存储。

当您将其作为 float 读回时,转换是反向完成的:整数值被转换为 float ,除以 255,然后返回。

0.02 * 255 = 5.1 ~= 5

5 / 255 = 0.0196

这就是你得到的结果。

如果你想从你的片段着色器中写入一个浮点值,并且实际上从你读回的内容中获得超过 2-3 位的精度,那么你需要渲染到包含具有合理图像的图像的 FBO格式。例如浮点图像(GL_R16FGL_R32F,因为您只写入一个数据通道)。

关于c++ - 如何使用 glReadPixels 读取 float 据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16874510/

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