トップページ > 過去ログ > 記事閲覧
サンプルプログラムの深度値を利用した影表現について
名前:こーや 日時: 2012/12/22 12:16

お世話になっております。 サンプルプログラムの深度値を利用した影表現で影を表現したのですが、 α情報付きの板ポリを表示したところ ttp://upup.bz/j/my24485oScYtJWsr3U7xT2Y.jpg このようになってしまいます。 できれば、透明な部分は抜けて ttp://upup.bz/j/my24486kkUYtR79ss_WoXB_.jpg このような形を出したいのです。 解決作などございましたらご教授のほどよろしくお願いします。

Page: 1 |

Re: サンプルプログラムの深度値を利用した影表現について ( No.1 )
名前:みょも 日時:2012/12/23 22:10

ソフトシャドウと合わせて自分もいずれ弄ろうと思いつつ、 まだ実際には試していないのですが・・・ 深度マップを記録する際のピクセルシェーダプログラムを マテリアルかテクスチャのアルファが0のときは 深度を記録しないように(アルファ0でピクセルシェーダ出力?) すればいいのではないかと思います。
Re: サンプルプログラムの深度値を利用した影表現について ( No.2 )
名前:こーや 日時:2012/12/24 09:26

貴重なご意見ありがとうございます。 他にも、DXライブラリで影の形をα情報を考慮した プログラムを実装できた方などいらっしゃいましたら、 ご意見をお待ちしております。
Re: サンプルプログラムの深度値を利用した影表現について ( No.3 )
名前:レモン茶 日時:2012/12/26 08:48

横から失礼いたします。 みょもさんの仰るとおり、テクスチャかマテリアルのα値を考慮してやれば良いです。 深度値にα値を考慮したシャドウマップ生成のコードは以下の感じになります。(テクスチャのみでマテリアルは考慮していません) // ピクセルシェーダーの入力 struct PS_INPUT { float4 PPosition : TEXCOORD0 ; // 座標( 射影空間 ) float2 TexCoords : TEXCOORD1 ; // テクスチャ座標 } ; // ピクセルシェーダーの出力 struct PS_OUTPUT { float4 Color0 : COLOR0 ; } ; sampler DiffuseMap : register(s0); // main関数 PS_OUTPUT main( PS_INPUT PSInput ) { PS_OUTPUT PSOutput ; float4 TextureDiffuseColor ; // Z値を色として出力 PSOutput.Color0 = PSInput.PPosition.z; // テクスチャのα値を適用する PSOutput.Color0.a = tex2D(DiffuseMap,PSInput.TexCoords); // 出力パラメータを返す return PSOutput ; } サンプルに書き加えただけですが、上のコードは頂点シェーダーの出力にテクスチャ座標を加え(TEXCOORDS1)、ピクセルシェーダー側ではテクスチャ座標のα値を適用しています。 こうすればビルボードにテクスチャを貼り付けただけのようなものでもその形の影になります。 中途半端なアルファ値のものも影にしないのであればα値出力のところにif文等で弄ってやる必要があります。
Re: サンプルプログラムの深度値を利用した影表現について ( No.4 )
名前:こーや 日時:2012/12/26 15:26

ご返答ありがとうございます。 上記のピクセルシェーダープログラムを サンプルプログラムの DepthShadow_Step1PS.pso に上書きしたのですが、 うまくいきませんでした。 DepthShadow_Step1PS.pso を書き換えるだけではなく、 他にやる工程とかあるのでしょうか?
Re: サンプルプログラムの深度値を利用した影表現について ( No.5 )
名前:レモン茶 日時:2012/12/27 04:29

上記のピクセルシェーダーに書き換えただけでは動きません。 ピクセルシェーダーで使うためのテクスチャ座標を頂点シェーダーから出力してやらないといけません。 上記では、ピクセルシェーダーの入力でテクスチャ座標はTEXCOORD1を使用している為、VSOUTPUT構造体にfloat2 hoge : TEXCOORD1;を追加します。 その後、VSINPUT構造体のTexCoords0にテクスチャの座標が入っているので、それをhogeに代入してやります。 サンプルのコードをそのまま貼り付けると長くなりすぎるので、部分部分だけ。 // 頂点シェーダーの出力 struct VS_OUTPUT { float4 Position : POSITION ; // 座標( 射影空間 ) float4 PPosition : TEXCOORD0 ; // 座標( 射影空間 ) float2 TexCoords1 : TEXCOORD1; // テクスチャ座標 } ; // main関数 VS_OUTPUT main( VS_INPUT VSInput ) { /* 省略 */ VSOutput.TexCoords1 = VSInput.TexCoords0; return VSOutput ; }
Re: サンプルプログラムの深度値を利用した影表現について ( No.6 )
名前:こーや(解決済み) 日時:2012/12/28 10:23

ご返答ありがとうござます。 頂点シェーダー NormalMesh_DepthShadow_Step1VS に上記のプログラムを追記して 実行したところ。 ttp://upup.bz/j/my28513CFWYtllqnuvtvHao.jpg このように、キャラクターの影と実態の部分が 逆に出てしまいました。 その後、こちらで調べてみたところ。 ピクセルシェーダーの PSOutput.Color0.a = tex2D(DiffuseMap,PSInput.TexCoords); の部分を PSOutput.Color0.a = tex2D(DiffuseMap,PSInput.TexCoords).a; にしたところこちらが考えてる形の影が出てくれました。 みょも様、レモン茶様、ご意見ご返答本当にありがとうございました。
Re: サンプルプログラムの深度値を利用した影表現について ( No.7 )
名前:レモン茶(解決済) 日時:2012/12/28 11:31

.aを入れ忘れてましたね。 気付きませんでした。すいません。 無事解決したようでよかったです。

Page: 1 |