我有正确的逆投影矩阵。但似乎没有什么不对劲!重建的位置完全变形,而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插件一起使用。拜托我需要帮助。我只有不到一周的时间。
编辑:我现在已经试过了...但仍然没有变宽:
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;
}
我想你需要线性化你的深度值,就像这里所说的:
https://www.opengl.org/wiki/Compute_eye_space_from_window_space
试试这个。
float camera_space_z_from_depth(sampler2D depthbuffer, vec2 uv) {
const float depth = texture(depthbuffer, uv).x;
return ( camera_near / (camera_far - depth * (camera_far - camera_near)) ) * camera_far;
}
编辑:
试试看。变量含义应该是不言自明的(不需要线性化):)
vec3 GetPosition(vec2 fragmentCoordinates, float depth)
{
vec3 normalizedDeviceCoordinatesPosition;
normalizedDeviceCoordinatesPosition.xy = (2.0 * fragmentCoordinates) / uScreenSize - 1;
normalizedDeviceCoordinatesPosition.z = 2.0 * depth - 1.0;
vec4 clipSpacePosition;
clipSpacePosition.w = uProjection[3][2] / (normalizedDeviceCoordinatesPosition.z - (uProjection[2][2] / uProjection[2][3]));
clipSpacePosition.xyz = normalizedDeviceCoordinatesPosition * clipSpacePosition.w;
vec4 eyePosition = uInverseProjection * clipSpacePosition;
return eyePosition.xyz / eyePosition.w;
}
注意:到目前为止,我假设您的深度纹理是GL_DEPTH_COMPONENT,并作为GL_DEPTH_ATTACHMENT附加到帧缓冲。
即:
glBindTexture(GL_TEXTURE_2D, mDepthTextureId);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, mrScreenWidth, mrScreenHeight, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, 0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE);
glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, mDepthTextureId, 0);