2013-09-06 5 views
6

Mam działający kod, w którym odczytuję wartości vec4 w module cieniującym z bufora tekstury.Jak używać buforów tekstur do odczytu pojedynczej liczby całkowitej zamiast vec4

po stronie klienta, utworzyć bufor wektorów przemieszczenia:

vec4 vector1 : vec4(x1, y1, z1, w1); 
vec4 vector2 : vec4(x2, y2, z2, w2); 
vec4 vector3 : vec4(x3, y3, z3, w3); 
.. 

następnie utworzyć bufor wierzchołek zawierający vector1, Vector2, Vector3 ....

następnie utworzyć tekstury i wiążą wyżej bufor wykorzystując:

glTexBuffer(GL_TEXTURE_BUFFER, GL_RGBA32F, bufferID); 

że wybrali GL_RGBA32F ponieważ każdy x1, y1, z1 W1, itp to pływak.

w cieniującego mogę pobrać poszczególne wektory przy użyciu:

vec4 vector1 = texelFetch(samplerObj, 0); 
vec4 vector2 = texelFetch(samplerObj, 1); 
. 
. 

Ale teraz załóżmy mój wektor przemieszczenia nie jest vec4, ale jedna liczba całkowita. tj

int vector1 = x1; //(int is 32 bit unsigned) 
int vector2 = x2; //(int is 32 bit unsigned) 

może ktoś proszę powiedzieć, jaki będzie odpowiedni internalFormat być? jest

glTexBuffer(GL_TEXTURE_BUFFER, GL_R32UI, bufferID); 

także jak będę pobrać wartość używając texelFetch w cieniującego? jest

int vector1 = texelFetch(samplerObj, 0); 

lub

int vector1 = texelFetch(samplerObj, 0).r ? 

jestem zdezorientowany bo texelFetch powinien zwrócić Texel, który ma 4 części, więc muszę korzystać z czerwoną składową wyniku?

+0

Nie wiem o samplerBuffers, ale dla image_load_store, wewnętrzny format musi być zgodny z instrukcją layout() i kiedy wywołuje ImageLoad() zawsze zwraca vec4/uivec4/ivec4 itd. Jeśli nie ma 4 komponentów ignorujesz resztę i, jak mówisz, po prostu przeczytaj .r na przykład. Po prostu spekuluję tutaj, ale może oznacza to, że lepiej jest czytać w 16-bajtowych blokach. – jozxyqk

+0

@jozxyqk: Nie ma czegoś takiego jak kwalifikator formatu dla układów niejednolitych. – thokra

+0

@thokra i dlatego zacząłem od "Nie wiem o samplerBuffers". Próbuję przekazać moją wiedzę na temat czegoś podobnego. Nie pasuje dokładnie, ale być może niektóre nakładają się. Czy texelFetch niejawnie indeksuje bufor usampler z wewnętrznym formatem GL_R32UI w krokach 4 bajtów i pozostawia nieokreśloną wartość gba rgba? Nie wiem – jozxyqk

Odpowiedz

7

Wspomniano już o prawidłowym rozmiarze formatu wewnętrznego dla unsigned int: R32UI. Dopuszczalne formaty są wymienione w tabeli : 8.15, znalezione w sekcja 8.9 specyfikacji profilu głównego OpenGL 4.4. Należy pamiętać, że zawartość bufora pamięci nie będzie unormowana przy użyciu texelFetch na fakturze bufora o powyższym wewnętrznym formacie! Oznacza to, że podczas wyszukiwania nie otrzymujesz wartości w zakresie [0, 1], ale w zakresie [0, 2^(n-1)].

Zamiast samplerBuffer będziesz potrzebować również usamplerBuffer.

Jeśli zrobić texelFetch na zasadzie samplerBuffer z formatem wewnętrznym R32UI, jak podano w wyżej wymienionym stole, zwróci uvec4 gdzie elementy zwracane będzie zawierać następujące wartości: uvec4(R, 0, 0, 1).

int vector1 = texelFetch(samplerObj, 0); 

To doprowadzi do błędu kompilacji, ponieważ nie istnieje niejawna konwersja z uvec4 do int.

int vector1 = texelFetch(samplerObj, 0).r; 

to swizzle maska ​​zwróci R składnik uvec4 zwrócony przez texelFetch i do niejawnego konwersji z uint do int. Semantycznie, nie ma sensu nazywać wartości skalarnej wektor. ;)

Co rzeczywiście chcesz coś jak

uint displacement = texelFetch(samplerObj, 0).r; 

gdzie samplerObj jest usamplerBuffer.

EDIT: Just do wyjaśnienia, texelFetch zawsze zwracają gvec4 - gdzie g będzie po prostu pusta (o stałym i zmiennoprzecinkowych formatów), i lub u. Sposób wypełniania wektora zależy od wewnętrznego formatu tekstury bufora. Jeśli wybierzesz R32F, dostaniesz nienormalizowany vec4 (R, 0, 0, 1), dla RGBA16 otrzymasz znormalizowany vec4 (R, G, B, A).

Aby uniknąć dalszych nieporozumień: nie przydziela się pamięci dla wektorów 4-komponentowych w przypadku korzystania z formatu jednoskładnikowego! Wszystkie są rozszerzone tylko do gvec4 na odnośniku!

+1

Wierzę, że duża część pytań odnosi się do faktu, że texelFetch zawsze zwraca wektor 4 komponentów. Jeśli texelFetch (samplerObj, 0) .r, który daje pierwszy element. Czy texelFetch (samplerObj, 1) .r daje drugi lub piąty element? Czy odpowiedź na to pytanie zależy od formatu wewnętrznego? Na przykład, jeśli format wewnętrzny to GL_R32UI, zrozumiałe jest, że zwraca drugi element, a GL_RGBA32UI powoduje, że zwracane jest 5. unsigned int. Image_load_store wymaga jawnej deklaracji układu, czy jest ona podobna do samplerBuffer, ale niejawna? – jozxyqk

+0

@jozxyqk: Zobacz moją edycję. Otrzymasz pierwszy i drugi element w składnicy danych. Inkrementowanie texcoorda o jeden zawsze da ci następny element, ponieważ tekstura bufora jest zasadniczo wspierana przez tablicę 1D (magazyn danych obiektu buforowego). – thokra

Powiązane problemy