Cg でスポットライト効果を実現しようとしています。私はすでに、通常のアンビエント ライティングとディフューズ ライティングを行うことができました。
スポットライトの基本的な機能 (位置、方向、カットオフ角度) は理解していますが、これらを Cg で処理することはまだできません。
これは、スポットライト パラメータを計算する方法です。
float4 dir_aux = mul(ModelViewProj, direction);
float4 lightP_aux = mul(ModelViewProj, lightPosition);
float3 lightP = lightP_aux.xyz;
float3 dir = normalize(dir_aux.xyz);
float3 P = IN.position;
float3 V = normalize(lightP - P);
dir = normalize(lightPosition - dir);
float angle = dot(V, dir);
directionは、スポットライトが向けられているピクセルです (例: (0, 0, 0) )
lightPositionはライトの位置です
Pは、私が照らそうとしているポイントです。IN.position は頂点シェーダーから取得され、既に modelViewProj で乗算されています。
angleは、光の方向と光からの方向の間の角度の余弦であり、私が照らそうとしている点までです。
問題は、ライトの方向を変更してもスポットライトにまったく影響がないことです。スポットライトは常に 0,0,0 を中心に配置されます。lightPosition を変更すると、スポットライトが変更されますが、それでも 0,0,0 から始まり、ライトの位置の反対側に拡大します
もう 1 つのことは、方向ベクトルを計算するときに、lightP の代わりに lightPosition を使用することです。lightP を使用すると、スポットライトがまったく機能しなくなります。
また、スポットライトはシーンの半分だけを照らします。
これに関する私の主なリファレンスは、 The Cg Tutorial のChapter 5(Lighting)でした。