gpt4 book ai didi

c++ - 从片段着色器返回 float

转载 作者:行者123 更新时间:2023-11-28 05:34:45 26 4
gpt4 key购买 nike

对于应用程序,我需要创建网格的深度图像。基本上我想要一个图像,其中每个像素表示相机中心和交点之间的距离。我选择用 OpenGL 来完成这个任务,这样大部分的计算都可以在 GPU 而不是 CPU 上完成。

这是我的顶点着色器代码。它计算交点的真实世界坐标并将坐标存储在 varying vec4 中,以便我可以在片段着色器中访问它。

varying vec4 verpos;
void main(void)
{
gl_Position = ftransform();
verpos = gl_ModelViewMatrix*gl_Vertex;
}

这里是片段着色器的代码。在片段着色器中,我使用这些坐标来使用毕达哥拉斯计算到原点 (0,0,0) 的欧里得距离。为了访问 CPU 上的计算值,我的计划是使用 gl_FragColor 将距离存储为颜色,并使用 glReadPixels(0, 0, width, height, GL_RED, GL_FLOAT, &distances[0]);

varying vec4 verpos;
void main()
{
float x = verpos.x;
float y = verpos.y;
float z = verpos.z;

float depth = sqrt(x*x + y*y + z*z) / 5000.0;
gl_FragColor = vec4(depth, depth, depth, 1.0);
}

问题是,我收到的结果精度仅为 0.003921569 (=1/255)。结果值包含例如 0.364705890、0.364705890、0.364705890、0.364705890、0.368627459、0.368627459、0.368627459。一行中的大多数值完全相同,然后有 1/255 的跳跃。因此,在 gl_FragColorglReadPixels 之间的某处,OpenGL 将 float 转换为 8 位,然后再将它们转换回 float 。

如何在不损失精度的情况下将距离值提取为 float ?

最佳答案

将 R32F 或 R16F 纹理附加到 FBO并呈现给它。然后像使用 glReadPixels() 一样使用 glGetTexImage2D() 提取像素。

关于c++ - 从片段着色器返回 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38571176/

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