supports que descargar opengl-es glsl webgl

opengl-es - descargar - webgl que es



Empaquetar flotando en vec4-¿Cómo funciona este código? (3)

Estoy tratando de estudiar la cartografía de la sombra en WebGL. Veo la misma pieza de código de sombreado copiada en varias bibliotecas y ejemplos que logran esto. Sin embargo, en ninguna parte encontré la explicación de cómo funciona.

La idea es guardar un valor de profundidad (un solo flotante) en el búfer de color (vec4). Hay una función de paquete que guarda el flotador en vec4 y la función de desempaquetar que recupera el flotador de vec4.

vec4 pack_depth(const in float depth) { const vec4 bit_shift = vec4(256.0*256.0*256.0, 256.0*256.0, 256.0, 1.0); const vec4 bit_mask = vec4(0.0, 1.0/256.0, 1.0/256.0, 1.0/256.0); vec4 res = fract(depth * bit_shift); res -= res.xxyz * bit_mask; return res; } float unpack_depth(const in vec4 rgba_depth) { const vec4 bit_shift = vec4(1.0/(256.0*256.0*256.0), 1.0/(256.0*256.0), 1.0/256.0, 1.0); float depth = dot(rgba_depth, bit_shift); return depth; }

Me hubiera imaginado que empaquetar un flotador en vec4 debería ser un problema trivial, simplemente cópielo en una de las 4 ranuras de vec4 y deje otros sin usar. Es por eso que la lógica de cambio de bits en el código anterior es desconcertante para mí.

¿Alguien puede arrojar algo de luz?


Además de la respuesta anterior, es posible que esté interesado en la extensión de textura de punto flotante que se describe aquí:

http://www.khronos.org/registry/webgl/extensions/OES_texture_float/

Tenga en cuenta que hay configuraciones de hardware / software allí donde esta extensión no existe / se ejecuta, pero si lo hace, es una buena extensión. Mi experiencia es que también es rápido. Si usa esto, puede usar los tres canales restantes para almacenar otra información, como el color de una textura proyectada.


No está almacenando un float GLSL en un GLSL vec4 . Lo que está haciendo es almacenar un valor en un vec4 que, cuando se escribe en un framebuffer RGBA8 (valor de 32 bits), se puede leer como un vec4 y luego reconstituirlo en el mismo valor float que se dio anteriormente.

Si hiciera lo que sugiere, simplemente escribiendo el valor de punto flotante en el canal rojo del framebuffer, solo obtendría 8 bits de precisión. Con este método, obtienes todos los 32 bits trabajando para ti.


Si estás interesado en los detalles esenciales de cómo funcionan estas rutinas, te sugiero que leas la publicación de mi blog . Estoy agregando algunos detalles aquí sobre cómo funciona ese código y para abordar algunos posibles casos de uso.

Como probablemente se haya dado cuenta, ese código está codificando un valor flotante normalizado a un vec4 . OpenGL ES 2.0 o WebGL (en el momento de la escritura), podría utilizar esas rutinas de empaquetar / desempaquetar para proporcionar puntos flotantes de precisión de 32 bits mediante texturas RGBA8 ( más sobre esto en la especificación ).

Incluso con la extensión publicada por Mikael ( OES_texture_float ) podría ser necesario (por ejemplo, para propósitos de depuración) volcar puntos flotantes normalizados de precisión de 32 bits completos y, como se describe en la especificación, readPixels está actualmente limitado por lo siguiente

Sólo se aceptan dos combinaciones de formato y tipo. El primero es el formato RGBA y el tipo UNSIGNED_BYTE. El segundo es un formato elegido por la implementación.