我正在尝试实现延迟着色/照明。为了减少我使用的缓冲区数量/大小,我希望使用深度纹理稍后重构世界位置。
为此,我将像素坐标乘以投影矩阵和相机矩阵的逆矩阵。虽然这种方法有一定效果,但是位置会有一点偏差。下面是采样的世界位置纹理的绝对差异:
参考文献,这是我在第二次通过片段着色器中使用的代码:
如果我取消注释worldPosition /= 1.85,位置会得到更好的重构(在我的几何体/深度值范围内)。在将我的输出与存储在第三个纹理中的输出进行比较后,我通过调整得到了这个值。
我使用了0.1近点和100.0远点,我的几何体约为15。我知道可能存在精度误差,但这似乎是一个离相机太近的错误。我有什么遗漏吗?
为此,我将像素坐标乘以投影矩阵和相机矩阵的逆矩阵。虽然这种方法有一定效果,但是位置会有一点偏差。下面是采样的世界位置纹理的绝对差异:
参考文献,这是我在第二次通过片段着色器中使用的代码:
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。我知道可能存在精度误差,但这似乎是一个离相机太近的错误。我有什么遗漏吗?