我正在尝试实现延迟着色/照明。为了减少我使用的缓冲区的数量/大小,我想使用深度纹理稍后重建世界位置。
我是通过将像素的坐标与投影矩阵的倒数和相机矩阵的倒数相乘来实现的。这种作品,但位置有点偏。这是采样世界位置纹理的绝对差异:
作为参考,这是我在第二个传递片段着色器中使用的代码:
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左右。 我知道可能存在精度错误,但这似乎有点太大了,错误太靠近相机。 我在这里错过了什么吗?
答案 0 :(得分:1)
如评论中所述: 我没有将深度值从ndc空间转换为剪辑空间。 我应该添加这一行:
pixelDepth=pixelDepth*2.0-1.0;