【发布时间】:2015-01-22 17:53:29
【问题描述】:
我有正确的逆投影矩阵。但似乎没有什么是对的! 重建的位置是否完全变形,z 值是否太小?有人建议吗?
vec3 calculatePosition(vec2 coord, float depth)
{
vec4 clipSpaceLocation;
clipSpaceLocation.x = coord.x * 2.0 - 1.0;
clipSpaceLocation.y = coord.y * 2.0 - 1.0;
clipSpaceLocation.z = depth * 2.0 - 1.0;
clipSpaceLocation.w = 1.0;
vec4 homogenousPosition = uProjectionInverse * clipSpaceLocation;
return homogenousPosition.xyz / homogenousPosition.w;
}
z 值约为 -0,001;为什么会这样?
坐标和深度是:
vec2 coord = vec2(gl_FragCoord.x / width, gl_FragCoord.y / height);
float currentDepth = texture(depthBuffer, coord).r;
我必须为大学实施 SSAO,并且我使用 Eclipse 和 Java 以及 lwjgl-plugin。 请我需要帮助。我不到一星期。
编辑: 我现在已经尝试过了……但仍然没有被 lenearized:
float camera_space_z_from_depth(sampler2D depthbuffer, vec2 uv) {
float depth = texture(depthbuffer, uv).x;
return (2 * uNearPlane) / (uFarPlane + uNearPlane - depth * (uFarPlane - uNearPlane));
}
vec3 calculatePosition(vec2 coord, float depth)
{
vec4 clipSpaceLocation;
clipSpaceLocation.x = coord.x * 2.0 - 1.0;
clipSpaceLocation.y = coord.y * 2.0 - 1.0;
clipSpaceLocation.z = depth * 2.0 - 1.0;
clipSpaceLocation.w = 1.0;
vec4 homogenousPosition = uProjectionInverse * clipSpaceLocation;
return homogenousPosition.xyz / homogenousPosition.w;
}
vec3 getPosition(vec2 coord){
float currentDepth = camera_space_z_from_depth(depthBuffer,coord);
vec3 position = calculatePosition(coord, currentDepth);
return position;
}
【问题讨论】:
-
到目前为止,原始代码(不是编辑)看起来还不错。假设您的深度渲染通道仅使用正常的 z 坐标,则编辑中的线性化并没有真正意义。在我看来,
uProjectionInverse或 - 这是我的第一个猜测 - 深度纹理(或深度渲染本身)存在问题。您的投影0.001的near值是否有任何机会?如果是这样,看起来您尝试取消投影的深度值在所有点上都只是 0。
标签: opengl shader lwjgl depth zbuffer