2010-04-23 15 views
12

Tak więc, zarówno w D3D, jak i OpenGL istnieje możliwość pobierania z bufora indeksów.3 bufory indeksów

Format pliku OBJ robi jednak coś dziwnego. Określa ona kilka wierzchołków takich jak:

 
v -21.499660 6.424470 4.069845 
v -25.117170 6.418100 4.068025 
v -21.663851 8.282170 4.069585 
v -21.651890 6.420180 4.068675 
v -25.128481 8.281520 4.069585 

Następnie określa kilka normalnych jak ..

 
vn 0.196004 0.558984 0.805680 
vn -0.009523 0.210194 -0.977613 
vn -0.147787 0.380832 -0.912757 
vn 0.822108 0.567581 0.044617 
vn 0.597037 0.057507 -0.800150 
vn 0.809312 -0.045432 0.585619 

Następnie określa grono coords tex lub podobna

 
vt 0.1225 0.5636 
vt 0.6221 0.1111 
vt 0.4865 0.8888 
vt 0.2862 0.2586 
vt 0.5865 0.2568 
vt 0.1862 0.2166 

potem określa "ściany" na modelu:

 
f 1/2/5 2/3/7 8/2/6 
f 5/9/7 6/3/8 5/2/1 

Gdzie jesteśmy v/t/n pierwsza liczba to indeks do tablicy wierzchołków, drugi to indeks do tablicy koordynatów tex, trzeci do tablicy normalnej.

Tak, starając się uczynić to z buforów wierzchołków,

w OpenGL mogę używać glVertexPointer, glNormalPointer i glTexCoordPointer ustawić wskaźniki do każdego wierzchołka, normalna i tekstury koordynować macierze odpowiednio .. ale jeśli chodzi do rysowania z glDrawElements, mogę określić tylko zestaw indeksów ONI, a mianowicie indeksy, których powinien używać podczas odwiedzania wierzchołków.

OK, a następnie co? Wciąż mam zestawy indeksów do odwiedzenia.

W D3D jej tak samo - można skonfigurować 3 strumienie: jeden dla wierzchołków, po jednym dla texcoords i jeden dla normalnych, ale gdy chodzi o użyciu IDirect3DDevice9 :: DrawIndexedPrimitive, mogę tylko jeszcze określić ONE bufor indeksu, który będzie indeksował do tablicy wierzchołków.

Tak, jest to możliwe wyciągnąć z buforów wierzchołków stosując różne tablice indeksu dla każdego wierzchołka, texcoord i normalne bufory (ZARÓWNO D3D lub OpenGL!), Czy muszę utworzyć jeden przepleciony tablicę, a następnie odwiedzić TO?

+0

możliwy duplikat [siatki renderowania z wieloma indeksami] (http://stackoverflow.com/questions/11148567/rendering-meshes-with-multiple-indices) –

Odpowiedz

7

OBJ nie został zaprojektowany do mapowania do OpenGL lub DirectX.

Wszystko, co powiedziałeś, jest prawdą, i nie, nie można używać indeksów według atrybutów.

Musisz przekonwertować reprezentację OBJ na coś, co używa tylko jednego indeksu na wierzchołek (prawdopodobnie duplikując niektóre dane werteksów po drodze).

+0

Tak więc, jako kontynuacja, __can mogę założyć__ plik obj __never__ zmień format wierzchołków w połowie? – bobobobo

+0

@obobobo: Minęło dużo czasu, nie zajmowałem się plikami OBJ, ale myślę, że były dziwne przypadki, w których tekstura była stosowana tylko do części modelu. W rezultacie myślę, że tylko części wierzchołków miały odpowiadające współrzędne tekstury. To było jakieś 10 lat temu, więc nie wierzcie mi w to. – Bahbar

+0

Ha ha. Z czym się teraz miewasz? – bobobobo

2

Co naprawdę chcesz robić (mówiąc od strony D3D ogrodzenia, nie wiem OpenGL przepraszam) ładuje OBJ do tablicy niestandardowego formatu vertex - w ten sposób masz strukturę z indeks, vertex, normal i tex coord w nim i możesz go wyrenderować za pomocą jednego DrawIndexedPrimtive.

Czy nie rozumiem tutaj Twojej definicji problemu? Myślę, że musisz podać trochę więcej szczegółów - nie powinieneś potrzebować wielu buforów indeksów do renderowania pojedynczego pliku OBJ (chyba że celowo go wsypujesz). Jeśli tak jest, celowo go wsypujesz, powinieneś rzucić okiem na argumenty do DrawIndexedPrimitive, które pozwalają ci określić przesunięcie w VB do użycia.

+0

Powodem, dla którego potrzebuję wielu buforów indeksu jest wierzchołek, normalny i texcoords są indeksowane według "różnych stawek" w specyfikacji ściany. W 'f 1/3/5 2/8/1 4/2/2', pierwszy wierzchołek używa indeksu 1 z tablicy wierzchołków, indeksu 3 z tablicy tex i indeksu 5 z tablicy normalnej. – bobobobo

+0

Tak - musisz załadować dane OBJ do niestandardowych struktur, aby renderować poprawnie w D3D. Część tego procesu wymaga powielenia wierzchołków, aby poprawnie odwoływać się do formatu twarzy. Istnieje przykład dołączony do pakietu DirectX SDK (w zależności od wersji, z której korzystasz). Można go znaleźć na \ Samples \ C++ \ Direct3D10 \ MeshFromOBJ10 –

+0

@ JoshuaAtkins To było dobre miejsce, aby zobaczyć realizację, poszedłem z parą na pętle z lenistwa. –

3

Poddałem się dokładnie temu samemu problemowi i szukam rozwiązania. Problem polega na tym, że wiele punktów pionowych ma więcej niż jedną współrzędną tekstury. Moim rozwiązaniem było zduplikowanie każdego wierzchołka w tablicy, która ma więcej niż jedną współrzędną tekstury.

Rozwiązanie jest tutaj: wavefront obj file format opengl vertex mapping

Jednak chciałbym, aby znaleźć rozwiązanie, które pozostawia dane wierzchołków nienaruszone do przetworzenia w między klatkami z OpenCL,

Jednym z rozwiązań jest ograniczenie do 1 tekstury koordynować na wierzchołku. Wiem, że opengl ma wiele współrzędnych tekstury na jeden wierzchołek. Jak mogę ich używać z glGenBuffersARB itp. Nie wiem. Czy ktoś ma sugestie?