現在DirectX9でシェーダーの勉強をしております。
シェーダ内でポイントライトを実装してみたのですが、実装結果がちょっとおかしいことになってます。
床より下にライトがあるのですが、なぜか天井だけが暗くなってません。
ネットで検索して、逆2乗の法則(光の強さ=1.0/ライトと頂点の距離^2)というのを見つけて一度導入したのですが、余計に変なことになりました(画像イメージとは無関係)
直す方法ご存知の方、ぜひともご教授お願いします。
↓ピクセルシェーダ内の処理 リクエストあれば追記いたします。
HLSL
1 2 //------------------------------------------------ 3 //拡散色 4 //------------------------------------------------ 5 float3 PointDir = normalize(In.wPos - LightPos); // per pixel diffuse lighting //ライトとの距離 6 float PointLPow = dot(-PointDir, w_normal); // 光の強さ -1~1 7 PointLPow = saturate(PointLPow); // 0~1内に収める このLPowが、このピクセルに当たる光の強さになる 0だと0% 1だと100% 8//逆2乗-------------------------------------------------------- 9float Test =(1.0f/(PointDir*PointDir)); 10 11 12 float4 pointCol = PointLPow*Test; //光のつよさ*減衰 13 pointCol.a = 1; //アルファは1固定 14//-------------------------------------------------------------- 15 16 // 環境光ぶんライト色を加算する 17 pointCol += LightAmbient; 18 19 20 //------------------------------------------------ 21 // 反射色 22 //------------------------------------------------ 23 float3 vCam = normalize( CamPos - In.wPos // 目(カメラ)への方向 24 25 //point 26 float3 pvRef = PointDir + 2.0f * dot(w_normal, -PointDir) * w_normal; 27 float pspePow = pow(max(0, dot(vCam, pvRef)), MateSpePower); 28 float4 plightSpe = LightSpecular * pspePow; 29 30 // 最終的な色を算出。 31 float4 PointCol = pointCol * modelCol; // 最終的な拡散(Diffuse)色を求める。 32 float4 PspeCol = plightSpe * MateSpecular; // 最終的な反射(Specular)色を求める。 33 34 //ピクセルシェーダ出力用変数 35 PS_OUT Out; 36 37 Out.Color = PointCol + PspeCol ; // 拡散色 + 反射色 38 39 return Out;
追記
Bongoさん、ご質問ありがとうございます。 確かに影の処理も入っていないのですが、現在天井はライトがどれだけ離れても明るくなっているのです。 ポイントライトなのでライトを下に離していけばだんだんと暗くなっていくはずなのですが・・・
回答1件
あなたの回答
tips
プレビュー