
ライティング(2) Blinn-Phong★ 1.はじめに…
Phongシェーディングをやったので,Blinn-Phong鏡面反射光もやってみました。
![]() ★ 2.Blinn-Phong鏡面反射光
フォンの鏡面反射モデルは反射ベクトルを計算しますが,一部の環境によって反射ベクトルを計算するのが大変なそうなので,ライトベクトルLと視線ベクトルEの中間の角度にあるベクトルで計算するBlinn-Phong鏡面反射モデルというのが考え出されています。
ハーフベクトルHは次式によって計算します。 ![]() Blinn-Phongの鏡面反射光はライトベクトルと反射ベクトルの内積のべき乗の代わりに法線ベクトルとハーフベクトルの内積のべき乗で計算します。数式にすると下のようになります。 ![]() 実際シェーダのほうではハーフベクトルを計算するのも反射ベクトルを計算するのも大して変わらないので,自分がやりやすいほうでいいんじゃないですかね。 では,ピクセルシェーダの処理です。前回とちがうのは反射ベクトルの計算をハーフベクトルの計算に直すぐらいです。
57 : float4 BlinnPhongPS(VertexOutput input) : COLOR
58 : {
59 : float3 P = input.objPosition.xyz;
60 : float3 N = normalize(input.normal);
61 :
62 : // Ambient Color
63 : float3 ambient = gAmbient * Ka;
64 :
65 : // Diffuse Color
66 : float3 L = normalize(lightPosition - P); // ローカル座標系のでのライトベクトル
67 : float diffuseLight = max(dot(L, N), 0);
68 : float3 diffuse = Kd * lightColor * diffuseLight;
69 :
70 : // Specular Color
71 : float3 V = normalize(eyePosition - P);
72 : float3 H = normalize(L+V); // ハーフベクトル
73 : float3 specularLight = pow(max(dot(N, H), 0), power);
74 : float3 specular = Ks * lightColor * specularLight;
75 :
76 : return float4(ambient + diffuse + specular, 1.0f);
77 : }
★ Download
本ソースコードおよびプログラムを使用したことによる如何なる損害も製作者は責任を負いません。
本ソースコードおよびプログラムは自己責任でご使用ください。 プログラムの作成にはMicrosoft Visual Studio 2005 SP1 Professional, Cg Toolkit 2.0 Decemberを用いています。 |