2014-03-12 4 views
0

처음에는 3D 프로그래밍과 libgdx를 처음 사용했습니다. 몇 가지 자습서를보고 이미 원하는 장면을 렌더링합니다. 모든 보이는 얼굴에 대해 ModelBuilder.createRect()으로 생성 된 1x1x1 블록이 있으므로 다른 블록이이 블록의면을 덮고 있으면이 블록에 대해 rect가 작성되지 않습니다. 또한 꼭지점과 바닥 꼭지점은 필자가 볼 수 없기 때문에 필요하지 않습니다 (바닥을 제외하고). 그래서 저는 이것이 매우 효율적이라고 생각했습니다. 또한 Backface culling이 활성화되어 있고 Viewfrustum culling을 사용하고 있습니다. 그러나, 방향을 보면, 많은 블록이 내 viewfrustum에 있으며, FPS는 15-20으로 내려갑니다. 내 노트북은 5 세 이상이고 성능은 최고가 아니기 때문에 이것은 여전히 ​​괜찮습니다. 그러나 this answer은 저를 생각하게했습니다.Libgdx로 효율적인 3D 블록 렌더링

"ModelBuilder는 디버그에만 사용됩니다." 좋아, 그럼 어떻게 내 상자를 만들어야하니? 간단한 사각형에 대해 모델링 앱 (Blender와 같은)에서 Model을 만들어야하는 이유는 무엇입니까? 이렇게하면 다른 블록이 차지하는 얼굴을 도저히 추려 낼 수 없습니다. 제 질문은 : 어떻게 그 상자를 가장 효율적으로 만들고 렌더링 할 수 있습니까?

+0

IIRC를 사용하면 모든 직사각형에 대해 하나의 그리기 호출이 이루어 지므로 많은 사각형이 있으면 매우 비쌉니다. DecalBatch에서 수행중인 작업을 확인하십시오. 모든 직사각형을 단일 그리기 호출로 결합 할 수 있습니다. – Tenfour04

+0

그러나'ModelBatch'는 버퍼가 가득 차면'flush()'를하지 않으므로 GPU에 한 번만 보내집니다. 또한 DecalBatch는 내가 아는 것만 큼 필요한 것은하지 않으며 3D 공간에서 2D 'Texture'를 그립니까? – Springrbua

+0

아 맞습니다. 블렌딩을 사용하고 있습니까? 얼마나 많은 rect를 그리는거야? DecalBatch는 텍스처가없는 직사각형을 그릴 수 있습니다. 사용자 정의 GroupStrategy를 설정하면됩니다. 이 사람 (http://www.badlogicgames.com/forum/viewtopic.php?f=11&t=12493&p=55804&hilit=decalbatch#p55804)은 DecalBatch와 ModelBuilder가 직사각형에 대해 비슷한 성능을 가지고 있음을 발견했습니다. – Tenfour04

답변

1

ModelBuilder # createRect는 각 사각형에 대해 새 모델을 만듭니다. 모델 인스턴스의 일부를 렌더링 할 때 draw 호출을 의미합니다. 따라서 ModelBuilder # createRect는 매우 비효율적입니다. 여러 직사각형을 하나의 모델 (부분)으로 결합하는 것이 좋습니다. 이는 다음을 사용하여 수행 할 수 있습니다.

modelBuilder.begin(); 
MeshPartBuilder mpb = modelBuilder.part(....); 
mpb.rect(...); // first rect. 
mpb.rect(...); // second rect. 
// etc. 
Model model = modelBuilder.end(); 

복셀 엔진. 보셀 최적화를 목표로하는 경우 사용자 정의 RenderableProvider에서 메시 (절두체 컬링 및 깊이 정렬 후)를 작성하고자 할 수 있습니다. 예를 들면 다음과 같습니다. https://github.com/libgdx/libgdx/tree/master/tests/gdx-tests/src/com/badlogic/gdx/tests/g3d/voxel

+0

어제'MeshPartBuilder'를 사용하기 시작했습니다.'Texture'에 UV를 줄 수있는 것을 보았습니다. 귀하의 답변에 많은 감사드립니다. 이것에 대한 또 다른 작은 질문 : 만약 내가 왼쪽 테두리 벽 전체에서 하나의'모델'을 만들면. 이 방법이 더 효율적입니까? 그러면 절두체 절두 곡을 사용하여 몇 가지 작은 부분 (4 부분 말)을 렌더링 할 수 있습니까? – Springrbua

+1

그 질문에 대답하는 유일한 방법은 벤치 마크입니다. 너무 많은 변수 (버텍스 수, 쉐이더 복잡성, GPU 등)에 달려 있습니다. 대부분의 경우 이러한 질문은 조기 최적화를 나타냅니다. 실제로 상식을 사용하고 문제가 발생할 경우에만 최적화하는 것이 가장 좋습니다. 예 : 절두체에 함께있을 수있는 고정 부분을 결합하고, 한 부분이 제거 될 가능성이 있고 다른 부분이 동일하지 않을 때 분할 된 부분과 동일하고 중복되는 분할 된 부분을 서로 독립적으로 병합 할 수 있습니다. – Xoppa

+0

많은 덕분에 Xoppa 정말 도움이되었습니다. 그리고 멋지고 사용하기 쉬운 3D API +에 대한 작업에 감사 드리며 사용하는 초보자를 도와줍니다. P 계속! – Springrbua