2011-04-18 10 views
16

Próbuję owinąć mi głowę teksturami zmiennoprzecinkowymi, ale trudno mi znaleźć dobre zasoby, które by mi je wyjaśniły. Próbowałem przeczytać specyfikację OpenGL ARB_texture_float, ale nadal nie mogę jej odczytać.Czym dokładnie jest tekst zmiennoprzecinkowy?

A jak dane zmiennoprzecinkowe dotyczą tylko normalnych 8-bitowych na kanał RGBA lub RGB danych z obrazu, który ładuję do tekstury?

Dzięki za pomoc i wszelkie informacje związane z moim pytaniem !!

Odpowiedz

3

Tekstury FP mają specjalny zakres formatów wewnętrznych (RGBA_16F, RGBA_32F itp.). Regularne tekstury przechowują dane o stałych punktach, więc odczyt z nich daje [0,1] wartości zakresu. Przeciwnie, tekstury FP dają w rezultacie zakres [-inf, + inf] (niekoniecznie z wyższą precyzją).

W wielu przypadkach (np. Renderowanie HDR) można łatwo przejść bez tekstur FP, przekształcając wartości tak, aby mieściły się w zakresie [0,1]. Istnieją jednak przypadki, takie jak odroczone renderowanie, gdy użytkownik może chcieć przechowywać, na przykład współrzędną światową, bez dbania o swój zasięg.

+0

Są również przydatne do pobierania danych do modułów cieniujących (np. Wartości bezwzględnych). – pmr

+0

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

+0

@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

15

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.