2011-12-18 9 views
5

we wstępie OpenGL ES 2.0, tu: http://www.webreference.com/programming/opengl_es/2.html moduł cieniujący wierzchołek jest określony:OpenGL ES pozycji 2,0 specifiying vec3 lub vec4

GLbyte vShaderStr[] = 
    "attribute vec4 vPosition; \n" 
    "void main()     \n" 
    "{       \n" 
    " gl_Position = vPosition; \n" 
    "};       \n"; 

atrybut vPosition jest cztery składowa wektora.

Później w tekście aplikacja skompiluje moduł cieniujący wierzchołków wraz z modułem cieniującym fragment. Z glBindAttribLocation uchwyt do przekazywania danych do aplikacji vertex shader zostanie nawiązane:

// Bind vPosition to attribute 0 
glBindAttribLocation(programObject, 0, "vPosition"); 

W 2 shadery są teraz połączone i program jest gotowy do użycia.

Sprawa zastosowanie to:

GLfloat vVertices[] = {0.0f, 0.5f, 0.0f, 
         -0.5f, -0.5f, 0.0f, 
         0.5f, -0.5f, 0.0f}; 
... 
// Load the vertex data 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vVertices); 
glEnableVertexAttribArray(0); 
glDrawArrays(GL_TRIANGLES, 0, 3); 

Co oznacza:

  • glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vVertices): przekazać dane wierzchołków do programu, lokalizacja użycie 0, każdy wierzchołek ma 3 składniki, typ jest float, nie stosuje się normalizacji.

  • glEnableVertexAttribArray(0): Moduł cieniujący użyje przekazanych danych.

  • glDrawArrays(GL_TRIANGLES, 0, 3);: Moduł cieniujący wykona kod wyciągnąć pojedynczą trójkąta, przy użyciu pierwszego (a), tylko trzy znajdujące się w określonej tablicy wierzchołków.

Kim pytania:

  • werteksach oczekuje pozycji cztery elementem wierzchołkowy (X, Y, Z, W), program przechodzi tylko trzy składniki (x, y, z) dane Dlaczego to działa?

  • Moduł cieniujący potrzebuje vec4, składnik w musi mieć wartość 1, aby działał zgodnie z oczekiwaniami. Który krok jest odpowiedzialny za prawidłowe dodanie komponentu w?

Odpowiedz

16

Zobacz tę odpowiedź: Can you use glVertexAttribPointer to assign a smaller vector to a larger one?

Jak wspomniano w tym poście pojawi się ona w specyfikacji gles: http://www.khronos.org/registry/gles/specs/2.0/es_full_spec_2.0.24.pdf
W sekcji 2.8 niniejszego dokumentu jest napisane:

Kiedy element tablicy i jest przesyłany do GL za pomocą poleceń DrawArrays lub DrawElements, każdy atrybut ogólny jest rozszerzany do czterech składników . Jeśli rozmiar jest jeden, wówczas składnikiem x atrybutu jest określona przez tablicę; Komponenty y, z i w są domyślnie ustawione na odpowiednio 0, zero i 1. Jeśli rozmiar jest równy dwa, składniki atrybutu x i y są określane przez tablicę; Komponenty z, i w są niejawnie ustawione na zero i jeden, odpowiednio.Jeśli rozmiar wynosi trzy, wówczas podane są wartości x, y i z, a w jest domyślnie ustawione na . Jeśli rozmiar wynosi cztery, wówczas zostaną określone wszystkie składniki.

+0

Cześć Jave - dzięki za odpowiedź i link. Sprawy stają się coraz jaśniejsze. – Gisela

+1

@ Gisela Jeśli odpowiedź rozwiązała Twój problem, [accepting] (http://stackoverflow.com/faq#howtoask) jest poprawną odpowiedzią. –

+0

@christian: gotowe – Gisela