【发布时间】:2013-04-21 04:58:03
【问题描述】:
我正在尝试实现延迟着色/照明。为了减少我使用的缓冲区的数量/大小,我想稍后使用深度纹理来重建世界位置。
我通过将像素坐标与投影矩阵的逆矩阵和相机矩阵的逆矩阵相乘来做到这一点。这种工作,但位置有点偏离。这是采样世界位置纹理的绝对差异:
作为参考,这是我在第二遍片段着色器中使用的代码:
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 远。 我知道可能存在精度错误,但这似乎有点太大的错误,离相机太近了。 我错过了什么吗?
【问题讨论】:
-
谢谢!原来我从缓冲区中获取深度后并没有改变我的深度。从来不知道 ndcspace 的深度转换。像素深度=像素深度*2.0-1.0;诀窍:) 编辑:现在我如何将其标记为已回答?
-
你必须自己回答问题!
标签: opengl depth-buffer deferred-rendering