2012-10-26 4 views
1

내 장면의 모델을 설명하는 클래스가 있다고 가정합니다 (예 : 사각형). 이 클래스에는 가장 중요한 모델 행렬과 VAO가 포함됩니다. 내 렌더링 코드에서 도면 루프를 설계 할 때 나는 이제 다음 (의사 코드)를 수행 한 번OpenGL VAO 및 유니폼 : 렌더링 루프의 여러 모델 처리

functon draw{ 
    bind VAO 
    draw elements 
    /* How to handle the uniforms that are different for each model?? */ 
} 

:

functon draw{ 
    list = getListOfMeshes() /* List containing mesh class items */ 
    iterate list { /* could be for example 1000 different models */ 
    set model matrix uniform 
    bind VAO 
    draw elements 
    } 
} 

내가이 아마 한 VAO 호출에 최적화 될 수 있음을 이해 나는이 장면 반복이 병목이되는 장면에서 많은 모델을 얻는다. 이 rendring 루프를 디자인 할 수있는 다른 방법이 있습니까?

+1

유니폼 배열을 업로드하고 glDrawElementsInstanced 명령을 사용하여 인스턴스 ID별로 액세스 할 수 있습니다. 이 글을 읽고 싶을 수도 있습니다. http://www.opengl.org/wiki/Vertex_Rendering#Instancing – Tim

+2

나는 당신이 성취하려고 시도하는 것을 이해 합니다만, 이것이 좋은 생각이라고 생각하지 않습니다. 한 장면에서 주어진 메쉬를 여러 번 재사용하고 싶지만 다른 유니폼 세트를 적용했다면 어떨까요? 입자 시스템 및 유사한 상황에 대해 생각하십시오. – datenwolf

+0

@Tim : 이것은 아마도 내가 생각했던 것과 일치합니다. 이 경우 코드에서 일부 위치가 업데이트되면 버퍼 배열의 인스턴스 만 업데이트하면됩니까? (예 : 애니메이션 루프). 예를 들어 올바른 모델 행렬에 액세스하기 위해 정점 셰이더에서 gl_InstanceID를 사용해야합니까? – toeplitz

답변

-1

모델 인터페이스를 만들고 싶습니다. 그런 다음 인터페이스를 기반으로 항목 목록을 만듭니다. 이렇게 뭔가

<code> 
class interface{ 
    virtual render() = 0; 
    virtual setUniforms()=0; 
}; 

class object : public interface{ 
    render(); 
    setUniforms(); 
}; 
</code> 

이 방법으로, 당신은 당신이 호출하고자하는 유니폼 유형에 의해 사용중인 각 모델에 대한 유니폼 기능을 호출 할 수 있습니다. 따라서 노멀 맵을 필요로하는 것들은 그 유니폼을 가질 수 있고, 다른 유니폼들은 그것들을 가질 수 있어야합니다. 구현 된 모든 uniform 호출은 setUniforms()의 객체 클래스 구현에 포함됩니다. 인터페이스가 일반 인터페이스이므로 루프와 코드는 인터페이스를 충족시키는 목록에 전달하는 각 객체에 대해 적절한 함수를 실행합니다.

호프가 도와 드리겠습니다. :)

+0

나는 이것이 내가 무엇을했는지 확신하지 못한다. 내가 어떻게이 루프를 최적화하는지 알지 못한다. – toeplitz

+0

내 잘못, 나는 그 질문을 이해하지 못했을 것 같아. –