El paquete GLSL flota en una textura RGBA

8

Quiero componer modelos y partículas convencionales basados ​​en triángulos con una escena de trazado de rayos a una velocidad de cuadro razonable.

webGL no le permite escribir gl_FragDepthen el sombreador de fragmentos. No puede tener múltiples objetivos de renderizado, pero puede renderizar a una textura RGBA y luego usar esa textura como entrada para otra operación de dibujo. Entonces puedo renderizar mi escena de trazado de rayos y almacenar la profundidad como entrada para la siguiente etapa. Obviamente, esto está lejos de ser ideal, pero viable.

Me encantaría estar equivocado sobre esto, y esto se obtiene de la prueba y el error en lugar de cualquier fuente definitiva; por favor corrija cualquier suposición defectuosa

¿Cómo puede empacar / desempacar un flotador e, idealmente, algunos bits de bandera y demás, en una textura RGBA de manera eficiente en un sombreador de fragmentos GLSL?

Será
fuente
2
Hay un artículo antiguo en el primer libro de GPU Gems sobre mapeo de sombras (puede leerlo aquí: http.developer.nvidia.com/GPUGems/gpugems_ch12.html ). Explica cómo empacar flotadores en una textura RGBA con dos formas diferentes. Mire la sección 12.3.3 para escribir, luego 12.3.6 para leer.
Benlitz
1
Otro recurso que podría ser útil es el artículo "Almacenamiento normal compacto para pequeños G-Buffers" de Aras P de Unity ( aras-p.info/texts/CompactNormalStorage.html ). Este artículo está limitado solo a normales.
Mortennobel
1
Puede crear una textura R32F y simplemente escribir sus valores de profundidad allí. sin ningún tipo de embalaje desembalaje. luego, durante su segundo pase "basado en triángulos convencionales", use esta textura como un búfer de profundidad (adjunto como profundidad a FBO). No dude en preguntar más si esto no está claro.
alariq
@alariq sí, la extensión flotante es ampliamente compatible ahora.
Será el
@ Will Si la extensión flotante resolvió su problema, publíquelo como respuesta y acéptelo.
Polar

Respuestas:

5

Estas son las funciones de empaquetar y descomprimir que funcionarán en WebGL y OpenGL ES 2.0, esto es solo para valores en el rango 0 ... 1, por lo que debe asegurarse de que su cálculo de profundidad esté en el espacio correcto.

Codificación de flotadores a RGBA

gbpaul
fuente
¿Puedes agregar los fragmentos de código a tu respuesta? Si el sitio que mencionó se cae, el enlace no servirá.
Felipe Gutiérrez