2010-04-23 3 views
12

따라서 D3D와 OpenGL 모두 인덱스 버퍼에서 그릴 수 있습니다.3 개의 인덱스 버퍼

그러나 OBJ 파일 형식은 이상한 일을합니다. 이

 
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 

그런 다음 그 다음을

 
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 

같은 텍스 좌표의 무리를 지정하는 등의 법선의 무리 ..를 지정 그런

 
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 

: 그것은 같은 정점의 무리를 지정합니다 다음과 같이 모델의 '면'을 지정합니다.

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

여기서 우리는 v/t/n입니다. 첫 번째 숫자는 정점 배열에 대한 인덱스이고, 두 번째 숫자는 텍셀 좌표 배열에 대한 인덱스이고, 세 번째 숫자는 법선 배열입니다. 이 때

그래서, 내가 glVertexPointer, glNormalPointerglTexCoordPointer는 정점의 각 포인터를 설정하는 데 사용할 수있는, 버텍스 버퍼와 OpenGL을에서

을이 렌더링하려고에, 정상과 질감은 각각 배열을 조정 ..하지만 glDrawElements으로 그리기까지, ONE 색인 세트, 즉 정점을 방문 할 때 사용해야하는 색인 ​​만 지정할 수 있습니다.

그래, 그럼? 나는 여전히 개의 색인 집합을 가지고있다.

D3D에서

의 거의 같은 - 나는 3 개 스트림을 설정할 수 있습니다 정점 하나, texcoords 하나, 법선 하나를, 그러나에 IDirect3DDevice9 :: DrawIndexedPrimitive를 사용하여 올 때, 나는 여전히 ONE를 지정할 수 있습니다 index 버퍼에 저장된다.

그래서, 그것은 (! D3D 나 OpenGL을이든) 정점, TEXCOORD의 각각에 대해 서로 다른 인덱스 배열을 사용하여 버텍스 버퍼에서 그릴 수 수 , 정상 버퍼, 또는 나는 방문 후 하나의 인터리브 배열을 생성해야합니다 그것?

+0

가능한 중복 [여러 개의 인덱스를 사용하여 렌더링 메쉬] (0120-557-005) –

답변

7

OBJ가 OpenGL 또는 DirectX로 매핑되지 않았습니다.

당신이 말한 모든 것이 사실이며, 아니요, 속성 별 색인을 사용할 수 없습니다.

OBJ 표현을 정점 당 하나의 색인만을 사용하는 (일부 정점 데이터를 복제 할 수도 있음) 용도로 변환해야합니다.

+0

그래서, 후속 조치로서, __can 나는 __never__ 중간에 버텍스 형식을 전환 할 obj 파일을 가정합니다? – bobobobo

+0

@bobobobo : 오랫동안 OBJ 파일을 다루지는 않았지만 모델의 일부에만 텍스처가 적용된 이상한 경우가 있다고 생각합니다. 결과적으로, 정점의 일부분 만 해당 텍스처 좌표가 있다고 생각합니다. 그것은 약 10 년 전이었습니다. 그러나 저를 신뢰하지 마십시오. – Bahbar

+0

하하. 지금 무엇을 처리합니까? – bobobobo

2

울타리의 D3D 측면에서 말하고 싶은 것, OpenGL 미안하지만) 사용자 정의 정점 형식의 배열에 OBJ를로드하고 있습니다. 그 안에 인덱스, 정점, 법선 및 텍셀 좌표가 있으며, 하나의 DrawIndexedPrimtive를 사용하여 렌더링 할 수 있습니다.

여기에서 문제 정의를 잘못 이해합니까? 난 당신이 좀 더 세부 사항을 제공해야 할 것 같아요 - 당신이 고의적으로 그것을 일괄하지 않는 한 단일 OBJ 파일을 렌더링하는 데 여러 인덱스 버퍼가 필요하지 않아야합니다. 이 경우 의도적으로 일괄 처리를 수행하고있는 경우 DrawIndexedPrimitive 인수를 사용하여 VB에서 사용할 오프셋을 지정할 수 있습니다.

+0

여러 인덱스 버퍼가 필요한 이유는 정점, 일반 및 texcoords는 실제로 얼굴 사양에서 "다른 속도"로 색인됩니다. 'f 1/3/5 2/8/1 4/2/2'에서 첫 번째 정점은 꼭지점 배열의 인덱스 1, tex 배열의 인덱스 3, 법선 배열의 인덱스 5를 사용합니다. – bobobobo

+0

예 - D3D에서 올바르게 렌더링하려면 OBJ 데이터를 사용자 지정 구조체에로드해야합니다. 이 과정의 일부는 얼굴 형식을 올바르게 참조하기 위해 정점 복제가 필요합니다. DirectX SDK에 포함 된 예제가 있습니다 (사용중인 버전에 따라 다름). \ Samples \ C++ \ Direct3D10 \ MeshFromOBJ10에서 찾을 수 있습니다. –

+0

@JoshuaAtkins 구현을 확인하기에 좋은 곳이었습니다. 나는 게으르지 않은 루프를 몇 개 사용했습니다. –

3

동일한 문제가 발생하여 해결책을 찾고 있습니다. 문제는 많은 vertribute가 1 개 이상의 텍스처 좌표를 가지고 있다는 것입니다. 내 솔루션은 하나 이상의 텍스처 좌표가 배열의 각 꼭지점을 복제하는 것이 었습니다.

솔루션은 여기에 있습니다 : wavefront obj file format opengl vertex mapping 나는 오픈 CL과 프레임 사이에 처리 정점 데이터는 그대로 둡니다 해결책을 찾기 위해 싶습니다 그러나

,

하나의 솔루션은 버텍스 당 조정 한 텍스처로 제한하는 것입니다. OpenGL은 정점 당 여러 텍스처 좌표를 가지고 있음을 알고 있습니다. glGenBuffersARB 등을 어떻게 사용할 수 있을지 모르겠습니다. 누구나 제안 사항이 있습니까?