トップ回答者
DirextX / 正射影で重なり合う複数のメッシュを正常に表示させたい

質問
-
お世話になります。よろしくお願いいたします。
VB2008+DirectX9.0cで3次元図を作成するアプリケーションを開発しています。
正射影で,重なりあう複数のメッシュを表示させようとしています。
市販の参考書のおまけのソースコードのPerspectiveFovLHを単純にOrthoLHに置き換えると,zバッファが無視されるためか,添付の図のように重なり具合が異常になります。
(1)DirectX9.0cでこれを正確に表示させることはできるでしょうか。
(2)できる場合は,そのための勘所をご教示ください。
(3)できない場合は,DirectX11ではできるでしょうか。
以上,ご助力頂ければ幸いです。返信は来週月曜日以降になります。
-------------------------------------------------------
↓図1. PerspectiveFovLHを使用した場合
↓図2. OrthoLHを使用した場合
- 編集済み monger_monger 2016年7月22日 7:24
回答
-
質問をするときは開発環境・実行環境に関して詳しく書きましょう。IDEのバージョン、ライブラリのバージョン、OSのバージョンのほか、グラフィックス関連ではCPU/GPUなどハードウェアの情報も開示したほうがよいです。また、「市販の参考書」というのがどういう書籍名なのかということもきちんと書きましょう。
開発環境はVisual Basic 2008 + DirectX 9.0cとのことですが、Managed DirectX (MDX) 1.1を使っているのでしょうか? 具体的にいうと、Microsoft.DirectX.dll/Microsoft.DirectX.Direct3D.dll/Microsoft.DirectX.Direct3DX.dllなどを参照設定に追加しているのでしょうか? それとも何か別のサードパーティ製ライブラリを使っているのでしょうか? MDXはすでにマイクロソフトによる正式サポートが終了しているので、できれば今後は使用しないほうがよいと思われます。Windows XPのサポートを捨ててもよいのであれば、Visual Studio 2012以降と、コミュニティによる開発が継続されているSharpDX 3.0以降の組み合わせをお勧めします。
射影変換行列の生成時にどういうパラメータを渡しているのか、Zバッファのフォーマットが何であるのか、また各種レンダリングステートがどうなっているのかが具体的に示されていないのでなんとも言えませんが、正射影でポリゴンが欠けているのは、おそらくZ_NearとZ_Farの深度差に対して、Zバッファの精度が足りていないせいです。正射影は視錐台(ビューボリューム)のWidth, Height, Z_Near, Z_Farを指定しますが、Zバッファの精度が16bit程度の場合にZ_NearとZ_Farの差を大きくして広大なシーンをまるごと描画しようとすると、Zバッファの精度が足りないせいで深度判定が正確に行なわれなくなり、交差部分をきれいに描画できなくなります。この原理はDirect3D 9/10/11/12であろうがOpenGLであろうが関係ありません。対処法としては、Zバッファの精度を24bitもしくは32bitにするか、あるいはZ_Near/Z_Farのパラメータ設定を最適化(必要十分な範囲に制限)します。
なお、質問をするときは可能な限りソースコードも提示するのがマナーです。回答者はエスパーではありません。
最後にもう1点、これは余計なお世話かもしれませんが、VB/VB.NETで3Dグラフィックスプログラミングをやるのはお勧めしません。C/C++やC#に比べて、情報量が圧倒的に少ないです。世に存在するDirect3D/OpenGLの解説やサンプルは、ほとんどがC/C++前提です。また、オープンソースの各種ライブラリやミドルウェアを利用する際に、デバッグやトラブルシューティングのために実装を調べることになった場合、C/C++やC#の知識・経験がないと話になりません。C/C++やC#で書かれたプログラムをVB/VB.NETに移植するのが趣味とかいうニッチな目的でもない限り、最初からC/C++やC#を使うことを強くお勧めします。
- 編集済み sygh 2016年7月24日 17:46
- 回答としてマーク monger_monger 2016年7月25日 1:27
すべての返信
-
質問をするときは開発環境・実行環境に関して詳しく書きましょう。IDEのバージョン、ライブラリのバージョン、OSのバージョンのほか、グラフィックス関連ではCPU/GPUなどハードウェアの情報も開示したほうがよいです。また、「市販の参考書」というのがどういう書籍名なのかということもきちんと書きましょう。
開発環境はVisual Basic 2008 + DirectX 9.0cとのことですが、Managed DirectX (MDX) 1.1を使っているのでしょうか? 具体的にいうと、Microsoft.DirectX.dll/Microsoft.DirectX.Direct3D.dll/Microsoft.DirectX.Direct3DX.dllなどを参照設定に追加しているのでしょうか? それとも何か別のサードパーティ製ライブラリを使っているのでしょうか? MDXはすでにマイクロソフトによる正式サポートが終了しているので、できれば今後は使用しないほうがよいと思われます。Windows XPのサポートを捨ててもよいのであれば、Visual Studio 2012以降と、コミュニティによる開発が継続されているSharpDX 3.0以降の組み合わせをお勧めします。
射影変換行列の生成時にどういうパラメータを渡しているのか、Zバッファのフォーマットが何であるのか、また各種レンダリングステートがどうなっているのかが具体的に示されていないのでなんとも言えませんが、正射影でポリゴンが欠けているのは、おそらくZ_NearとZ_Farの深度差に対して、Zバッファの精度が足りていないせいです。正射影は視錐台(ビューボリューム)のWidth, Height, Z_Near, Z_Farを指定しますが、Zバッファの精度が16bit程度の場合にZ_NearとZ_Farの差を大きくして広大なシーンをまるごと描画しようとすると、Zバッファの精度が足りないせいで深度判定が正確に行なわれなくなり、交差部分をきれいに描画できなくなります。この原理はDirect3D 9/10/11/12であろうがOpenGLであろうが関係ありません。対処法としては、Zバッファの精度を24bitもしくは32bitにするか、あるいはZ_Near/Z_Farのパラメータ設定を最適化(必要十分な範囲に制限)します。
なお、質問をするときは可能な限りソースコードも提示するのがマナーです。回答者はエスパーではありません。
最後にもう1点、これは余計なお世話かもしれませんが、VB/VB.NETで3Dグラフィックスプログラミングをやるのはお勧めしません。C/C++やC#に比べて、情報量が圧倒的に少ないです。世に存在するDirect3D/OpenGLの解説やサンプルは、ほとんどがC/C++前提です。また、オープンソースの各種ライブラリやミドルウェアを利用する際に、デバッグやトラブルシューティングのために実装を調べることになった場合、C/C++やC#の知識・経験がないと話になりません。C/C++やC#で書かれたプログラムをVB/VB.NETに移植するのが趣味とかいうニッチな目的でもない限り、最初からC/C++やC#を使うことを強くお勧めします。
- 編集済み sygh 2016年7月24日 17:46
- 回答としてマーク monger_monger 2016年7月25日 1:27