トップページ > 過去ログ > 記事閲覧
DrawPolygonIndexed3Dの仕様について
名前:ffm8 日時: 2012/09/14 19:04

どうも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 ) ; } }

Page: 1 |

Re: DrawPolygonIndexed3Dの仕様について ( No.1 )
名前:いっち 日時:2012/09/14 23:09

ぱっと見以下の部分がおかしいと思います。 // 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 ; 右辺は 4*i+n ではないでしょうか?
Re: DrawPolygonIndexed3Dの仕様について ( No.2 )
名前:ffm8 日時:2012/09/15 00:59

いっちさんありがとうございます。 おっしゃる通り4*i+nにしたら描画された画像が乱れるようなことはなくなりました。 Indexデータの意味をやはり少し勘違いしていたようです。 別パーティクルの頂点と混同して描画されていたのですね。 しかしエフェクトが重なっているように見えるのと異常な重さは健在で、 MAX_PARTICLE_NUMBERを10程度にして実験したところ、 やはり大量のエフェクトが重なっているとしか考えられません。 その辺りを考えるとDrawPolygonIndexed3Dは引数の頂点数、ポリゴン数から 一回の呼び出しでそのポリゴン数描画してしまうのでは無いかと思うのですがどうなのでしょうか? 引数にiも含まれていないので 引数の2*MAX_PARTICLE_NUMBERのポリゴンをループによってMAX_PARTICLE_NUMBER回描画しているのならこの重さなどにも納得がいきます。 ですが // 2ポリゴンの描画 DrawPolygonIndexed3D( Vertex, 4*MAX_PARTICLE_NUMBER, Index, 2*MAX_PARTICLE_NUMBER, Particle[ i ].GrHandle, TRUE ) ; を for( i = 0 ; i < MAX_PARTICLE_NUMBER ; i ++ ) { // パーティクルデータが無効だったらスキップ if( Particle[ i ].Valid == 0 ) continue ; } DrawPolygonIndexed3D( Vertex, 4*MAX_PARTICLE_NUMBER, Index, 2*MAX_PARTICLE_NUMBER, Particle[ i ].GrHandle, TRUE ) ; のようにループから出してしまうと描画されません。 Vertex、Index共にグローバル宣言されていると思うのですが… 2chの方に質問しようとしたら規制されていたので 以前本家の掲示板で聞けと言われたことがあったのを思い出してこちらを使わせていただきました。 時間に追われていたので口調が混ざってしまっていましたが今後ともよろしくお願いいます。
Re: DrawPolygonIndexed3Dの仕様について ( No.3 )
名前:ffm8 日時:2012/09/15 14:05

とりあえずは if(i==0) { DrawPolygonIndexed3D( Vertex, 4*MAX_PARTICLE_NUMBER, Index, 2*MAX_PARTICLE_NUMBER, Particle[ i ].GrHandle, TRUE ) ; } のようにでもしてやれば多重描画されることはなくなり、動作も劇的に軽くなりました。 これで当初の目標の、画像の乱れを直す、多重描画を改善する、というのは達成されました。 しかし、DrawPolygonIndexed3Dの仕様がわかったところで最も恐れていたことが問題になりました。 私はParticle[ MAX_PARTICLE_NUMBER ]の構造体に、例えば水しぶき、砂煙、マズルフラッシュ、弾薬、着弾時エフェクトなど、 基本的に全てのエフェクトに同一のメンバを持たせ、その値を決めるだけで描画されるといった環境を作って来ました。 ですがVertex、Index、の意味も分かり、DrawPolygonIndexed3D一つで一括描画される仕様であると分かったので 引数の Particle[ i ].GrHandle が変えられず単一のエフェクトしか描画できないことが分かりました。 これでは今まで整えてきた部分を整備し直す必要があります。 出来る事ならDrawPolygonIndexed3D一回の呼び出しで4*i+n番目の4頂点の2ポリゴンだけ描画できるようにしたいのですが 何か方法はありませんでしょうか。
Re: DrawPolygonIndexed3Dの仕様について ( No.4 )
名前:いっち 日時:2012/09/15 14:24

以下のように変更するとうまくいくと思います。 > DrawPolygonIndexed3D( Vertex, 4*MAX_PARTICLE_NUMBER, Index, 2*MAX_PARTICLE_NUMBER, Particle[ i ].GrHandle, TRUE ) ; ↓↓↓↓ 変更 ↓↓↓↓ > DrawPolygonIndexed3D( Vertex, 4*MAX_PARTICLE_NUMBER, Index+6*i, 2, Particle[ i ].GrHandle, TRUE ) ; 以下の部分については > for( i = 0 ; i < MAX_PARTICLE_NUMBER ; i ++ ) > { > // パーティクルデータが無効だったらスキップ > if( Particle[ i ].Valid == 0 ) continue ; > } > DrawPolygonIndexed3D( Vertex, 4*MAX_PARTICLE_NUMBER, Index, 2*MAX_PARTICLE_NUMBER, Particle[ i ].GrHandle, TRUE ) ; > > のようにループから出してしまうと描画されません。 > Vertex、Index共にグローバル宣言されていると思うのですが… i の値が常に MAX_PARTICLE_NUMBER になるため、配列 Particle の範囲外を参照しているのではないかと思います。
Re: DrawPolygonIndexed3Dの仕様について ( No.5 )
名前:ffm8 日時:2012/09/15 15:57

おおおお! いっちさんありがとうございます! なるほどアドレス参照の位置もこのように指定できるんですね。 描画されない理由も納得がいきました。 こんなに丁寧に答えてくださって本当に助かりました。 とりあえずこれでこのトピックの問題は解決しました。ありがとうございます。 細かな課題も出てきたものの、頼りっきりになるわけにもいかないので、 そちらはもう少し自分で試行錯誤してみようと思います。 最後に、少し趣旨とは外れますが、 以前から気になっていたことについて質問させてもらってもよろしいでしょうか。 手に持ったライフルの銃口を対象の方に向け続ける DXライブラリのモデルのアニメーションはMMDなどであらかじめモーションを作っておいて それを状況に合わせて再生するって形になっていると思うのですが 腕の動きは、あらゆる位置・相対角に移動する対象に向ける必要があり、 その全てにモーションなんか作れないため、 単純に各フレーム(ボーン)の角度なんかを関数として指定して動かすしかないと思うのですが DXライブラリでこういったことは出来るのでしょうか。 まだモーションについてはほとんど勉強できていないので また根本的な勘違いや見落としなどあるかもしれませんが、良ければ出来そうかどうかだけでも教えて下さい。 関節は多少おかしくなるとしても目をつぶります。
Re: DrawPolygonIndexed3Dの仕様について ( No.6 )
名前:いっち 日時:2012/09/15 19:18

> 単純に各フレーム(ボーン)の角度なんかを関数として指定して動かすしかないと思うのですが > DXライブラリでこういったことは出来るのでしょうか。 MV1SetFrameUserLocalMatrix等を使用します。 以下のスレッドがご参考になると思います。 > h t t p://hpcgi2.nifty.com/natupaji/bbs/patio.cgi?mode=view&no=2687
Re: DrawPolygonIndexed3Dの仕様について ( No.7 )
名前:管理人 日時:2012/09/15 21:25

> 手に持ったライフルの銃口を対象の方に向け続ける FPSもTPSも殆どプレイしたことが無いので見当違いなことを言ってしまうかもしれませんが、 FPSの場合は、銃を構えずに移動しているときやリロードしているときに画面に映っている 銃は多分キャラクターモデルにアタッチされていると思いますが、構えた後の 「画面にピタっ張り付いている銃」は恐らくキャラクターモデルの姿勢は関係なく、銃だけが カメラに合わせた座標で描画されているのだと思います TPSの場合は銃を持っているキャラクターが画面に表示されているので狙っている方向に 銃を向ける必要がありますが、逆にFPSほど銃口の向きが変かどうかがプレイヤーには 分からないので「狙っている位置にそれっぽく銃を向けている」だけでも違和感はありません ただそれでも、拳銃程度でしたら肩のボーン一つの向きを操作するだけで済むかもしれませんが、 両手で持って撃つタイプの銃では狙う向きが変わる場合は必ず複数のボーンが動きますので、 複数のボーンを計算で操作してそれっぽい方向を狙っているように姿勢を変えるのは大変です 有名所のTPSではもしかしたらIKなどを使いつつ複数のボーンの動きを計算で 割り出すということをしているかもしれませんが、労力を考えると何種類かの方向に 銃を構えているモーションを作成して、狙っている方向に合わせてそれらのモーションを ブレンドすることで違和感が感じられない程度には銃口が狙っている位置の方を向いている、 程度で済ませるのが良いのではないかと思います
Re: DrawPolygonIndexed3Dの仕様について ( No.8 )
名前:ffm8 日時:2012/09/16 01:23

いっちさん度々ありがとうございます。 結局見落としていたようで申し訳ないです。 今回の件で途端に視界がひらけました。本当にありがとうございます。 管理人様どちらかと言えばTPSになると思いますがおっしゃる通りのことを考えておりました。 そこまで正確にするつもりはなく、単に方向性が見えず不安だったので聞かせていただきました。 またモーションに着手して知識が深まった頃に質問させていただこうと思います。 また、何度も申し訳ないのですが 問題点を思い出しましたのでもう一つお願いします。 ConvWorldPosToScreenPosの解説で >尚、指定のワールド座標とカメラの視線方向との距離が SetCameraNearFar で設定した範囲から外れていた場合は戻り値のZが 0.0f以下又は1.0f以上になり、その際のX、Yはスクリーン座標とは無関係の値となります。 とありますが0.0f以下又は1.0f以上になってしまう場合、スクリーン座標を得ることは出来ないのでしょうか。 あと、このトピックを解決にするのは単純に名前欄に解決を含ませるだけで良いのでしょうか。
Re: DrawPolygonIndexed3Dの仕様について ( No.9 )
名前:ffm8 日時:2012/09/17 20:31

大事なことを忘れていました。 変わらずDrawPolygonIndexed3Dに関してですが、リファレンスで >尚、頂点インデックスは型が unsigned short なので、使用できる頂点データの数は最大で 65536個となります。 と、ありますがunsigned longなどに変える方法はないでしょうか。 1エフェクト4頂点として15000エフェクトぐらいなら 超えてしまいそうなので対策をする必要がありそうです。
Re: DrawPolygonIndexed3Dの仕様について ( No.10 )
名前:いっち 日時:2012/09/18 01:20

> と、ありますがunsigned longなどに変える方法はないでしょうか。 DXライブラリを改造すれば可能です。
Re: DrawPolygonIndexed3Dの仕様について ( No.11 )
名前:管理人 日時:2012/09/22 22:33

グラフィックスデバイスによっては一度に65536頂点以上を扱えないことがある上 65536頂点以上扱える場合も unsigned long で表現できる最大の値まで対応している というわけではなく、グラフィックスデバイスごとに差異があります unsigned short を使用している限りは少なくともそのあたりのことを気にしなくて良いので、 少し手間かもしれませんが unsigned short を使って何回かに分けて描画する方法をお勧めします
Re: DrawPolygonIndexed3Dの仕様について ( No.12 )
名前:ffm8 日時:2012/09/23 01:38

やはり面倒ですが分けるしかないですか。 分かりましたその方向で考えてみます。 でももし書き換えるとすればどの辺りを書き換えればよいか アタリを付けられる程度にでも教えていただけないでしょうか。
Re: DrawPolygonIndexed3Dの仕様について ( No.13 )
名前:管理人 日時:2012/09/23 02:29

DrawPolygonIndexed3D は比較的単純な構造なのでDirect3D9の知識があれば DrawPolygonIndexed3D の中身を 追っていただければ簡単に unsigned long 対応は可能です ただ、最低限の Direct3D9 の知識は必要です
Re: DrawPolygonIndexed3Dの仕様について ( No.14 )
名前:ffm8(解決) 日時:2012/09/24 01:23

管理人様ありがとうございます。 ほとんど知識はないに等しいので出来るところまで 分けて描画する方法で頑張ってみます。 長々とお付き合い下さりありがとうございました。 これにて解決としたいと思います。

Page: 1 |