Ummm, hasta ahora había estado guardando las coordenadas del espacio de cámara en texturas para luego usarlas en el shader SSAO, lo cual funciona bien.
Pero estos días he estado intentando evitar dicho paso y quería calcular dichas coordenadas a partir del depth buffer, método el cual está más que documentado en cientos de artículos de internet, pero he tenido varios problemas.
Antes de explicar el método usado, pongamos algo de nomenclatura:
M=World matrix transformation
V=View matrix transformation IV=Inverse View matrix transformation
P=Projection matrix transformation IP=Inverse Projection Matrix transformation
v_m=model space coordinates
v_w=world space coordinates=M*v_m
v_e=eye space coordinates=V*v_w
v_c=clip space coordinates=P*v_e
v_n=normalized device coordinates=(v_c.x/v_c.w,v_c.y/v_c.w,v_c.z/v_c.w) = v_c.xyz/v_c.w
* = Producto matricial
Ok, ahora bien, lo que interesa aquí es recuperar v_e a partir de v_n. La primera forma lógica de proceder sería algo tal que así:
v_c=(v_n.x*v_c.w,v_n.y*v_c.w,v_n.x*v_c.w,v_c.w)
v_e=IP*v_c
pero con el depth buffer desconocemos a priori v_c.w , ya que estamos almacenando v_c.z/v_c.w . Lo que algunas páginas proponen sería utilizar el siguiente método:
v_e'=IP*v_n
v_e.xyz=(v_e'.x/v_e'.w,v_e'.y/v_e'.w,v_e'.z/v_e'.w)
la verdad, no he conseguido demostrar esta igualdad, así que he hecho un programa que generando coordenadas aleatorias use este método y si que es verdad que funciona.
Pero a pesar de que el cálculo es a correcto no estoy consiguiendo los resultados correctos en mi shader utilizando este método y todavía no he averiguado porqué, ya que mi matriz de proyección inversa es correcta y los valores de mi v_n están en el rango [-1,1] ... Mi única sospecha es que cuando corrijo el rango del valor del depth buffer estoy haciendo (depth-0.5)*2.0 y quizás tendría que hacer ((1.0-depth)-0.5)*2.0 , lo probaré el lunes en el trabajo.
Entonces, algún valiente sería capaz de explicarme o demostrarme matemáticamente este método de obtener v_e a partir del depth?
Guau, vaya chorizo he largado
