2016-07-18 17 views
1

C++とEclipse/Visual C++で少しOpenGL Engine 3Dを書いています。概説すると、私のエンジンは典型的なGameObject仮想クラスから派生したいくつかのオブジェクトを持っています。私の階層には、オブジェクトに子と親があるかどうかによっていくつかのレベルがあります。たとえば、地形オブジェクトはレベル0にあります。ブレンダーからロードされたタンクはレベル1にあります。OpenGLシェーディング言語のベストプラクティス

問題は、対応するシェーダーに応じて各オブジェクトをレンダリングするためのベストプラクティスです。同じシェーダープログラムでオブジェクトレンダラーのリストがある場合は、オブジェクト間のすべてのオブジェクトVAOをレンダリングする必要があります。glUseProgram(program_id)... glUseProgram(0)各オブジェクトのプログラムを変更するのではなく、すなわち:

for each object 
glUseProgram(object.program) 
    ... 
    glBindVertexArray(m_pVao->m_vaoHandle); 
    for (GLuint i = 0; i < (m_iNumIndex/3); i++) 
    { 
    offset = i * 3; 
    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, &m_Index[offset]); 
    } 
glBindVertexArray(0); 

または:擬似擬似コード

glUseProgram(object.program) 
    ... 
    for each object in program.list 
    glBindVertexArray(object.m_pVao->m_vaoHandle); 
    for (GLuint i = 0; i < (m_iNumIndex/3); i++) 
    { 
     offset = i * 3; 
     glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, &m_Index[offset]); 
    } 
glBindVertexArray(0); 

申し訳ありません。

オブジェクトはstd :: vectorに格納でき、すべてのシェーダにはオブジェクトのリストがあります。

答えて

0

最もコストのかかる操作(バインディングプログラム、シェーダー、テクスチャなど)はできるだけ少なくします。あなたの設計がそれを許すならば、ループの外側で束縛し、リソースを再利用してください。とにかく後で行う最も基本的なパフォーマンスの最適化の1つです。

関連する問題