トップページ > 過去ログ > 記事閲覧
独自シェーダーでモデルの輪郭描画がうまくいかない
名前:みょも 日時: 2012/12/08 23:23

独自のシェーダーでトゥーンレンダリングの一環としてモデルの輪郭を描いているのですが、うまく動きません。 モデルのカリング面を逆にし、シェーダーで頂点を法線方向に伸ばして輪郭色で描画、 その後にモデルを通常描画するオーソドックスな手法を取っています。 しかし、こちらので配布されているモデル(ミクXS)の顔面部が黒く覆われてしまいます。 ttp://goo.gl/FTAhm (他のモデルでもいくつかの箇所で同様の現象がおきます。) カメラで頭部内部から正面方向を覗いてみると、本来の顔面も、輪郭としての顔面もカリングされて見えないため どうも顔面のメッシュを輪郭描画したときに カリング面がなぜか通常のまま描画されてしまっているのではないかと思うのですが・・・ 輪郭のメッシュ描画直前に、マテリアル(1番)のカリング面の設定を確認してみても 意図通り逆に設定されているようです。 描画周りはメッシュ単位で描く必要があったので、DXライブラリソースのNS_MV1DrawModelを基にして作ったのですが その際に再現できず省いた処理がいくつかあります。 それが原因かもしれませんが、通常のモデル描画には問題がないので、どうにもわからず悩んでいます。 何かアドバイスをいただけたら助かります。 VC++(VisualStudio2012)のソースもアップロードしておきます。(モデルデータは含んでいません) ttp://firestorage.jp/download/a8a91767f7aa0edd14c04bd8d46ec52715c6c64c

Page: 1 |

Re: 独自シェーダーでモデルの輪郭描画がうまくいかない ( No.1 )
名前:管理人 日時:2012/12/09 03:02

プログラムを拝見しました 原因は MV1GetMeshBackCulling や MV1SetMeshBackCulling にメッシュ番号ではなく マテリアル番号を渡してしまっているからでした メッシュ番号を渡すようにしたら政情に描画されましたので、よろしければお試しください
Re: 独自シェーダーでモデルの輪郭描画がうまくいかない ( No.2 )
名前:みょも 日時:2012/12/09 09:21

なんというイージーミス・・・お恥ずかしい。 ご指摘どおり修正したところ、正常に描画されました。 ありがとうございました。 そして、このようなミスに貴重なお時間を取らせてしまって申し訳ありませんでした(__; しかし今度はこちらのモデルの、標準シェーダーでは輪郭のつかない口に輪郭がついてしまうことに気づきました。 ttp://kiomodel3.sblo.jp/article/42474115.html テストで輪郭の太さが固定のままだったので、そのせいか思い ライブラリのソースを参考に輪郭の太さ補正をつけ、 モデルの口を開けてみると・・・綺麗に輪郭が口についてくれてしまいます(^^; OutLineWidth や OutLineDotWidthが 0.000001f以下のもの、 MaterialType が DX_MATERIAL_TYPE_NORMALのメッシュを輪郭描画除外してみたんですが、変化なし。 過去ログを見てみると、頂点にも何か設定があるような話もみるのですが・・・その関係でしょうか。 なにか上手く処理するヒントだけでもいただけると助かります。 元々影をつける為シェーダーに手をつけはじめたんですが、 かなり手を加えていかないといけないですね・・・なかなか難しい。 透過被り対策に、いずれポリゴン単位のZソートもやらねばと思うのですが、 ライブラリのソースを DrawModel → DrawMesh と眺めていくと処理内容の難しさに早くも諦めムードです(^^;
Re: 独自シェーダーでモデルの輪郭描画がうまくいかない ( No.3 )
名前:管理人 日時:2012/12/09 22:13

プログラムを見直して思い出しました、輪郭線はpmd,pmxに含まれる頂点単位の 「輪郭線を表示するかどうか」のパラメータに応じて輪郭線を出さない箇所があり、 メインのメッシュとは別にポリゴン描画用の頂点インデックスを用意しているのでした これを使用せずに頂点単位の輪郭線表示情報を反映するのは大変ですので、輪郭線用のメッシュだけ 描画する手段を用意しました、よろしければその機能を追加したこちらのバージョンをダウンロードしてください m(_ _)m http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_DevCppTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibDotNet.zip // .NET用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) 追加した関数は以下の関数です // モデルのメッシュの種類( DX_MV1_MESHCATEGORY_NORMAL など )毎の表示、非表示を設定する // int MHandle : モデルハンドル // int MeshCategory : メッシュの種類 // int VisibleFlag : 表示するかどうか( TRUE:表示する FALSE:表示しない ) int MV1SetMeshCategoryVisible( int MHandle, int MeshCategory, int VisibleFlag ) ; 第二引数に渡せるメッシュの種類を表す値は以下の通りです // メッシュの種類 #define DX_MV1_MESHCATEGORY_NORMAL (0) // 普通のメッシュ #define DX_MV1_MESHCATEGORY_OUTLINE (1) // 輪郭線描画用メッシュ #define DX_MV1_MESHCATEGORY_OUTLINE_ORIG_SHADER (2) // 輪郭線描画用メッシュ( オリジナルシェーダーでの描画用 ) この関数を使って例えば MV1SetMeshCategoryVisible( ModelHandle, DX_MV1_MESHCATEGORY_NORMAL, FALSE ) ; を実行すると、輪郭部分以外が描画されなくなります あと、MV1SetUseOrigShader( TRUE ) ; を実行してオリジナルシェーダーを 使用する設定にしている場合はデフォルトでは輪郭線用メッシュは描画されませんが、この関数で MV1SetMeshCategoryVisible( ModelHandle, DX_MV1_MESHCATEGORY_OUTLINE_ORIG_SHADER, TRUE ) ; とすると、オリジナルシェーダーでの描画の際も輪郭線の描画が行われます ともあれ、みょもさんのされたいことを実現する場合は、まず MV1SetUseOrigShader( FALSE ) ; MV1SetMeshCategoryVisible( ModelHandle, DX_MV1_MESHCATEGORY_NORMAL, FALSE ) ; MV1SetMeshCategoryVisible( ModelHandle, DX_MV1_MESHCATEGORY_OUTLINE, TRUE ) ; を実行して輪郭線だけ描画されるようにした状態でモデルを描画した後、 MV1SetUseOrigShader( TRUE ) ; MV1SetMeshCategoryVisible( ModelHandle, DX_MV1_MESHCATEGORY_NORMAL, TRUE ) ; MV1SetMeshCategoryVisible( ModelHandle, DX_MV1_MESHCATEGORY_OUTLINE_ORIG_SHADER, FALSE ) ; を実行して今度は輪郭部分以外をオリジナルのシェーダーを使用して描画します よろしければお試しください
Re: 独自シェーダーでモデルの輪郭描画がうまくいかない ( No.4 )
名前:みょも(解決済み) 日時:2012/12/10 08:27

関数までつくっていただいたおかげで、すんなりと輪郭を出すことができました。 本当にありがとうございました(__)

Page: 1 |