トップページ > 過去ログ > 記事閲覧
ソフトシャドウ処理について
名前:ペッパー 日時: 2013/03/28 17:11

サンプルプログラムの深度値を利用した影表現基本を改造して、影のジャギ減らしてスムーズにしたいと思っています。 が、具体的な方法が思い浮かばないのでご教授願います。 個人的には、深度記録画像を使用したピクセルシェーダーを使用して描画する際に、周囲の深度の平均を取れば可能なのか?と思っているのですが、 思っているだけで方法すら分からない状態です… なお、多少の処理速度は犠牲になっても構わないので、なるべくシンプルな方法を教えて頂ければ幸いです。

Page: 1 |

Re: ソフトシャドウ処理について ( No.1 )
名前:takatwu 日時:2013/03/28 15:51

ttp://w w w43.atwiki.jp/beamman/ 私はこの方の簡易ソフトシャドウエフェクトがとても参考になりました。 ただしそのままでは使えません。(MMD用のものなので) あとコードの長さ的にシェーダーモデル3.0でコンパイルする必要があります。 バージョンの違う頂点シェーダとピクセルシェーダを混同するとPCによっては正常に描画されない場合があるので 3.0でコンパイルしたピクセルシェーダを使用する場合は頂点シェーダも3.0でコンパイルしたものを使用してください。
Re: ソフトシャドウ処理について ( No.2 )
名前:ペッパー 日時:2013/03/28 17:30

>> takatwu 氏 情報ありがとうございます。 早速参考にさせて頂きました。 が、私の開発環境がシェーダモデル2.0までしか対応していないという残念仕様なのです… 引き続き皆様からのご教授をお願い致します。 <(_ _*)>
Re: ソフトシャドウ処理について ( No.3 )
名前:ペッパー 日時:2013/03/28 19:51

連投失礼いたします。 先のtakatwu氏から教えて頂いたサイト様の情報を元にして、影表現基本のピクセルシェーダを自分なりに改造してみました。 が、影の輪郭自体はぼやけるようになったのですが輪郭以外(ぼやけた所以外)が影として描画されなくなってしまいました。 .fx自体は下記の通りですので、原因がお分かりになる方はご指摘頂ければ幸いです。 .fx // ピクセルシェーダーの入力 struct PS_INPUT { float4 Diffuse : COLOR0 ; // ディフューズカラー float4 Specular : COLOR1 ; // スペキュラカラー float2 TexCoords0 : TEXCOORD0 ; // テクスチャ座標 float4 LPPosition : TEXCOORD1 ; // ライトからみた座標( ライトの射影空間 ) } ; // ピクセルシェーダーの出力 struct PS_OUTPUT { float4 Color0 : COLOR0 ; } ; // C++ 側で設定する定数やテクスチャの定義 sampler DiffuseMapTexture : register( s0 ) ; // ディフューズマップテクスチャ sampler DepthMapTexture : register( s1 ) ; // 深度バッファテクスチャ // main関数 PS_OUTPUT main( PS_INPUT PSInput ) { PS_OUTPUT PSOutput ; float4 TextureDiffuseColor ; float TextureDepth ; float2 DepthTexCoord ; float4 DefaultOutput ; // テクスチャカラーの読み込み TextureDiffuseColor = tex2D( DiffuseMapTexture, PSInput.TexCoords0.xy ) ; // 出力カラー = ディフューズカラー * テクスチャカラー + スペキュラカラー DefaultOutput = PSInput.Diffuse * TextureDiffuseColor + PSInput.Specular ; // 出力アルファ = ディフューズアルファ * テクスチャアルファ DefaultOutput.a = PSInput.Diffuse.a * TextureDiffuseColor.a ; // 深度テクスチャの座標を算出 // PSInput.LPPosition.xy は -1.0f 〜 1.0f の値なので、これを 0.0f 〜 1.0f の値にする DepthTexCoord.x = ( PSInput.LPPosition.x + 1.0f ) * 0.5f; // yは更に上下反転 DepthTexCoord.y = 1.0f - ( PSInput.LPPosition.y + 1.0f ) * 0.5f; // 深度バッファテクスチャから深度を取得 TextureDepth = tex2D( DepthMapTexture, DepthTexCoord ); // 周囲のデータも調べる? float comp = 0; float U = 1.0f / 2048; float V = 1.0f / 2048; comp += saturate( max(TextureDepth - tex2D(DepthMapTexture , DepthTexCoord + float2(0,0)).r , 0.0f) * 1500 - 0.3f); comp += saturate( max(TextureDepth - tex2D(DepthMapTexture , DepthTexCoord + float2(U,0)).r , 0.0f) * 1500 - 0.3f); comp += saturate( max(TextureDepth - tex2D(DepthMapTexture , DepthTexCoord + float2(-U,0)).r , 0.0f) * 1500 - 0.3f); comp += saturate( max(TextureDepth - tex2D(DepthMapTexture , DepthTexCoord + float2(0,V)).r , 0.0f) * 1500 - 0.3f); comp += saturate( max(TextureDepth - tex2D(DepthMapTexture , DepthTexCoord + float2(0,-V)).r , 0.0f) * 1500 - 0.3f); comp += saturate( max(TextureDepth - tex2D(DepthMapTexture , DepthTexCoord + float2(U,V)).r , 0.0f) * 1500 - 0.3f); comp += saturate( max(TextureDepth - tex2D(DepthMapTexture , DepthTexCoord + float2(-U,V)).r , 0.0f) * 1500 - 0.3f); comp += saturate( max(TextureDepth - tex2D(DepthMapTexture , DepthTexCoord + float2(-U,-V)).r , 0.0f) * 1500 - 0.3f); comp += saturate( max(TextureDepth - tex2D(DepthMapTexture , DepthTexCoord + float2(U,-V)).r , 0.0f) * 1500 - 0.3f); // 平均を出している。…ハズ comp = 1 - saturate( comp / 9 ) ; // 影として光度を反映? DefaultOutput.rgb *= comp ; // 出力カラーをセット PSOutput.Color0 = DefaultOutput; // 出力パラメータを返す return PSOutput ; }
Re: ソフトシャドウ処理について ( No.4 )
名前:takatwu 日時:2013/03/28 23:10

comp += saturate( max(TextureDepth - tex2D(DepthMapTexture , DepthTexCoord + float2(0,0)).r , 0.0f) * 1500 - 0.3f); comp += saturate( max(TextureDepth - tex2D(DepthMapTexture , DepthTexCoord + float2(U,0)).r , 0.0f) * 1500 - 0.3f); comp += saturate( max(TextureDepth - tex2D(DepthMapTexture , DepthTexCoord + float2(-U,0)).r , 0.0f) * 1500 - 0.3f); comp += saturate( max(TextureDepth - tex2D(DepthMapTexture , DepthTexCoord + float2(0,V)).r , 0.0f) * 1500 - 0.3f); comp += saturate( max(TextureDepth - tex2D(DepthMapTexture , DepthTexCoord + float2(0,-V)).r , 0.0f) * 1500 - 0.3f); comp += saturate( max(TextureDepth - tex2D(DepthMapTexture , DepthTexCoord + float2(U,V)).r , 0.0f) * 1500 - 0.3f); comp += saturate( max(TextureDepth - tex2D(DepthMapTexture , DepthTexCoord + float2(-U,V)).r , 0.0f) * 1500 - 0.3f); comp += saturate( max(TextureDepth - tex2D(DepthMapTexture , DepthTexCoord + float2(-U,-V)).r , 0.0f) * 1500 - 0.3f); comp += saturate( max(TextureDepth - tex2D(DepthMapTexture , DepthTexCoord + float2(U,-V)).r , 0.0f) * 1500 - 0.3f); のTextureDepthを全てPSInput.LPPosition.zに変更してください。 また縞模様が出るので上記のソースの前に PSInput.LPPosition.z -= 0.005f; を追加。 このままだと影が真っ黒になるので DefaultOutput.rgb *= comp; を DefaultOutput.rgb *= comp / 2.f + 0.5f; に変更して影の色を半分に。
Re: ソフトシャドウ処理について ( No.5 )
名前:ペッパー( 解決 ) 日時:2013/03/29 23:24

>> takatwu 氏 おかげさまで理想と一致する実行結果を得る事が出来ました。 ありがとうございます。

Page: 1 |