2011-02-08 3 views
1

OpenGL에서 렌더링 할 다른 모델이 있습니다. 모든 모델에는 서로 다른 정점과 인덱스가 있습니다.OpenGL의 vbo 관리

vbo를 사용하여이 모델을 렌더링 할 때 따라야 할 모범 사례는 무엇입니까? 렌더링을 위해 각 모델에 대해 VBO를 작성해야합니까? 몇 가지 작은 VBO를 사용하면 몇 가지 큰 VBO를 사용하는 것뿐만 아니라 큰 성능이 나빠질 것이라고 읽었습니다.

예를 들면 : 나는 상자와 그 옆에 차가있다. 상자의 정점은 8이고 차의 정점은 2000이며 완전히 다른 수이다. 나는 다른 모델을 가지고 있으며 때로는 사라질 수도 있습니다. 즉,이 모델은 서버 측 버퍼에서 제거되어야합니다. 어떻게해야합니까?

어쩌면 누군가가 나를이 혼란을 없애고 내 상황을 처리 할 수있는 좋은 방법을 제시하는 기사로 안내 할 수 있습니다.

답변

3

나는 당신을 위해 잘 작동하는 버퍼 크기를 찾고, 가능한 경우 VBO에 귀하의 vert 데이터를 결합합니다. 타겟 하드웨어가 실제로 이것을 지시 할 것이므로 다른 번호로 놀아 보는 것이 가장 좋습니다.

모델에서 렌더링에 실제로 사용해야하는 VBO의 오프셋을 참조하려면 일부 클래스를 사용하십시오. 예를 들어 상자와 자동차가 있습니다.

class MeshManager 
{ 
public: 
    int loadMesh(const Mesh * mesh) 
    { 
     //load the mesh 
     //Add it to some current VBO or manage the creation of VBOs better. 
     ManagedMesh managedMesh(theVao, theVbo, theOffset, theLength, theType, theIdentifier); 
     theIdentifier++; 
    } 
private: 
    std::map<std::string, ManagedMesh> meshMap; 
    int theIdentifier; 
} 

class Renderer 
{ 
public: 
    void render(int meshId, Vector3f translation, Vector3f rotation); 
} 

int main(int argc, char** argv) 
{ 
MeshManager meshManager; 
Model model("mymodel.obj"); 
const Mesh * meshes = model.getMeshes(); 
int meshCount = model.getMeshCount(); 
for(int i=0; i<meshCount; i++) 
{ 
    meshManager.loadMesh(mesh); 
} 
model.freeMeshes(); 
} 

뭔가 종류. 분명히 나는로드 된 메쉬 ID를 저장하지 않을 것이지만 당신이 그림을 얻은 것 같아요. 나는 전문가는 아니지만, 이것이 내가 어떻게 할 것인지에 대한 대략적인 예입니다. 또한 가능한 한 배치 렌더링을 시도하는 것을 잊지 마십시오. 렌더링을 1)로드해야하는 VBOs 2)로드해야하는 자료로 정렬하십시오. GPU를 계속 켜고 끄는 작업은 비용이 많이 듭니다. 시행 착오는 게임의 이름입니다 (게임이 프로그래밍 됨).