2

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)でした。

4

1 に答える 1

3

これが私の見解です。ベクトルが間違った方向を向いていると思います(減算を行うとき):

// direction is actually the location of the target
float4 target = direction; // renamed for clarity   

float4 target_aux = mul(ModelViewProj, target);
float4 lightP_aux = mul(ModelViewProj, lightPosition);

float3 lightP = lightP_aux.xyz;
float3 targetXYZ = target.xyz;

// don't normalise this it's a location at this point, NOT a direction vector
//float3 dir = normalize(dir_aux.xyz);

float3 P = IN.position;
// reversed to give vector from light source to IN.Position
float3 V = normalize(P - lightP);

// reversed to give vector from light source to target
float3 dir = normalize(targetXYZ - lightP);

float angle = dot(V, dir);

少し遅れましたが、お役に立てば幸いです:)

于 2011-01-31T22:35:01.590 に答える