Подтвердить что ты не робот

Что такое текстура с плавающей точкой?

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

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

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

4b9b3361

Ответ 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 в качестве цели рендеринга, в этом случае вам нужно знать, что не все форматы могут быть прикреплены в качестве цели рендеринга. Например. вы не можете прикреплять форматы яркости и интенсивности.

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

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

Ответ 2

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

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