トップページ > 過去ログ > 記事閲覧
自作シェーダについて Fogが適用されない? (解決)
名前:オルゲ 日時: 2013/04/16 02:41

こんばんわオルゲです。 最初に問題となる現象を簡単に説明させて頂きますと、自作シェーダを使った際、Fog関数が使えず困っています。 サンプルプログラム オリジナルシェーダーを使用した3Dモデルの描画基本 のページを参考にさせて頂きますと、Fog関数を使用するには、 フォグを追加するには SetFogEnable, SetFogColor, SetFogStartEnd といった通常のフォグ関数でパラメータを設定した上で、 頂点シェーダーの出力に float Fog : FOG ; を追加してフォグのパラメータをビューポジションのZ座標から算出します。 ( DXライブラリ側で事前計算したフォグパラメータを定数を使用すれば、追加するシェーダーコードは2行だけです )  フォグの効果はライティングの有無やシェーディングの方式に関わらず適用されるので、他のサンプルでもこのサンプルの フォグに関する部分のみをコピーすればそのままフォグを適用することができます。 とのことですので、書かれている通り私の場合はバンプマッピングを行うためのシェーダプログラムですが そこに float Fog : FOG ; // フォグ float4 cfFog : register( c10 ) ; // フォグ用パラメータ( x:end/(end - start) y:-1/(end - start) z:density w:自然対数の低 ) // 線形フォグ計算 VSOutput.Fog = lViewPosition.z * cfFog.y + cfFog.x ; この3行を追加しました。 早速コンパイルし、本体の方でFogの設定をし動かしてみたのですが、Fog関数は機能していませんでした。 私はまだプログラマブルシェーダの理解が浅く、サンプルを真似たりコピーしたりして取り敢えず動いていると言う現状ですので中身を完璧に理解できていません。 ですのでFog関数が使えずお手上げ状態になってしまいました。 バンプマッピングに加えFogを使うにはどうすればよいでしょうか。どなたかご教授お願いします。 開発環境 OS:Windows7 64bit 開発環境:Visual studio 2010 CPU:i7-2600 メモリ:8GB VGA:Radeon HD6670

Page: 1 |

Re: 自作シェーダについて Fogが適用されない? ( No.1 )
名前:コウ 日時:2013/04/13 01:25

では、まず自作シェーダコードを見せていただかないことには何とも言えません。
Re: 自作シェーダについて Fogが適用されない? ( No.2 )
名前:オルゲ 日時:2013/04/13 03:19

コウさんこんばんは。 ご指摘ありがとうございます。こちらがFogに関するコードを追加したVSOファイルの中身です。 と言っても サンプルプログラム オリジナルシェーダーを使用した3Dモデルの描画基本 のページにあるバンプマッピングのシェーダプログラムにFogに関するコードを追加しただけのものですが・・。 おそらくこれだけではダメなんだと思いますが、何を追加したらいいのかさっぱりです。 // 頂点シェーダーの入力 struct VS_INPUT { float4 Position : POSITION ; // 座標( ローカル空間 ) float3 Tan : TANGENT0 ; // 接線( ローカル空間 ) float3 Bin : BINORMAL0 ; // 従法線( ローカル空間 ) float3 Normal : NORMAL0 ; // 法線( ローカル空間 ) float4 Diffuse : COLOR0 ; // ディフューズカラー float4 Specular : COLOR1 ; // スペキュラカラー float4 TexCoords0 : TEXCOORD0 ; // テクスチャ座標 } ; // 頂点シェーダーの出力 struct VS_OUTPUT { float4 Position : POSITION ; // 座標( プロジェクション空間 ) float2 TexCoords0 : TEXCOORD0 ; // テクスチャ座標 float3 VPosition : TEXCOORD1 ; // 座標( ビュー空間 ) float3 VTan : TEXCOORD2 ; // 接線( ビュー空間 ) float3 VBin : TEXCOORD3 ; // 従法線( ビュー空間 ) float3 VNormal : TEXCOORD4 ; // 法線( ビュー空間 ) float Fog : FOG ; // フォグ } ; // C++ 側で設定する定数の定義 float4 cfProjectionMatrix[ 4 ] : register( c2 ) ; // ビュー  → 射影行列 float4 cfViewMatrix[ 3 ] : register( c6 ) ; // ワールド → ビュー行列 float4 cfLocalWorldMatrix[ 3 ] : register( c94 ) ; // ローカル → ワールド行列 float4 cfFog : register( c10 ) ; // フォグ用パラメータ( x:end/(end - start) y:-1/(end - start) z:density w:自然対数の低 ) // main関数 VS_OUTPUT main( VS_INPUT VSInput ) { VS_OUTPUT VSOutput ; float4 lWorldPosition ; float4 lViewPosition ; float3 lWorldNrm ; float3 lWorldTan ; float3 lWorldBin ; float3 lViewNrm ; float3 lViewTan ; float3 lViewBin ; // 頂点座標変換 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++( 開始 ) // ローカル座標をワールド座標に変換 lWorldPosition.x = dot( VSInput.Position, cfLocalWorldMatrix[ 0 ] ) ; lWorldPosition.y = dot( VSInput.Position, cfLocalWorldMatrix[ 1 ] ) ; lWorldPosition.z = dot( VSInput.Position, cfLocalWorldMatrix[ 2 ] ) ; lWorldPosition.w = 1.0f ; // ワールド座標をビュー座標に変換 lViewPosition.x = dot( lWorldPosition, cfViewMatrix[ 0 ] ) ; lViewPosition.y = dot( lWorldPosition, cfViewMatrix[ 1 ] ) ; lViewPosition.z = dot( lWorldPosition, cfViewMatrix[ 2 ] ) ; lViewPosition.w = 1.0f ; // ビュー座標を射影座標に変換 VSOutput.Position.x = dot( lViewPosition, cfProjectionMatrix[ 0 ] ) ; VSOutput.Position.y = dot( lViewPosition, cfProjectionMatrix[ 1 ] ) ; VSOutput.Position.z = dot( lViewPosition, cfProjectionMatrix[ 2 ] ) ; VSOutput.Position.w = dot( lViewPosition, cfProjectionMatrix[ 3 ] ) ; // 頂点座標変換 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++( 終了 ) // 法線をビュー空間の角度に変換 =====================================================( 開始 ) // 従法線、接線、法線をビューベクトルに変換 lWorldTan.x = dot( VSInput.Tan, cfLocalWorldMatrix[ 0 ].xyz ) ; lWorldTan.y = dot( VSInput.Tan, cfLocalWorldMatrix[ 1 ].xyz ) ; lWorldTan.z = dot( VSInput.Tan, cfLocalWorldMatrix[ 2 ].xyz ) ; lWorldBin.x = dot( VSInput.Bin, cfLocalWorldMatrix[ 0 ].xyz ) ; lWorldBin.y = dot( VSInput.Bin, cfLocalWorldMatrix[ 1 ].xyz ) ; lWorldBin.z = dot( VSInput.Bin, cfLocalWorldMatrix[ 2 ].xyz ) ; lWorldNrm.x = dot( VSInput.Normal, cfLocalWorldMatrix[ 0 ].xyz ) ; lWorldNrm.y = dot( VSInput.Normal, cfLocalWorldMatrix[ 1 ].xyz ) ; lWorldNrm.z = dot( VSInput.Normal, cfLocalWorldMatrix[ 2 ].xyz ) ; lViewTan.x = dot( lWorldTan, cfViewMatrix[ 0 ].xyz ) ; lViewTan.y = dot( lWorldTan, cfViewMatrix[ 1 ].xyz ) ; lViewTan.z = dot( lWorldTan, cfViewMatrix[ 2 ].xyz ) ; lViewBin.x = dot( lWorldBin, cfViewMatrix[ 0 ].xyz ) ; lViewBin.y = dot( lWorldBin, cfViewMatrix[ 1 ].xyz ) ; lViewBin.z = dot( lWorldBin, cfViewMatrix[ 2 ].xyz ) ; lViewNrm.x = dot( lWorldNrm, cfViewMatrix[ 0 ].xyz ) ; lViewNrm.y = dot( lWorldNrm, cfViewMatrix[ 1 ].xyz ) ; lViewNrm.z = dot( lWorldNrm, cfViewMatrix[ 2 ].xyz ) ; // 法線をビュー空間の角度に変換 =====================================================( 終了 ) // 出力パラメータセット ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++( 開始 ) // 線形フォグ計算 VSOutput.Fog = lViewPosition.z * cfFog.y + cfFog.x ; // テクスチャ座標のセット VSOutput.TexCoords0 = VSInput.TexCoords0; // 頂点座標を保存 VSOutput.VPosition = lViewPosition.xyz ; // 接線を保存 VSOutput.VTan = lViewTan ; // 従法線を保存 VSOutput.VBin = lViewBin ; // 法線を保存 VSOutput.VNormal = lViewNrm ; // 出力パラメータセット ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++( 終了 ) // 出力パラメータを返す return VSOutput ; }
Re: 自作シェーダについて Fogが適用されない? ( No.3 )
名前:管理人 日時:2013/04/14 16:24

シェーダーモデルは幾つをお使いでしょうか? FOG パラメータによる自動的なフォグの適用はシェーダーモデル3.0では使用できないので、 もしシェーダーモデル3.0をお使いでしたらそれが原因だと思います ( シェーダーモデル3.0の場合は、自前でフォグの計算をする必要があります Fog のパラメータを TEXCOORD5 などで出力して、ピクセルシェーダー側で フォグカラーと TEXCOORD5 を最終出力カラーに絡める感じです )
Re: 自作シェーダについて Fogが適用されない? ( No.4 )
名前:オルゲ 日時:2013/04/16 02:40

遅くなりました。お忙しい中ありがとうございます。 シェーダモデルはバンプマッピングの一つしか使用していませんが、シェーダモデルは3.0でした。 色々いじっているうちに、バンプマッピングが無くてもイケそうだったので 現在はオリジナルシェーダを使わずに済んでいます。したがって自動的にFogも使えるようになりました。 しかし管理人さまの助言を元に、Ver3.0でもFogが使えるよう試してみたいと思います。 解決にさせて頂きます。 ありがとうございました。

Page: 1 |