我在像素着色器的漫+鏡面方程,它工作得很好,除了這一個問題: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
'*'和'/'具有相同的優先級,所以它們從左到右進行評估。這意味着'1.0/d * d'與'(1.0/d)* d'相同。我不知道這個微積分的含義是什麼(它只是返回'1.0'),這就是爲什麼我不能做出這個答案。 – SJuan76
這是真的,所以這是我的邏輯錯誤。所以現在神祕的是爲什麼我的模型沒有被二次衰減點亮。我的光線絕對夠近(它總是從原點開始,我可以自由移動),所以它不應該熄滅。任何人都可以在我的照明方程中發現錯誤?我的方程是根據「3D遊戲編程和計算機圖形學數學」 –