どうもDrawPolygonIndexed3Dの仕様が分かりません
2ポリゴン使って長方形のテクスチャ張ったビルボードを大量に描画したいんですが
DrawPolygonIndexed3Dは一括で引数の頂点数、ポリゴン数のポリゴンを描画してしまうのでしょうか?
一応複数表示するようにはなったんだけどどうも一つ一つのパーティクルが大量に重なったように見えるし、恐ろしく重いです
あと妙に細長くもなったり明らかに想定している4頂点で描画されてない気がします
http://www.dotup.org/uploda/www.dotup.org3420806.jpg
下みたいな感じで組んだんだけど何か根本的に間違っているんでしょうか
あとVec_X_Comp(YやZも)はパーティクルのローカルな直交した3軸の正規化したベクトルに、パーティクルのサイズ値(float)倍したものです
回転処理やサイズ展開の処理も全て済ませているし、それぞれの過程で正しい数字、方向を向いていることもDrawFormatStringやDrawLine3Dで確認しました
//ポリゴン形式のエフェクト描画の際の頂点配列
VERTEX3D Vertex[ 4*MAX_PARTICLE_NUMBER ] ;
WORD Index[ 6*MAX_PARTICLE_NUMBER ] ;
void Common_Particle_Draw_Process( void )
{
int i ;
for( i = 0 ; i < MAX_PARTICLE_NUMBER ; i ++ )
{
// パーティクルデータが無効だったらスキップ
if( Particle[ i ].Valid == 0 ) continue ;
// 4頂点分のデータをセット
Vertex[ 4*i+0 ].pos = VAdd( VAdd( VGet( Particle[ i ].X, Particle[ i ].Y, Particle[ i ].Z ) , VScale(Vec_X_Comp,-0.5)) ,VScale(Vec_Y_Comp,-0.5) ) ;
Vertex[ 4*i+0 ].norm = VAdd(VScale(Vec_X_Comp,-0.5),VScale(Vec_Y_Comp,-0.5) ) ;
Vertex[ 4*i+0 ].dif = GetColorU8(Particle[ i ].Col_r,Particle[ i ].Col_g,Particle[ i ].Col_b,Particle[ i ].Col_a) ;
Vertex[ 4*i+0 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 4*i+0 ].u = 0.0f ;
Vertex[ 4*i+0 ].v = 0.0f ;
Vertex[ 4*i+0 ].su = 0.0f ;
Vertex[ 4*i+0 ].sv = 0.0f ;
Vertex[ 4*i+1 ].pos = VAdd( VAdd( VGet( Particle[ i ].X, Particle[ i ].Y, Particle[ i ].Z ) , VScale(Vec_X_Comp,0.5)) ,VScale(Vec_Y_Comp,-0.5) ) ;
Vertex[ 4*i+1 ].norm = VAdd(VScale(Vec_X_Comp,0.5),VScale(Vec_Y_Comp,-0.5) ) ;
Vertex[ 4*i+1 ].dif = GetColorU8(Particle[ i ].Col_r,Particle[ i ].Col_g,Particle[ i ].Col_b,Particle[ i ].Col_a) ;
Vertex[ 4*i+1 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 4*i+1 ].u = 0.0f ;
Vertex[ 4*i+1 ].v = 1.0f ;
Vertex[ 4*i+1 ].su = 0.0f ;
Vertex[ 4*i+1 ].sv = 0.0f ;
Vertex[ 4*i+2 ].pos = VAdd( VAdd( VGet( Particle[ i ].X, Particle[ i ].Y, Particle[ i ].Z ) , VScale(Vec_X_Comp,-0.5)) ,VScale(Vec_Y_Comp,0.5) ) ;
Vertex[ 4*i+2 ].norm = VAdd(VScale(Vec_X_Comp,-0.5),VScale(Vec_Y_Comp,0.5) );
Vertex[ 4*i+2 ].dif = GetColorU8(Particle[ i ].Col_r,Particle[ i ].Col_g,Particle[ i ].Col_b,Particle[ i ].Col_a) ;
Vertex[ 4*i+2 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 4*i+2 ].u = 1.0f ;
Vertex[ 4*i+2 ].v = 0.0f ;
Vertex[ 4*i+2 ].su = 0.0f ;
Vertex[ 4*i+2 ].sv = 0.0f ;
Vertex[ 4*i+3 ].pos = VAdd( VAdd( VGet( Particle[ i ].X, Particle[ i ].Y, Particle[ i ].Z ) , VScale(Vec_X_Comp,0.5)) ,VScale(Vec_Y_Comp,0.5) ) ;
Vertex[ 4*i+3 ].norm = VAdd(VScale(Vec_X_Comp,0.5),VScale(Vec_Y_Comp,0.5) );
Vertex[ 4*i+3 ].dif = GetColorU8(Particle[ i ].Col_r,Particle[ i ].Col_g,Particle[ i ].Col_b,Particle[ i ].Col_a) ;
Vertex[ 4*i+3 ].spc = GetColorU8( 0, 0, 0, 0 ) ;
Vertex[ 4*i+3 ].u = 1.0f ;
Vertex[ 4*i+3 ].v = 1.0f ;
Vertex[ 4*i+3 ].su = 0.0f ;
Vertex[ 4*i+3 ].sv = 0.0f ;
// 2ポリゴン分のインデックスデータをセット
Index[ 6*i+0 ] = 6*i+0 ;
Index[ 6*i+1 ] = 6*i+1 ;
Index[ 6*i+2 ] = 6*i+2 ;
Index[ 6*i+3 ] = 6*i+3 ;
Index[ 6*i+4 ] = 6*i+2 ;
Index[ 6*i+5 ] = 6*i+1 ;
// 2ポリゴンの描画
DrawPolygonIndexed3D( Vertex, 4*MAX_PARTICLE_NUMBER, Index, 2*MAX_PARTICLE_NUMBER, Particle[ i ].GrHandle, TRUE ) ;
}
}
要は下みたいなことをもっと拡張性を持たせてやりたいんです
こっちなら常にカメラ方向を向く仕様だが正常に描画されてると思います
http://www.dotup.org/uploda/www.dotup.org3420812.jpg
void Common_Particle_Draw_Process( void )
{
int i ;
for( i = 0 ; i < MAX_PARTICLE_NUMBER ; i ++ )
{
// パーティクルデータが無効だったらスキップ
if( Particle[ i ].Valid == 0 ) continue ;
SetDrawBright(Particle[ i ].Col_r,Particle[ i ].Col_g,Particle[ i ].Col_b);
DrawModiBillboard3D( VGet( Particle[i].X , Particle[i].Y ,Particle[i].Z) , -Particle[i].sizeX/2, Particle[i].sizeY/2, Particle[ i ].sizeX/2, Particle[i].sizeY/2,
Particle[i].sizeX/2, -Particle[i].sizeY/2, -Particle[i].sizeX/2, -Particle[i].sizeY/2 ,Particle[i].GrHandle , TRUE ) ;
}
}