2012-04-23 2 views
2

나는 wavefront 오브젝트 파서를 완성하고 있으며이를 사용하여 일반 메쉬 오브젝트를 구성하고 싶습니다. 내 엔진은 OpenGL 4와 쉐이더를 사용하여 엔진의 모든 것을 그립니다.일련의 하위 그룹으로 OpenGL의 메쉬 렌더링?

제 질문은 메쉬를 렌더링 할 때 최상의 렌더링 효율을 보장하는 방법에 관한 것입니다.

wavefront .obj file에는 일반적으로 많은 개체 하위 그룹이 지정되어 있습니다.

하위 그룹에 특정 재료 (예 : 반짝이는 붉은 색)가 지정 될 수 있습니다.

그래서 메쉬는 매우 복잡한 하위 그룹의 컬렉션 일 수 있습니다. 각각의 고유 한 재료가 할당되어 있습니다.

내 질문이 있습니다 -

Q. 음주 내가 따로 예를 들어, 각 하위 그룹을 그릴 필요 각 하위 그룹에 대해 glDrawElements가 호출 되었습니까? 이 맞으면

glDrawElements(GL_TRIANGLES, nNumIndicesInGroup, GL_UNSIGNED_INT, ((char*)NULL)+ first-vertex-offset); 

(I 4 별도의 하위 그룹이 있다면 그래서, 나는함으로써 재료/텍스처 4 개 일정 변경()와 쉐이더 4 번을 호출, 네 glDrawElements 통화를해야 할 것이다) 다음 I 계산해야 : 서브 그룹의 시작 오프셋 (각각의 서브 - 그룹에 대한 별도의 인덱스 어레이 VAO 암시) 각 서브 그룹

인덱스들 정점

이것은 대단히 비효율적 인 것처럼 보입니다. 잘못된 나무를 짖고 있습니까? Wavefront obj wiki page에서 또한

:

Smooth shading across polygons is enabled by smoothing groups. 
s 1 
... 
    # Smooth shading can be disabled as well. 
    s off 
    ... 

사람이 부드러운 음영 값을 나타냅니다 무엇을 제안 할 수 있습니다? 예 : s1, s2, s4 등

+1

이 질문은, 위에서 언급했듯이, 정점 데이터가 무엇이고 무엇을 할 것인가에 대해 더 많이 알지 못하면 대답 될 수 없습니다. 재료, 쉐이더 등과 같은 질문은 모두 성능에 영향을 미칩니다. –

답변

9

예. 각 하위 그룹을 다른 그룹과 구분하여 그려야합니다. 이것은 하위 그룹간에 상태가 다를 때까지 필요합니다.

하지만 너무 오랜 단계를 만들고 있습니다.

다중 그리기 호출을 피하기 위해 균일 한 배열 값 (재료 배열, 텍스처 배열)에 액세스하는 데 사용되는 인덱스를 나타내는 정점 특성을 도입 할 수 있습니다. 이런 식으로 드로우 콜은 하나만 필요하지만 추가 속성 하나와 그 상대적인 관리 비용이 들게됩니다.

나는 위의 접근법을 피할 것이다. 하위 그룹이 질감이 있고 다른 그룹이 질감이 아닌 경우에는 어떻게해야합니까? 짜임새 여부를 어떻게 차별합니까? 다른 속성 소개? 혼란스러워 보입니다.

첫 번째 요점은 버퍼 개체 관리가 매우 유연하다는 것입니다. 실제로 단일 요소 버퍼 오브젝트와 단일 버텍스 버퍼 오브젝트를 가질 수 있습니다. 오프셋 및 인터리빙을 사용하면 모든 수준의 복잡성을 충족시킬 수 있습니다. 그런 다음 현대 harware에서는 버텍스 배열 객체를 사용하여 다양한 버퍼 바인딩 비용을 최소화 할 수 있습니다.

둘째 요점은 소프트웨어가 동일한 균일 상태를 가진 여러 하위 그룹을 그룹화 할 수 있으며 여러 번의 그리기 호출을 하나의 단일 호출로 결합 할 수 있다는 것입니다. 멀티 드로잉 엔트리 포인트 변형을 사용할 수 있으며, 원할 할 수있는 기본 다시 시작도 있습니다 (스트라이프 된 프리미티브의 경우).

복잡하지 않더라도 어쨌든 그릴 필요가 있으므로 다른 고려 사항은 유용하지 않습니다. 계속해서 올바른 렌더링이 이루어지면 응용 프로그램과 렌더링을 프로파일 링하여 핫스팟을 잘라낼 수 있습니다.


평활화 그룹은 동일한 옵션 속성 (법선, 텍스처 좌표)을 공유하는 정점들의 모음입니다. 요소 인덱스 된 정점의 경우입니다.

제목을 자세히 읽으려면 specification에서 검색해보세요.

+0

안녕하십니까, 답변 해 주셔서 감사합니다. 평판 포인트가 15 점이되면, 응답을 upvote하겠습니다. – fishfood