2012-09-13 55 views
2

我在像素着色器的漫+鏡面方程,它工作得很好,除了這一個問題:HLSL中的括號會導致光衰減功能無法正常工作?

當我改變這樣的: 浮動衰減= 1.0F/d * d;

對此: 浮子衰減= 1.0f /(d * d);

我的模型不再點亮,而是我的環境強度的顏色。我覺得這很奇怪。我想括號的原因是我可以使用不同的衰減函數,如(1 + 0.045 * d + 0.0075 * d * d)。

這裏是我的整個像素着色器:

void ps(in v2p input, out float4 final_color : SV_TARGET) 
{ 
    float3 ambient_intensity = float3(0.3f, 0.3f, 0.3f); 
    float3 diffuse_color = float3(0.8f, 0.8f, 0.8f); 
    float3 specular_color = float3(1.0f, 1.0f , 1.0f); 

    float3 tmp_light; 
    tmp_light.x = light_vector.x; 
    tmp_light.y = light_vector.y; 
    tmp_light.z = light_vector.z; 

    float3 norm_light = normalize(tmp_light); 

    float3 tmp_pos; 
    tmp_pos.x = input.pos.x; 
    tmp_pos.y = input.pos.y; 
    tmp_pos.z = input.pos.z; 

    float3 tmp_norm; 
    tmp_norm.x = input.norm.x; 
    tmp_norm.y = input.norm.y; 
    tmp_norm.z = input.norm.z; 

    float3 tmp_cam = float3(0.0f, 0.0f, -20.0f); // todo: make this stuff work right in cbuffer 

    // light intensity 
    float d = distance(tmp_light, tmp_pos); 

    float attenuation = 1.0f/d*d; 
    float3 pointlight = attenuation*light_color; 

    // diffuse lighting 
    float diffuse = max(dot(tmp_norm, norm_light) , 0.0f); 
    float3 diffuse_final = diffuse_color*ambient_intensity + diffuse_color*pointlight*diffuse; 

    // specular lighting 
    float3 reflect_vect = 2*dot(tmp_norm, norm_light)*tmp_norm - norm_light; 
    float ref_max = max(dot(reflect_vect, normalize(tmp_cam)), 0.0f); 
    float spec_exponent = pow (ref_max, 1.0f); 

    float3 spec_final; 
    if(dot(tmp_norm, norm_light) <= 0) 
    { 
     spec_final = float3(0.0f, 0.0f, 0.0f); 
    } 
    if(dot(tmp_norm, norm_light) > 0) 
    { 
     spec_final = specular_color*pointlight*spec_exponent; 
    } 

    final_color = float4( diffuse_final + spec_final, 1.0f); 
} 

沒有括號:http://i48.tinypic.com/357rmnq.png

用括號:http://i45.tinypic.com/70jscy.png

+2

'*'和'/'具有相同的優先級,所以它們從左到右進行評估。這意味着'1.0/d * d'與'(1.0/d)* d'相同。我不知道這個微積分的含義是什麼(它只是返回'1.0'),這就是爲什麼我不能做出這個答案。 – SJuan76

+0

這是真的,所以這是我的邏輯錯誤。所以現在神祕的是爲什麼我的模型沒有被二次衰減點亮。我的光線絕對夠近(它總是從原點開始,我可以自由移動),所以它不應該熄滅。任何人都可以在我的照明方程中發現錯誤?我的方程是根據「3D遊戲編程和計算機圖形學數學」 –

回答

0

float attenuation = 1.0f/d*d;等於float attenuation = 1.0f;,這就是爲什麼你的陰影對象沒有衰減。

假設您的物體放置在原點附近並且與相機的距離相比較小,則在使用float attenuation = 1.0f/(d*d);時,您會看到衰減接近零。這是因爲d約爲20.0attenuation1.0/400.0 = 0.0025。所以模型上唯一可見的光線就是環境光線。事實上,這是正確的 - 點光源的衰減非常高,因此對物體幾乎沒有影響。嘗試一些其他衰減功能,例如1.0f/(0.003*d*d),你會看到不同之處。