c++ - tecnica - sombreado dibujo tecnico
Cómo dibujar desde el interior de la geometría de la luz en sombreado diferido (2)
Estoy tratando de implementar un sombreador diferido con OpenGL y GLSL y estoy teniendo problemas con la geometría de la luz. Estos son los pasos que estoy tomando:
Bind multitarget framebuffer
Render color, position, normal and depth
Unbind framebuffer
Enable blend
Disable depth testing
Render every light
Enable depth testing
Disable blend
Render to screen
Pero como solo estoy renderizando la cara frontal, cuando estoy dentro de una luz, desaparece por completo, haciendo que la cara posterior no funcione, ya que obtendría el doble de potencia de la luz (Y cuando adentro, la mitad [o la cantidad normal]) )
¿Cómo puedo generar el mismo valor de luz desde el interior y el exterior de la geometría de la luz?
bueno en mi caso, lo hago así:
Bind gbuffer framebuffer
Render color, position, normal
Unbind framebuffer
Enable blend
Enable depth testing
glDepthMask(0);
glCullFace(GL_FRONT); //to render only backfaces
glDepthFunc(GL_GEQUAL); //to test if light fragment is "behind geometry", or it shouldn''t affect it
Bind light framebuffer
Blit depth from gbuffer to light framebuffer //so you can depth-test light volumes against geometry
Render every light
Si mal no recuerdo, en mi renderizador diferido solo renderizo las caras traseras del volumen de luz. El inconveniente es que no se puede realizar una prueba de profundidad, solo sabrá si hay una luz detrás de una geometría después de realizar el cálculo de la luz y descarte el píxel. Como se explicó en otra respuesta, puede hacer pruebas de profundidad. Pruebe para mayor o igual para ver si la cara posterior está detrás o en una geometría, por lo tanto se cruza con la superficie de la geometría.
De forma alternativa, podría verificar si se encuentra dentro del volumen de luz durante la reproducción y cambiar las caras frontales en consecuencia.