2011-06-28 11 views
7

Aktualnie programuję program ładujący .obj w OpenGL. Przechowuję dane wierzchołków w VBO, a następnie wiążę je za pomocą Vertex Attribs. To samo dotyczy normaliów. Chodzi o to, że normalne dane danych i wierzchołków nie są przechowywane w tej samej kolejności.Używanie innej tablicy dla wierzchołków i normałów w glDrawElements (OpenGL/VBO)

Wskaźniki, które daję glDrawElements do renderowania siatki, są używane, jak przypuszczam, przez OpenGL, aby uzyskać wierzchołki w wierzchołku VBO i uzyskać normalne wartości w normalnym VBO.

Czy istnieje metoda opengl oprócz użycia glBegin/glVertex/glNormal/glEnd do poinformowania glDrawElements o użyciu indeksu dla wierzchołków i innego indeksu dla normaliów? Dzięki

Odpowiedz

2

Musisz użyć tego samego indeksu dla pozycji/normalnych/tekstury współrzędnych itp. Oznacza to, że podczas ładowania .obj, musisz wstawić unikalne wierzchołki i skierować swoje twarze do nich.

7

Nie ma bezpośredniego sposobu, aby to zrobić, chociaż możesz może zasymulować go poprzez indeksowanie do tekstury bufora (funkcja OpenGL 3.1) wewnątrz modułu cieniującego.

Zazwyczaj nie zaleca się wykonywania takich czynności. Format OBJ pozwala na odwoływanie się do jednej normalnej przez kilka (w zasadzie dowolną liczbę) wierzchołków naraz, więc zwykle należy budować "kompletny" wierzchołek, w tym współrzędne i normalne i texcoordy dla każdego wierzchołka (duplikowanie odpowiednich danych).

Zapewnia to
a) gładkich zacienione powierzchnie działały prawidłowo
b) ostre krawędzie działały prawidłowo

(różnica między tymi dwiema znajduje się tylko kilka wierzchołków przez te same elementy, identyczne normalny)

+2

Pamiętaj, że kiedy mówię "niewskazane", naprawdę tak myślę. Logika jest nie tylko znacznie bardziej skomplikowana niż zbudowanie odpowiedniego strumienia wierzchołków i przesłanie go, ale także oznacza przypadek, a nie sekwencyjny dostęp do danych, tj. Masz mniej lub bardziej gwarantowaną pamięć podręczną każdego wierzchołka. – Damon

2

OpenGL traktuje wierzchołek jako pojedynczy, długi wektor z i te długie wektory są indeksowane. Twoje pytanie należy do tej samej kategorii, na przykład, jak używać wspólnych wierzchołków z wieloma normalnymi. A kanoniczna odpowiedź brzmi, że te wierzchołki w rzeczywistości nie są dzielone, ponieważ w dłuższej perspektywie nie są identyczne.

Musisz więc wykonać iterację na tablicy indeksów ścian i skonstruować "długie" wierzchołki, dodając je do listy (nowej) z więzami unikatowymi; a (hash) mapa z vertex → index służy temu zadaniu. Coś w tym stylu:

next_uniq_index = 0 
for f in faces: 
    for i in f.indices: 
     vpos = vertices[i.vertex] 
     norm = normals[i.normal] 
     texc = texcoords[i.texcoord] 
     vert = tuple(vpos, norm, texc) 
     key 
     if uniq_vertices.has_key(key): 
      uniq_faces_indices.append(uniq_vertices[key].index) 
     else: 
      uniq_vertices[key] = {vertex = key, index = next_uniq_index} 
      next_uniq_index = next_uniq_index + 1 
Powiązane problemy