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.
También son útiles para obtener datos de los sombreadores (por ejemplo, isovalores). – pmr
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
@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