2011-04-18 16 views
16

Estoy tratando de guiarme por las texturas de punto flotante, pero me resulta difícil encontrar algún recurso que me explique ... Intenté leer la especificación OpenGL ARB_texture_float, pero todavía no puedo entenderlo.¿Qué es exactamente una textura de punto flotante?

¿Y cómo se relacionan los datos en coma flotante con los datos RGBA o RGB de 8 bits por canal de una imagen que estoy cargando en una textura?

¡Gracias por la ayuda y cualquier tipo de información relacionada con mi pregunta!

Respuesta

3

Las texturas FP tienen una gama designada especial de formatos internos (RGBA_16F, RGBA_32F, etc.). Las texturas normales almacenan datos de punto fijo, por lo que al leerlos se obtienen valores de rango de [0,1]. Contrariamente, las texturas FP le dan rango [-inf, + inf] como resultado (no necesariamente con una mayor precisión).

En muchos casos (como el renderizado HDR) puede avanzar fácilmente sin texturas FP, simplemente transformando los valores para que quepan en el rango [0,1]. Pero hay casos como el renderizado diferido cuando es posible que desee almacenar, por ejemplo, coordenadas mundo-espacio sin preocuparse por su rango.

+0

También son útiles para obtener datos de los sombreadores (por ejemplo, isovalores). – pmr

+0

Entonces, ¿cómo haría para leer una imagen RGB o RGBA de 8 bits por canal normal y cómo se interpretan internamente los valores? p.ej. ¿el valor que va de 0-255 o 0-1 se escalará a algún otro rango internamente? – lokstok

+0

@lokstok. Hay un parámetro para glTexImage llamado 'normalizado'. Si se establece en "verdadero", sus bytes de entrada se convertirán en un rango de [0,1]. De lo contrario, supongo que obtendrá [0-255] (no lo intenté). – kvark

15

Aquí hay una lectura un poco here al respecto.

Básicamente, la textura de punto flotante es una textura en la que los datos son de tipo de punto flotante :) Es decir, no está sujeta. Entonces, si tienes 3.14f en tu textura, leerás el mismo valor en el sombreador.

Puede crearlos con diferentes números de canales. También puede organizar texturas de 16 o 32 bits dependiendo del formato. p.ej.

// create 32bit 4 component texture, each component has type float  
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, 16, 16, 0, GL_RGBA, GL_FLOAT, data); 

donde los datos podrían ser así:

float data[16][16]; 
for(int i=0;i<16*16;++i) data[i] = sin(i*M_PI/180.0f); // whatever 

después en shader se puede conseguir exactamente igual (si se utiliza float32 textura) de valor.

p. Ej.

uniform sampler2D myFloatTex; 
float value = texture2D(myFloatTex, texcoord.xy); 

Si se utiliza el formato de 16 bits, por ejemplo GL_RGBA16F, entonces cada vez que se lee en shader que tendrá una conversión. Por lo tanto, para evitar esto, puede usar half4 type: half4 value = texture2D (my16BitTex, texcoord.xy);

Así que, básicamente, la diferencia entre la textura normalizada de 8 bits y punto flotante es que en el primer caso los valores se llevarán al rango [0..1] y se fijarán, mientras que en el último recibirán sus valores como están (a excepción de 16 < -> 32 conversión, vea mi ejemplo anterior).

No es probable que desee utilizarlos con FBO como objetivo de renderizado, en este caso debe saber que no todos los formatos se pueden adjuntar como destino de renderizado. P.ej. no puede adjuntar formatos de luminancia e intensidad.

Además, no todo el hardware admite el filtrado de texturas de punto flotante, por lo que debe verificarlo primero para su caso si lo necesita.

Espero que esto ayude.