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に格納でき、すべてのシェーダにはオブジェクトのリストがあります。