====== 017 FBXモデルにテクスチャを張る ======
{{:wiki:opengl:tips:opengl_fbxddstexutredraw.png?200|}}
===== 概要 =====
読み込んだボリゴンモデルにテクスチャを張ります。
// DDS テクスチャローダー
static DDSUtil* s_pDDSLoader = NULL;
// UV の取得。
for( size_t j = 0; j < vertex_count ; j++ )
{
vtx.vTexcoord.x = (float)fbxNode.texcoordArray.at( j )[0];
vtx.vTexcoord.y = (float)fbxNode.texcoordArray.at( j )[1];
s_pMeshNode[ i ].VtxData.push_back( vtx );
}
// マテリアル。
for( size_t j = 0; j < material_count ; j++ )
{
FBX_MATERIAL_NODE matNode = fbxNode.materialArray.at( j );
// テクスチャの読み込み。
if( matNode.diffuse.textureSetArray.size() > 0 )
{
TextureSet::const_iterator it = matNode.diffuse.textureSetArray.begin();
if( it->second.size() )
{
std::string path = it->second[0];
s_pDDSLoader->Load( path.c_str() );
}
}
}
UV座標の取得とテクスチャのロードが完了しました。これで描画の準備は整いました。あとは描画時にテクスチャ、UVをを割り当ててあげれば良いです。
// テクスチャを割り当てる。
if( s_pDDSLoader->GetId() > 0 )
{
glEnable( GL_TEXTURE_2D );
glEnableClientState( GL_TEXTURE_COORD_ARRAY );
glBindTexture( GL_TEXTURE_2D, s_pDDSLoader->GetId() );
}
else
{
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 );
if( s_pDDSLoader->GetId() > 0 )
{
// UV設定。
glTexCoordPointer( 2, GL_FLOAT, sizeof( VERTEX_DATA ), &s_pMeshNode[ i ].VtxData[ 0 ].vTexcoord.x );
}
glDrawArrays( GL_TRIANGLES, 0, s_pMeshNode[ i ].VtxData.size() );
}