Реконструкция положения в мире по линейной глубине

у меня проблемы с восстановлением мировых позиций из ранее сохраненной линейной глубины в glsl. Я прочитал много информации в Интернете, но не могу найти свою проблему... Итак, что я получил:

VS (storing depth to 32F):
float linDepth(float z) {
    return (-z-zNear)/(zFar-zNear);
}
void main() {
    vec4 position = uViewMatrix * uModelMatrix * vec4(aPosition, 1);
    depth = linDepth(position.z); //store linear view-depth
}

FS (reconstuction):
void main() {
    vec3 vUV = vec2(0..1, 0..1); (from screen aligned quad)
    vec3 ndc = vec3(vUV*2-1, linearViewDepth*2-1);
    vec4 v0 = inverse(uProjectionMatrix)*vec4(ndc, 1);
    vec3 reconViewPos = v0.xyz/v0.w;
    vec3 reconWorldPos = inverse(uViewMatrix) * v0;
}

... и результаты полностью выключены. Хотя я чувствую проблему, используя неизменную линейную глубину обзора в качестве ndc z. В конце я хочу применить метод лучевой интерполяции:

VS (reconstruction, aligned screenquad):
out vec3 vViewRay;
void main() {
    gl_Position = aPosition;
    vec4 v = vec4(aPosition.x, aPosition.y, 1, 1); //ndc (at the back of cube)
    v = inverse(uProjectionMatrix) * v;
    v /= v.w; //view coordinate
    v /= v.z; //normalize by z for scaling
    vViewRay = v.xyz;
}

FS(reconstruction):
in vec3 vViewRay;
float delinDepth(float z) {
    return -(z*(zFar-zNear)+zNear);
}
void main() {
    vec3 reconViewPos = vViewRay * delinDepth(linearViewDepth);
}

person Teris    schedule 21.01.2015    source источник
comment
stackoverflow .com/questions/13711252/   -  person j-p    schedule 21.01.2015


Ответы (1)


В конце концов, второй код реконструкции сработал, наверное, где-то еще что-то не так...

person Teris    schedule 22.01.2015