Что такое текстура с плавающей точкой? - PullRequest
16 голосов
/ 19 апреля 2011

Я пытаюсь обернуть голову вокруг текстур с плавающей запятой, но мне трудно найти какие-либо хорошие ресурсы, которые бы мне их объяснили ... Я пытался прочитать спецификацию OpenGL ARB_texture_float, но все еще не могу получить ее в своей голове..

А как данные с плавающей запятой связаны с обычными 8-битными данными RGBA или RGB на канал из изображения, которое я загружаю в текстуру?

Спасибо за помощь и любую информацию, связанную с моим вопросом !!

Ответы [ 2 ]

15 голосов
/ 27 апреля 2012

Здесь читаем немного здесь об этом.

Фактически текстура с плавающей запятой - это текстура, в которой данные имеют тип с плавающей запятой :) То есть не зафиксированы.Так что, если у вас есть 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 = texture2D (my16BitTex, texcoord.xy);

Таким образом, в основном, разница между нормализованной текстурой 8 бит и плавающей запятой заключается в том, что в первом случае ваши значениябудет переведен в диапазон [0..1] и зафиксирован, тогда как в последнем случае вы получите ваши значения как есть (кроме преобразования 16 <-> 32, см. мой пример выше).

Не то чтобы вы 'Возможно, вы захотите использовать их с FBO в качестве цели рендеринга, в этом случае вам нужно знать, что не все форматы могут быть присоединены в качестве цели рендеринга.Например, вы не можете прикрепить форматы яркости и яркости.

Также не все оборудование поддерживает фильтрацию текстур с плавающей запятой, поэтому вам нужно сначала проверить это для вашего случая, если вам это нужно.

Надеюсь, это поможет.

3 голосов
/ 19 апреля 2011

FP текстуры имеют специальный назначенный диапазон внутренних форматов (RGBA_16F, RGBA_32F и т. Д.).Обычные текстуры хранят данные с фиксированной точкой, поэтому чтение из них дает вам значения диапазона [0,1].Напротив, текстуры FP дают вам диапазон [-inf, + inf] в результате (не обязательно с более высокой точностью).

Во многих случаях (например, рендеринг HDR) вы можете легко продолжить без текстур FP, простопреобразование значений в диапазон [0,1].Но есть случаи, например, отложенный рендеринг, когда вы можете захотеть сохранить, например, координаты мирового пространства, не заботясь об их диапазоне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...