Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opengl 从深度重建世界位置是错误的_Opengl_Depth Buffer_Deferred Rendering - Fatal编程技术网

Opengl 从深度重建世界位置是错误的

Opengl 从深度重建世界位置是错误的,opengl,depth-buffer,deferred-rendering,Opengl,Depth Buffer,Deferred Rendering,我正在尝试实现延迟着色/照明。为了减少我使用的缓冲区的数量/大小,我想稍后使用深度纹理重建世界位置 我通过将像素的坐标乘以投影矩阵的逆和相机矩阵的逆来实现这一点。这种方法行得通,但位置有点不合适。以下是采样世界位置纹理的绝对差异: 作为参考,这是我在第二遍片段着色器中使用的代码: vec2 screenPosition_texture = vec2((gl_FragCoord.x)/WIDTH, (gl_FragCoord.y)/HEIGHT); float pixelDepth = text

我正在尝试实现延迟着色/照明。为了减少我使用的缓冲区的数量/大小,我想稍后使用深度纹理重建世界位置

我通过将像素的坐标乘以投影矩阵的逆和相机矩阵的逆来实现这一点。这种方法行得通,但位置有点不合适。以下是采样世界位置纹理的绝对差异:

作为参考,这是我在第二遍片段着色器中使用的代码:

vec2 screenPosition_texture = vec2((gl_FragCoord.x)/WIDTH, (gl_FragCoord.y)/HEIGHT);
float pixelDepth = texture2D(depth, screenPosition_texture).x;

vec4 worldPosition = pMatInverse*vec4(VertexIn.position, pixelDepth, 1.0);
worldPosition = vec4(worldPosition.xyz/worldPosition.w, 1.0);
//worldPosition /= 1.85;
worldPosition = cMatInverse*worldPosition_byDepth;
如果我取消注释worldPosition/=1.85,则位置重建得更好(在我的几何体/深度值范围上)。我只是在将输出与应该的内容(存储在第三个纹理中)进行比较后,通过胡乱处理得到了这个值

我使用的是0.1近距离,100.0远距离,我的几何体距离大约是15。 我知道可能有精度误差,但这似乎有点太大的误差太接近相机。 我错过了什么吗?

如评论中所述: 我没有将深度值从ndc空间转换为剪辑空间。 我应该加上这一行:

pixelDepth=pixelDepth*2.0-1.0;

可能重复的谢谢!结果是,我从缓冲区中提取深度后,没有转换深度。从不知道从ndcspace进行深度转换。像素深度=像素深度*2.0-1.0;诀窍:)编辑:现在我如何将其标记为已回答?你必须回答自己的问题!