トップページ > 過去ログ > 記事閲覧
3Dモデルが透けて描画される
名前:hamu 日時: 2013/05/11 00:13

既出だったらすみません。 DXライブラリで3Dモデルを描画したいのですが、どうしても後ろにあるポリゴンが透けて描画されます。 正しく描画するにはどうすればいいでしょうか? xファイル、mqoファイルで試してみましたが、どちらも正しく描画されません。 しかし、DXライブラリ付属のビューワーでは正しく描画されます。 Zブァッファは有効にしてあります。 回答、よろしくお願いします。

Page: 1 |

Re: 3Dモデルが透けて描画される ( No.1 )
名前:管理人 日時:2013/05/12 03:43

ビューアーでは正しく描画されて、ライブラリでは正しく描画できない・・・ですか・・・ 一応ほぼビューアーと同じ処理で描画しているので、ちょっと原因が分かりません もし複数のモデルを描画していて発生するということでしたら、 半透明要素の無いモデルを先に描画して、そのあと半透明要素のあるモデルを カメラから遠いモデル順に描画すると解決すると思います Zバッファは半透明と相性が悪いので、先にカメラ( 視点 )に近い半透明のポリゴンを 描画してしまうと、後から描画した半透明のポリゴンよりカメラから遠いポリゴンを 描画しようとしても「既にもっと手前にポリゴンを描画したよ」と、描画が弾かれてしまって 結果先に描画した半透明のポリゴンより画面奥にあるポリゴンが描画されないという事態が発生します これを回避するにはカメラの近くにある半透明ポリゴンほど後に描画する必要があります ただ、完全に不透明のポリゴン同士はカメラから近かろうが遠かろうがZバッファが理想的に 機能するので、好きな順で描画してしまって問題ありません というわけで、描画の手順としては 不透明のモデルを描画 ↓ 半透明のモデルをカメラから遠い順に描画 となります もし一つのモデルの中に半透明の部分と不透明の部分がある場合は、 モデル内にあるメッシュを MV1GetMeshSemiTransState で半透明要素があるかどうかを判定して、 モデル単位ではなくメッシュ単位で描画することで不透明の部分だけを描画したり、半透明要素が ある部分だけを描画したりすることができます // モデル中の半透明の要素が無い部分だけを描画する int MeshNum ; int i ; // モデルに含まれるメッシュの数を取得 MeshNum = MV1GetMeshNum( ModelHandle ) ; for( i = 0 ; i < MeshNum ; i ++ ) { // 半透明要素があったら描画しない if( MV1GetMeshSemiTransState( ModelHandle, i ) == TRUE ) continue ; // メッシュを描画 MV1DrawMesh( ModelHandle, i ) ; } ↑こちらのプログラムの if( MV1GetMeshSemiTransState( ModelHandle, i ) == TRUE ) を if( MV1GetMeshSemiTransState( ModelHandle, i ) == FALSE ) にするだけで逆に半透明要素がある部分だけを描画することができます この方法を使用して、まず全モデルの不透明部分だけを描画して、 そのあと全モデルの半透明要素のある部分をカメラから遠いものから順に描画する、 という風にすれば解決すると思います ( 半透明要素のある物同士が画面内で重なる可能性が無いということでしたら、 半透明要素がある部分も順番を気にせず描画してしまっても大丈夫です ) よろしければお試しください
3Dモデルが透けて描画される ( No.2 )
名前:hamu 日時:2013/05/12 21:17

すみません、言い忘れていました 半透明要素はありません。 また、透けて見えるのは同一のオブジェクトのポリゴンであるため、描画の順番を指定するのは難しいように感じます。 まあ、自分でも引き続き解決策を探していきます。 回答ありがとうございました。

Page: 1 |