2010-12-23 109 views
2

我試圖用Cg來實現聚光燈效果。 我已經設法做正常的環境和漫射照明。OpenGL聚光燈與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); 

方向是聚光燈指向(例如:(0,0,0))的像素

lightPosition是光線的位置

P是我試圖點亮的一點。 IN.position來自頂點着色器,它已經與modelViewProj相乘。

角度是光線方向與光線方向之間角度的餘弦,也是我試圖點亮的點的餘弦。

問題是改變光線的方向不會影響聚光燈。它總是以0,0,0爲中心。 如果我改變lightPosition,聚光燈會改變,但它仍然從0,0,0開始,並擴大oppsite光的位置

另一件事是當我計算方向矢量時,我使用lightPosition而不是lightP如果我使用lightP,聚光燈根本不起作用。

此外,聚光燈僅在場景的一半點亮。

我的主要參考文獻是第5章(照明),從The Cg Tutorial

回答

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); 

有點晚了,但我希望幫助:)