2015-01-22 3 views
1

У меня есть правильная обратная матрица проекции. Но ничто не кажется правильным! Реконструированное положение полностью деформировано, а значение z очень мало? Любое предложение?LWGL // восстановить положение в фрагментном шейдере

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-плагин. Пожалуйста, мне нужна помощь. У меня меньше недели.

EDIT: Я попытался это сейчас ... но до сих пор не 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; 
} 
+0

Исходный код (не редактировать) выглядит нормально до сих пор. Линеаризация в редактировании на самом деле не имеет смысла, предполагая, что ваш обработчик глубины просто использовал обычную z-координату. Для меня это похоже на проблему с 'uProjectionInverse' или - и это было бы моим первым предположением - текстурой глубины (или самой глубиной rende rpass). Действительно ли значение 'near' для вашей проекции' 0,001'? Если это так, похоже, что значение глубины, которое вы пытаетесь выполнить unproject, равно 0 во всех точках. – derhass

ответ

0

Я полагаю, что вам нужно линеаризуем ваше значение глубины, как сказано здесь:

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; 
} 

EDIT:

Попробуйте это. Переменное значение должно быть само за себя (нет необходимости в линеаризацию) :)

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); 
+0

OK спасибо, я попробую =) – Kriss

+0

Обратите внимание, что для проверки этого вы можете жестко закодировать переменные camera_near и camera_far, используемые в фрагменте кода! –

+0

Извините, но он не работает ... – Kriss