2016-07-09 1 views
0

오늘 저는 wavefront obj loader를 구현하기 시작했습니다. 그 이유는 OpenGL이 더 이상 GL_QUADS를 지원하지 않고 그 사용을 중단한다는 사실에도 불구하고 인터넷에 너무 많은 obj 파일이 있다는 것을 모릅니다.한면에 4 개의 정점이 포함 된 wavefront obj 파일이 아직 많이있는 이유는 무엇입니까?

해결 방법이 있습니까? 즉, GL_TRIANGLE_FAN 또는 GL_TRIANGLE_STRIP을 사용하여 4 개의 정점이 포함 된면을 그릴 때마다 비극적 인 결과가 표시됩니다. 그래서 결국에는 옵션이 없지만 각면에 draw 명령을 내릴 수 있습니다. 아시다시피 나쁜 성능을 보여줍니다. 각 그룹 또는 스무딩 그룹에 하나의 명령 만 발행하도록 그려야합니다.

아이디어가 있으십니까?

+2

다른 3D 렌더링 API는 삼각형으로 제한되지 않으므로 첫 번째 부분에 응답하십시오. 예를 들어, Pixar RenderMan의 기본 렌더링 프리미티브는 쿼드가 하위 집합 인 4 개의 정점 "마이크로 다각형"(쌍 선형 패치)입니다. 영화/TV CGI를하는 사람은 삼각형이 아닌 쿼드를 원할 것입니다. –

+0

. 코멘트 주셔서 감사합니다! – Windforces

답변

1

당신이 열 수있는 모델링 프로그램이있는 경우/마야 나 블렌더 등의 수출 OBJS, 나는 그것이 적절한 메뉴 옵션을 사용 를 삼각 측량,이 모델을 여는 권하고 싶습니다 한 다음 다시 수출을.

이들 중 하나에 액세스 할 수없는 경우 obj 데이터를 읽고 삼각형 처리하고 파일에 쓰는 프로그램을 작성하는 것이 상대적으로 간단해야합니다. obj 형식에 대해 좀 더 깊이 이해해야하지만 추가 소프트웨어는 필요하지 않습니다.

+0

OpenGL 개발자가 그런 종류의 소프트웨어를 설치하는 것이 필요하다고 생각하십니까? OpenGL을 사용하여 몇 가지 작업을 할 때마다 3D 파일을 어떻게 든 시각화 할 수있는 도구가 필요합니다. – Windforces

+0

오, 블렌더는 무료입니다. 나는 그것을 몰랐다! – Windforces

+1

3D 그래픽이있는 응용 프로그램을 개발하려는 경우 필자는 어떤 종류의 외부 모델링 소프트웨어를 사용하는 것이 좋습니다. 조기에 작업을 점검하는 좋은 방법입니다. 나중에 모델을 신속하게 만들거나 다른 형식으로 내보낼 필요가 있다면 매우 간단합니다. 블렌더는 무료이지만 학생 인 경우 Maya 및 3ds Max를 포함한 모든 Autodesk 제품을 무료로 이용할 수 있습니다. 편집 : 예, 정확히, – budjmt

1

OBJ는 OpenGL과 완전히 관련이없는 파일 형식이기 때문에.

OBJ 파일의 얼굴 명령문은 3 또는 4뿐만 아니라 모든 개수의 정점을 포함 할 수 있습니다. 4 이상을 포함하는 것은 드문 일이 아닙니다. 따라서 합리적인 다양한 OBJ 파일을 읽고 싶다면, 당신은 얼굴 당 정점의 개수를 읽을 준비가 필요합니다.

이것은 실제로 많은 어려움을 추가하지 않습니다. 알고리즘을 사용하여 연결을 분석하고 메쉬를 작성하지 않는 한 얼굴 당 정점이 3 개인 파일의 경우에도 얼굴 진술마다 별도의 삼각형이 표시됩니다. 따라서이 경우 얼굴 당 하나의 삼각형을 만들고 기본 유형 GL_TRIANGLES으로 그립니다.

얼굴 당 3 개 이상의 꼭지점이 변경되면 얼굴 당 여러 개의 삼각형이 생성됩니다. n 개의 꼭지점이있는 얼굴에는 n - 2 개의 삼각형이 필요합니다. 이 질문에 대한 내 대답은 어떻게 수행되는지 자세히 설명합니다 : Converting quadriladerals in an OBJ file into triangles?.

또 다른 옵션은 각 얼굴을 삼각형 팬으로 처리하고 GL_TRIANGLE_FAN 프리미티브 유형으로 렌더링하는 것입니다. 볼록 다각형 (파일 안의면이 볼록하지 않은 다각형 인 경우 분해 될 수 있음)은 정점을 원래 순서대로 정확하게 유지하면서 항상 삼각형 팬으로 그릴 수 있습니다. 별도의 삼각형 팬 등의 각면을 치료하려면, 같은 호출을 사용하여 OpenGL을 3.1부터 사용할 수있다 원시적 재시작 기능을 사용할 수 있습니다 :

glEnable(GL_PRIMITIVE_RESTART); 
glPrimitiveRestartIndex(...); 

그것은 OBJ는 OpenGL은 렌더링을 대상으로되지 않는다는 것을 알 쉽습니다. OpenGL은 모든 정점 속성에 사용되는 단일 색인 세트 만 지원하는 반면 OBJ는 위치, 법선 및 텍스처 좌표에 대해 별도의 색인을 사용한다는 점이 훨씬 귀찮은 측면입니다. 이것은 파서를 작성하는 사람들에게 훨씬 더 어려움을 초래하는 경향이 있습니다. 예를 들어 여기를 참조하십시오 : OpenGL - Index buffers difficulties.