2013-01-03 6 views
2

필자는 3D 모델이 포함 된 파면 .Obj 파일에서 데이터를 렌더링하기 위해 Vertex Array Object (VAO)에서 두 개의 Vertex Buffer Objects (VBO)와 두 개의 Index Buffer Objects (IBO)를 사용하려고했습니다. .OBJ 파일을 사용했다 vertex/normal face definition :어떻게 인덱스 된 버텍스 위치와 인덱스 된 버텍스 법선을 웨이브 프론트 .obj 파일에서 OpenGL 버텍스 쉐이더로 가져 옵니까?

f v1//vn1 v2//vn2 v3//vn3 

내가 (한 번에) 하나의 버퍼 오브젝트 이후의 OpenGL의 VAO과 색인 두 가지의 IBO를 사용할 수 없다는 것을 깨달았다는 GL_ELEMENT_ARRAY_BUFFER 바인딩 대상에 바인딩 할 수 있습니다 . 즉, GLSL 버텍스 쉐이더에 입력 할 때 문제가되는 버텍스 위치 인덱스와 버텍스 노멀 인덱스를 정의 할 수 없습니다.

정점 위치 및 정점 법선을 캡슐화하는 "꼭지점"구조체를 사용하려고 생각했지만 OpenGL에 데이터를 공급하는 방법을 알지 못합니다. 하나의 긴 배열과 다른 모든 정점 위치 데이터를 다른 개체에 넣었습니다 . 나는 모든 위치 데이터를 포함하는 새로운 배열로 데이터를 복사하기 위해 일부 루프를 사용할 수 있다고 생각한다.

.obj 파일을로드 할 때 법선이 해당 정점 위치 값과 일치하도록 데이터를 처리 할 수 ​​있다고 생각합니다.

이 문제를 해결하려면 어떻게해야합니까?

OpenGL 3.3에서 C++ 및 Visual Studio 2012를 사용하고 있습니다.

답변

7

"꼭지점"이 "위치"와 동의어가 아님을 이해해야합니다. 정점은 전체 속성 집합입니다. 위치, 법선, 텍스처 좌표 등 OpenGL은 기하 도형을 한 번에 하나씩 처리합니다. 프리미티브는 1 (점), 2 (선) 또는 3 개의 꼭지점 (삼각형)으로 구성됩니다. 직위와 직위를 따로 처리 할 수는 없으며 항상 함께해야합니다.

OpenGL에서 처리하기 전에 .obj 파일의 데이터를 확장해야합니다. 속성의 고유 튜플마다 새로운 인덱스가있는 새로운 정점을 도입하고 .obj의 인덱싱 된 속성을 인덱싱 된 정점 OpenGL이 필요로하는 것으로 바꿉니다.

+0

답장을 보내 주셔서 감사합니다, datenwolf. 이제는 개념적으로 이해합니다. – aPerfectMisterMan

+0

나는 아직도 내가 뭔가를 놓치고 있다고 생각한다. "특성의 각 고유 튜플에 대해 새 인덱스로 새 버텍스를 도입하고 인덱싱 된 특성을 바꿉니다 ..." 얼굴 내에서 obj의 정점에는 연결된 법선이 있습니다. 같은 꼭지점을 공유하는 다른면 내에서 그 꼭지점은 다른 법선을가집니다. OpenGL의 정점 법선 속성은 면당 정점 당 하나의 정점을 나타내며, 어느 정면에 속해 있는지에 관계없이 단일 정점의 단일 법선을 나타 냅니까? necropost를 유감으로 여긴다. –

+1

@ JohnP : 내 대답의 맨 처음 문장을 다시 읽어주십시오. 같은 위치에 두 개의 정점이 있고 다른 정점이 있다면, 그들은 다른 * 정점입니다! Wavefront OBJ 파일은 * positions * "vertices"(그들은 위치가 아님)와 "vertex"및 "vertex normal"레코드로 얼굴 레코드 인덱스를 호출하기 때문에 잘못되었습니다. (레코드의 적절한 이름은 " 위치 기록 "과"정상 기록 "). – datenwolf