Ответ 1
Вот немного читайте здесь.
В принципе текстура с плавающей точкой - это текстура, в которой данные имеют тип с плавающей запятой:) То есть он не зажат. Поэтому, если у вас есть текстура 3.14f, вы будете читать одно и то же значение в шейдере.
Вы можете создавать их с различным количеством каналов. Также вы можете разбивать 16 или 32-битные текстуры в зависимости от формата. например.
// 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);
где данные могут быть такими:
float data[16][16];
for(int i=0;i<16*16;++i) data[i] = sin(i*M_PI/180.0f); // whatever
то в шейдере вы можете получить то же самое (если используете текстуру FLOAT32).
например.
uniform sampler2D myFloatTex;
float value = texture2D(myFloatTex, texcoord.xy);
Если вы использовали 16-битный формат, скажем GL_RGBA16F, тогда всякий раз, когда вы читаете в шейдере, у вас будет конвертирование. Итак, чтобы избежать этого, вы можете использовать тип half4: half4 value = texture2D (my16BitTex, texcoord.xy);
Итак, в основном разница между нормированной текстурой 8 бит и плавающей точкой заключается в том, что в первом случае ваши значения будут перенесены в диапазон [0..1] и зажаты, тогда как в последнем вы получите свои значения как есть (кроме для преобразования 16 ↔ 32, см. мой пример выше).
Не то, что вы, вероятно, захотите использовать их с FBO в качестве цели рендеринга, в этом случае вам нужно знать, что не все форматы могут быть прикреплены в качестве цели рендеринга. Например. вы не можете прикреплять форматы яркости и интенсивности.
Также не все аппаратные средства поддерживают фильтрацию текстур с плавающей запятой, поэтому вам нужно сначала проверить это для своего случая, если вам это нужно.
Надеюсь, что это поможет.