2013-07-23 5 views
7

Zakładam, że będzie to jedna z tych rzeczy, która jest "nieokreślona", ale nie mogę znaleźć konkretnej odpowiedzi od Google.Wartość domyślna OpenGL dla niebuforowanego atrybutu vertex przy korzystaniu z kwalifikatorów układu

Powiedzmy w moim vertex shader mam:

layout(location = 0) in vec3 vPosition; 
layout(location = 1) in vec3 vNormal; 
layout(location = 2) in vec4 vColour; 

Ale nie ma nic buforowane do położenia 2 z glEnableVertexAttribArray() lub glVertexAttribPointer(). Czy mogę oczekiwać, że wartość będzie czymś szczególnym?

Przyjęłam dla vec4, że będzie to w przedziale {0,0,0,0}, {0,0,0,1} lub {1,1,1,1}, ale w mój przypadek to {0,0,1,1}.

Kiedy wcześniej użyłem glBindAttribLocation() do określenia lokalizacji, domyślnie ustawiono na {1, 11,1} na 4 różnych maszynach przy użyciu 3 różnych systemów operacyjnych (ubuntu 12.04, Windows 7 i Ubuntu 10.04).

Czy można bezpiecznie założyć, że wartość będzie wynosiła {0,0,1,1} na różnych maszynach? czy to był po prostu zbieg okoliczności?

Odpowiedz

5

Czy mogę oczekiwać, że wartość będzie czymś szczególnym?

Tak, jest to szczególna wartość.

Zakładając, że poprawnie wyłączył tablicę atrybutów (np: z glDisableVertexAttribArray na tym indeksie atrybutu), wartość otrzymujesz pochodzi z in-context vertex attribute określoną przez glVertexAttrib zestawu funkcji. Są to stan globalnego kontekstu, nie zapisany w VAO.

Domyślnie wszystkie zaczynają się od (0, 0, 0, 1). Jeśli jednak renderujesz przy użyciu określonego atrybutu przy użyciu tablicy w tym indeksie atrybutów, wartość kontekstu zostanie skutecznie zniszczona. Powinieneś więc zresetować wartość kontekstu, jeśli chcesz z niej skorzystać.

+0

Ustawiłem więc glDisableVertexAttribArray() dla określonego numeru lokalizacji, ale nadal jest on odczytywany w module cieniującym jako {0,0,1,1}. Używam VAO, więc dzwonię tylko raz. Czy powinienem je wyłączyć zaraz przed wywołaniem mojego glDrawElements()? – kbirk

+0

@Pondwater: Jeśli VAO dezaktywuje, to jest wyłączone. Nie musisz wyłączać go ponownie. Zrobiłem też addendum do odpowiedzi. –

+0

Ahh, to ma sens! Dziękuję za wyjaśnienie! – kbirk

1

Są tu trochę nieokreślone, ale to nie może być problem. Tam stan GL składa się z wartości CURRENT_VERTEX_ATTRIB. Początkowo są to (0,0,0,1). Możesz wyraźnie ustawić wartości atrybutów dla tych atrybutów, w których żadna z tablic nie jest włączona za pośrednictwem rodziny funkcji glVertexAttrib().

Jedyne, co martwić, to, co dzieje się z bieżącymi wartościami, gdy tablica atrybutów jest faktycznie włączona podczas rysowania. Cytując Spec (Version 3.3) sekcja 2.8.3 Vertex Array - komenda Rysunek:

Jeśli tablica odpowiadająca rodzajowego atrybutu wymaganej przez vertex shader nie jest włączona, wówczas odpowiedni element jest pobierany z bieżącej generycznego stan atrybutu (patrz sekcja 2.7).

Jeśli tablica odpowiadającą ogólnemu atrybutu wymaganej przez cieniującego wierzchołek jest włączone, prąd odpowiada podstawowej wartości atrybutu jest zdefiniowana po wykonania DrawArraysOneInstance.

Po prostu musisz podać użyteczną wartość po narysowaniu z włączoną tablicą dla tego konkretnego atrybutu.

UPDATE

Takie zachowanie faktycznie zmienił począwszy OpenGL 4.2:

Jeśli tablica odpowiadająca rodzajowego atrybutu wymaganej przez vertex shader jest nie jest włączona, wówczas odpowiedni element zostanie podjęta z bieżącego ogólnego atrybutu (patrz sekcja 2.7). W przeciwnym razie, jeśli tablica jest włączona, odpowiednia ogólna wartość atrybutu wynosi niezmieniona przez wykonanie DrawArraysOneInstance.

Teraz wywołanie glDraw*() nigdy nie zmieni aktualnie ustawionych wartości atrybutów.

+0

"* Są tu trochę nieokreślone, ale to nie musi stanowić problemu, ponieważ stan GL składa się z wartości CURRENT_VERTEX_ATTRIB. *" Jak więc to czyni je "nieokreślonymi"? Nie jest niezdefiniowane, jeśli spec * definiuje je *. –

+1

@NicolBolas: Odniosłem się do faktu, że wartości są niezdefiniowane po renderowaniu z włączoną tablicą atrybutów (jak w specyfikacji), co zakładam, że robił OP, ponieważ w przeciwnym razie byłyby to wartości domyślne, gdyby nawet nie wie o "glVertexAttrib". – derhass

Powiązane problemy