2013-09-21 14 views
11

Przeczytałem kilka tutoriali na temat GLSL. W pewnym położeniu atrybut jest vec4 w niektórych vec3. Wiem, że operacje macierzy wymagają vec4, ale czy warto wysłać dodatkowy element? Czy nie lepiej wysłać vec3, a później rzucić w shadera vec4 (pozycja, 1.0)? Mniej danych w pamięci - będzie szybciej? Lub powinniśmy spakować dodatkowy element, aby uniknąć rzucania?Shader position vec4 lub vec3

Jakieś wskazówki, co powinno być lepsze?

layout(location = 0) in vec4 position; 
MVP*position; 

lub

layout(location = 0) in vec3 position; 
MVP*vec4(position,1.0); 

Odpowiedz

19

dla atrybutów wierzchołków, to nie będzie miało znaczenia. Czwarty komponent jest automatycznie rozszerzany do 1.0, gdy jest nieobecny.

To znaczy, że jeśli prześlesz trójwymiarowy wskaźnik atrybutu wierzchołków do 4-wymiarowego wektora, GL wypełni dla ciebie W z 1.0. Zawsze podążam tą trasą, unikając konieczności jawnego pisania vec4 (...) podczas wykonywania mnożenia macierzy na pozycji, a także unika się marnowania pamięci przechowującej 4 składnik.

Działa to również dla współrzędnych 2D, przy okazji. Współrzędna 2D przekazana do atrybutu vec4 staje się vec4 (x, y, 0.0, 1.0). Ogólna zasada brzmi następująco: wszystkie brakujące komponenty są zastępowane przez 0.0, z wyjątkiem W, która jest zamieniana na 1.0.

Jednak dla ludzi, którzy nie są świadomi zachowania GLSL w takich okolicznościach, może to być mylące. Przypuszczam, że właśnie dlatego większość tutoriali nigdy nie dotyczy tego tematu.

+0

Czy to oznacza, że ​​mogę użyć: glBufferSubData (GL_ARRAY_BUFFER, 0, vertex * 3, data); glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 0, 0); oraz w modułach cieniujących użyj układu " " (lokalizacja = 0) w pozycji wen4; " wyrażenie? – Skides

+2

Tak, właśnie to oznacza. Jeśli to zrobisz, GLSL doda 1.0 dla W za każdym razem, gdy spróbujesz uzyskać do niego dostęp. –

+0

Tylko szybkie pytanie dodatkowe: czy dotyczy to czegoś więcej niż "GLfloat"? To znaczy, czy to samo rozszerzenie ma miejsce dla 'dvec2' ->' dvec4' lub 'ivec2' ->' ivec4'? – ThePhD

Powiązane problemy