Tutaj przeczytano trochę o tym here.
Zasadniczo zmiennoprzecinkowa tekstura jest teksturą, w której dane są typu zmiennoprzecinkowego :) To znaczy, że nie jest zaciśnięty. Więc jeśli masz 3.14f w swojej fakturze, odczytasz tę samą wartość w module cieniującym.
Możesz tworzyć je z różnymi numerami kanałów. Możesz również utworzyć teksturę 16 lub 32 bitową w zależności od formatu. na przykład
// 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);
gdzie dane mogą być tak:
float data[16][16];
for(int i=0;i<16*16;++i) data[i] = sin(i*M_PI/180.0f); // whatever
następnie w cieniującego można dostać dokładnie to samo (jeśli używasz FLOAT32 tekstury) wartość.
np.
uniform sampler2D myFloatTex;
float value = texture2D(myFloatTex, texcoord.xy);
Jeśli uzywasz formatu 16bit, powiedzmy GL_RGBA16F, wtedy gdy czytasz w cieniującego trzeba będzie konwersja. Aby tego uniknąć, możesz użyć typu half4: half4 value = texture2D (my16BitTex, texcoord.xy);
Zasadniczo różnica między znormalizowaną teksturą 8bit a zmiennoprzecinkową polega na tym, że w pierwszym przypadku twoje wartości zostaną doprowadzone do zakresu [0..1] i zaciśnięte, podczas gdy w drugim otrzymasz swoje wartości w taki sposób (z wyjątkiem konwersji 16 < -> 32, zobacz mój przykład powyżej).
Nie dlatego, że prawdopodobnie będziesz chciał użyć ich z FBO jako celem renderowania, w tym przypadku musisz wiedzieć, że nie wszystkie formaty mogą być dołączone jako cel renderowania. Na przykład. nie można dołączać formatów Luminancji i intensywności.
Również nie wszystkie urządzenia obsługują filtrowanie tekstur zmiennoprzecinkowych, dlatego należy je najpierw sprawdzić w razie potrzeby.
Mam nadzieję, że to pomoże.
Są również przydatne do pobierania danych do modułów cieniujących (np. Wartości bezwzględnych). – pmr
A więc jak byś przeczytał normalny obraz 8-bitowy RGB lub 8-bitowy RGBA na kanał i jak interpretowane są wartości wewnętrznie? na przykład czy wartość z zakresu 0-255 lub 0-1 zostanie przeskalowana do innego zakresu wewnętrznie? – lokstok
@lokstok. Istnieje parametr glTexImage o nazwie "znormalizowany". Jeśli ustawione na "true", twoje bajty wejściowe będą konwertowane w zakresie [0,1]. Inaczej przypuszczam, że dostaniesz [0-255] (nie próbowałem tego). – kvark