About
Contents
STL
Android
Eigen
enchant.js
Firefox OS
OpenGL
OpenGL ES 2.0
pukiwiki
UE4
Unity
Windows Phone
Xamarin
Materials Link
その他
PR
STL
Android
Eigen
enchant.js
Firefox OS
OpenGL
OpenGL ES 2.0
pukiwiki
UE4
Unity
Windows Phone
Xamarin
FBXの情報が取得できていますので、これを利用してOpenGLを使ってモデルを表示してみます。まず、描画に必要な情報を収集するための構造体を用意します。
struct COLOR_RGBA { float r, g, b, a; }; struct VERTEX_DATA { Vector3 vPos; Vector3 vNor; Vector2 vTexcoord; }; struct MATERIAL_CONSTANT_DATA { COLOR_RGBA ambient; COLOR_RGBA diffuse; COLOR_RGBA specular; COLOR_RGBA emissive; }; struct MATERIAL_DATA { COLOR_RGBA ambient; COLOR_RGBA diffuse; COLOR_RGBA specular; COLOR_RGBA emissive; float specularPower; float TransparencyFactor; // 透過度。 MATERIAL_CONSTANT_DATA materialConstantData; }; // ノード。 struct MESH_NODE { std::vector<VERTEX_DATA> VtxData; unsigned long vertexCount; unsigned long indexCount; std::vector<MATERIAL_DATA> materialData; float mat4x4[16]; MESH_NODE() { vertexCount = 0; indexCount = 0; } };
MESH_NODE 構造体が、が全ての情報を受け取ります。そうすると、描画は以下の様になります。
// モデル描画 void DrawModel() { glEnableClientState( GL_VERTEX_ARRAY ); glEnableClientState( GL_NORMAL_ARRAY ); for( size_t i = 0; i < s_nodeCoount; i++ ) { glPushMatrix(); { // size_t mat_count = s_pMeshNode[ i ].materialData.size(); // for( size_t j = 0; j < mat_count; j++ ) { // MATERIAL_DATA* pMat = &s_pMeshNode[ i ].materialData[ j ]; MATERIAL_DATA* pMat = &s_pMeshNode[ i ].materialData[ 0 ]; if( !pMat ) { continue; } glMaterialfv( GL_FRONT_AND_BACK,GL_AMBIENT, (const GLfloat *)&pMat->ambient ); glMaterialfv( GL_FRONT_AND_BACK,GL_DIFFUSE, (const GLfloat *)&pMat->diffuse ); glMaterialfv( GL_FRONT_AND_BACK,GL_SPECULAR, (const GLfloat *)&pMat->specular ); glMaterialf( GL_FRONT_AND_BACK, GL_SHININESS, pMat->specularPower ); glDisable( GL_TEXTURE_2D ); glDisableClientState( GL_TEXTURE_COORD_ARRAY ); if( s_pMeshNode[ i ].VtxData.size() > 1 ) { glVertexPointer( 3, GL_FLOAT, sizeof( VERTEX_DATA ), &s_pMeshNode[ i ].VtxData[ 0 ].vPos.x ); glNormalPointer( GL_FLOAT, sizeof( VERTEX_DATA ), &s_pMeshNode[ i ].VtxData[ 0 ].vNor.x ); glDrawArrays( GL_TRIANGLES, 0, s_pMeshNode[ i ].VtxData.size() ); } } } glPopMatrix(); } glDisableClientState( GL_VERTEX_ARRAY ); glDisableClientState( GL_NORMAL_ARRAY ); glDisableClientState( GL_TEXTURE_COORD_ARRAY ); glDisable( GL_TEXTURE_2D ); }
ここでは、マテリアルは一つだけに対応しています。