2011-03-23 3 views
0

OBJ 파일은 정점에 대한 인덱스 인 f 행을 사용하여 데이터를 매우 효율적으로 나타냅니다. 그러나 많은 OBJ 모델에서 v 회선이 중복되어 있음을 알았습니다. 내가 gl.glDrawElements (GL10.GL_TRIANGLES, mNumOfIndices, GL10.GL_UNSIGNED_SHORT, mIndicesBuffer) 을 사용하여 OpenGL을 ES 응용 프로그램에 이러한 모델을 가져올 때OBJ 파일에 정점/법선이 복제되는 이유는 무엇입니까?

# Max2Obj Version 4.0 Mar 10th, 2001 
# 
mtllib ./Cube 2.mtl 
g 
# object Cube_1 to come ... 
# 
v -5.500000 0.000000 -1.000000 
v -5.500000 0.000000 1.000000 
v -7.500000 0.000000 1.000000 
v -7.500000 0.000000 -1.000000 
v -5.500000 2.000000 -1.000000 
v -5.500000 2.000000 1.000001 
v -7.500000 2.000000 1.000000 
v -7.500000 2.000000 -1.000000 
v -5.500000 0.000000 -1.000000 
v -5.500000 2.000000 -1.000000 
v -5.500000 2.000000 1.000001 
v -5.500000 0.000000 -1.000000 
v -5.500000 2.000000 1.000001 
v -5.500000 0.000000 1.000000 
v -5.500000 0.000000 1.000000 
v -5.500000 2.000000 1.000001 
v -7.500000 2.000000 1.000000 
v -5.500000 0.000000 1.000000 
v -7.500000 2.000000 1.000000 
v -7.500000 0.000000 1.000000 
v -7.500000 0.000000 1.000000 
v -7.500000 2.000000 1.000000 
v -7.500000 2.000000 -1.000000 
v -7.500000 0.000000 1.000000 
v -7.500000 2.000000 -1.000000 
v -7.500000 0.000000 -1.000000 
v -5.500000 2.000000 -1.000000 
v -5.500000 0.000000 -1.000000 
v -7.500000 0.000000 -1.000000 
v -5.500000 2.000000 -1.000000 
v -7.500000 0.000000 -1.000000 
v -7.500000 2.000000 -1.000000 
# 32 vertices 

vt 0.000500 0.999500 0.000500 
vt 0.000500 0.000500 0.000500 
vt 0.999501 0.000500 0.000500 
vt 0.999501 0.999500 0.000500 
vt 0.999500 0.999500 0.999501 
vt 0.999500 0.000500 0.999501 
vt 0.000499 0.000500 0.999501 
vt 0.000499 0.999500 0.999501 
vt 0.999500 0.000500 0.999500 
vt 0.999500 0.999501 0.999500 
vt 0.000500 0.999501 0.999500 
vt 0.999500 0.000500 0.999500 
vt 0.000500 0.999501 0.999500 
vt 0.000500 0.000500 0.999500 
vt 0.999500 0.000500 0.000500 
vt 0.999500 0.999501 0.000500 
vt 0.000499 0.999501 0.000500 
vt 0.999500 0.000500 0.000500 
vt 0.000499 0.999501 0.000500 
vt 0.000499 0.000500 0.000500 
vt 0.999500 0.000500 0.000499 
vt 0.999500 0.999501 0.000499 
vt 0.000500 0.999501 0.000499 
vt 0.999500 0.000500 0.000499 
vt 0.000500 0.999501 0.000499 
vt 0.000500 0.000500 0.000499 
vt 0.000500 0.999501 0.999500 
vt 0.000500 0.000500 0.999500 
vt 0.999501 0.000500 0.999500 
vt 0.000500 0.999501 0.999500 
vt 0.999501 0.000500 0.999500 
vt 0.999501 0.999501 0.999500 
vt 0.000500 0.999500 0.000500 
vt 0.999501 0.000500 0.000500 
vt 0.999500 0.999500 0.999501 
vt 0.000499 0.000500 0.999501 
# 36 texture vertices 

vn 0.000000 -1.000000 -0.000000 
vn 0.000000 -1.000000 -0.000000 
vn 0.000000 -1.000000 -0.000000 
vn 0.000000 -1.000000 -0.000000 
vn 0.000000 1.000000 -0.000000 
vn 0.000000 1.000000 -0.000000 
vn 0.000000 1.000000 -0.000000 
vn 0.000000 1.000000 -0.000000 
vn 1.000000 0.000000 -0.000000 
vn 1.000000 0.000000 -0.000000 
vn 1.000000 0.000000 -0.000000 
vn 1.000000 0.000000 -0.000000 
vn 1.000000 0.000000 -0.000000 
vn 1.000000 0.000000 -0.000000 
vn -0.000000 -0.000000 1.000000 
vn -0.000000 -0.000000 1.000000 
vn -0.000000 -0.000000 1.000000 
vn 0.000000 0.000000 1.000000 
vn 0.000000 0.000000 1.000000 
vn 0.000000 0.000000 1.000000 
vn -1.000000 0.000000 -0.000000 
vn -1.000000 0.000000 -0.000000 
vn -1.000000 0.000000 -0.000000 
vn -1.000000 0.000000 -0.000000 
vn -1.000000 0.000000 -0.000000 
vn -1.000000 0.000000 -0.000000 
vn 0.000000 0.000000 -1.000000 
vn 0.000000 0.000000 -1.000000 
vn 0.000000 0.000000 -1.000000 
vn 0.000000 0.000000 -1.000000 
vn 0.000000 0.000000 -1.000000 
vn 0.000000 0.000000 -1.000000 
# 32 vertex normals 

g Cube_1 
usemtl 01_-_Default_1 
s 0 
f 1/33/1 2/2/2 3/34/3 
f 1/1/1 3/3/3 4/4/4 
f 5/35/5 8/8/8 7/36/7 
f 5/5/5 7/7/7 6/6/6 
f 9/9/9 10/10/10 11/11/11 
f 12/12/12 13/13/13 14/14/14 
f 15/15/15 16/16/16 17/17/17 
f 18/18/18 19/19/19 20/20/20 
f 21/21/21 22/22/22 23/23/23 
f 24/24/24 25/25/25 26/26/26 
f 27/27/27 28/28/28 29/29/29 
f 30/30/30 31/31/31 32/32/32 
# 12 faces 

g 

이것은 많은 문제가 발생합니다 여기에 예를 들어 샘플 큐브 OBJ 내용입니다 법선과 관련이있는 틀린 음영 때문에 드로잉하는 방법. opnegl-es는 DrawArrays가 아니라 drawElement 메서드를 사용하는 경우 우리가 제공하는 정점이 중복되지 않을 것으로 예상합니다.

f 라인을 사용하면 중복을 제거하여 OpenGL-ES에서 처리 할 수있는 매우 효율적인 데이터를 생성 할 수 있습니다. 그러나 OBJ 파일에는 f 행의 목적을 무효로하는 중복이 있습니다.

답변

1

데이터를 OpenGL의 고정 파이프 라인이 내부적으로하는 것과 동일하게 유지하는 것이 일반적이기 때문에 가능성이 높습니다. OBJ는 중복을 제거 할 수는 있지만 필요하지는 않습니다. 따라서 소프트웨어가 올바른 OBJ 파일이고 올바른 모양을 나타내는 내용을 출력하는 한 저자는 만족했습니다. OBJ에서 위치, 법선 또는 텍스처 좌표를 복제 할 필요가 없다고 말하는 것이 맞습니다. 'f'선언은이를 방지하기 위해 간접적 인 수준을 제공합니다.

v 정점, n 법선 및 텍스처 좌표를 포함하는 일반적인 경우 OBJ를 표시하려면 최악의 경우 v * n * t 정점을 OpenGL에 제출할 준비가 필요합니다. OpenGL은 정점 복제 여부를 알지 못합니다.

관련 문제