2

我的像素着色器中有一个漫反射+镜面反射方程,除了这个问题外,它工作得很好:

当我改变这个:浮动衰减= 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

4

1 回答 1

0

这条线float attenuation = 1.0f / d*d;等于float attenuation = 1.0f;,这就是为什么你得到没有衰减的阴影对象。

假设您的对象放置在原点附近并且与其到相机的距离相比较小,则使用float attenuation = 1.0f / (d*d);. 那是因为dis around20.0和 the attenuationis 1.0 / 400.0 = 0.0025。所以模型上唯一的可见光是环境光。事实上,这是正确的——点光源的衰减非常高,因此对物体几乎没有影响。试试其他一些衰减函数,例如1.0f / (0.003*d*d),你会看到不同的。

于 2012-09-16T15:46:25.490 回答