2010-04-23 10 views
12

Por lo tanto, tanto en D3D como en OpenGL hay capacidad para dibujar desde un búfer de índice.3 búferes de índice

El formato de archivo OBJ sin embargo hace algo raro. En él se especifica un grupo de vértices como:

 
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 

A continuación se especifica un grupo de normales como ..

 
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 

A continuación se especifica un grupo de coordenadas tex como

 
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 

ENTONCES especifica "caras" en el modelo como:

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

Donde estamos v/t/n el primer número es un índice en el conjunto de vértices, el segundo un índice en el conjunto de coordenadas de tex, el tercero, en el conjunto de normales.

Así, al tratar de hacer esto con buffers de vértices,

En OpenGL puedo usar glVertexPointer, glNormalPointer y glTexCoordPointer para establecer indicadores para cada uno de los vértices, la normalidad y la textura de coordenadas matrices, respectivamente .. pero cuando se trata a dibujar con glDrawElements, sólo puedo especificar UNO conjunto de índices, a saber, los índices se debe utilizar cuando se visita los vértices.

Ok, ¿entonces qué? Todavía tengo conjuntos de índices para visitar.

En su D3D la misma - que puedo configurar 3 corrientes: una para los vértices, uno para texcoords, y otra para las normales, pero cuando se trata de usar IDirect3DDevice9 :: DrawIndexedPrimitive, todavía sólo se puede especificar UNO buffer de índice, que se indexará en la matriz de vértices.

lo tanto, es posible para sacar de buffers de vértices utilizando diferentes matrices de índice para cada uno de los vértices, TexCoord y tampones normales (ya sea D3D o OpenGL!), O tengo que crear una sola agrupación entrelazada y luego visitar ¿ESO?

+0

posible duplicado de [Procesamiento de mallas con índices múltiples] (http://stackoverflow.com/questions/11148567/rendering-meshes-with-multiple-indices) –

Respuesta

7

OBJ no fue diseñado para mapear a OpenGL o DirectX.

Todo lo que ha dicho es cierto, y no, no es posible usar índices por atributo.

usted tiene que convertir la representación OBJ a algo que sólo utiliza un único índice por vértice (posiblemente duplicar algunos datos de vértice en el camino).

+0

Entonces, como seguimiento, __puedo asumir__ que un archivo obj __never__ cambiará el formato de vértice a la mitad? – bobobobo

+0

@bobobobo: Bueno, ha pasado mucho tiempo sin tratar con archivos OBJ, pero creo que hubo casos extraños en los que una textura solo se aplicaba a partes del modelo. Como resultado, creo que solo las partes de los vértices tenían coordenadas de textura correspondientes. Eso fue hace unos 10 años, así que no confíes en mí. – Bahbar

+0

Ja ja. ¿Con qué te ocupas ahora? – bobobobo

2

Lo que realmente quieres hacer (hablando desde el lado D3D de la valla, no sé OpenGL lo siento) está cargando el OBJ en una matriz de formato de vértice personalizado - de esa manera tienes una estructura con el índice, el vértice, el normal y el tex coord en él y usted puede simplemente renderizarlo usando un DrawIndexedPrimtive.

¿Estoy malentendido su definición del problema aquí? Creo que es necesario dar un poco más de detalle: no debería necesitar varios búferes de índice para procesar un solo archivo OBJ (a menos que lo dosifique deliberadamente). Si ese es el caso, que deliberadamente lo estás procesando en lotes, entonces deberías echar un vistazo a los argumentos de DrawIndexedPrimitive que te permiten especificar un desplazamiento en el VB a usar.

+0

La razón por la que necesito múltiples búferes de índice es el vértice, normal y Los texcoords en realidad están indexados a "diferentes tasas" en la especificación de la cara. En 'f 1/3/5 2/8/1 4/2/2', el primer vértice usa el índice 1 de la matriz de vértices, el índice 3 de la matriz tex y el índice 5 de la matriz normal. – bobobobo

+0

Sí, necesita cargar los datos OBJ en estructuras personalizadas para renderizar correctamente en D3D. Parte de este proceso requiere la duplicación de vértices para referenciar correctamente el formato de la cara. Hay un ejemplo incluido en DirectX SDK (según la versión que esté usando). Se puede encontrar en \ Samples \ C++ \ Direct3D10 \ MeshFromOBJ10 –

+0

@JoshuaAtkins Ese fue un buen lugar para ver la implementación, fui con un par de vueltas por la pereza. –

3

Me he encontrado exactamente con el mismo problema y estoy buscando una solución. Cuál es el problema es que muchas verticies tienen más de 1 coordenada de textura. Mi solución fue duplicar cada vértice en la matriz que tiene más de 1 coordenada de textura.

solución está aquí: wavefront obj file format opengl vertex mapping

Sin embargo, me gustaría encontrar una solución que deja a los datos de vértice intacta para el procesamiento de entre bastidores con OpenCL,

Una solución consiste en limitar a 1 coordenada de textura por vértice. Sé que OpenGL tiene múltiples coordenadas de textura por vértice. ¿Cómo puedo usar estos con glGenBuffersARB, etc. No lo sé. Alguien tiene sugerencias?

Cuestiones relacionadas