因此,最近我一直在学习如何在DirectX中实现漫射照明,并且已经通过以下代码实现了这一点: >


在进一步进行镜面照明之前,我想稍微清理一下代码,因此我通过一个函数和少量更改重新实现了它。

float4 PS(VS_OUTPUT input) : SV_TARGET
{
    input.normal = normalize(input.normal);

    float4 diffuse = ObjTexture.Sample(ObjSamplerState, input.TexCoord);

    float3 finalColor;

    finalColor = diffuse * light.ambient;
    finalColor += saturate(dot(light.dir, input.normal) * light.diffuse * diffuse);

    return float4(finalColor, diffuse.a);
}


哪个产生:



您可以看到修改后的代码有点漫射照明与原始版本不同。我需要从原始代码中恢复正常状态吗?

#1 楼

您的环境照明贡献在第二个中没有(:

#2 楼

float3 DirectDiffuseBRDF(float3 diffuseAlbedo, float nDotL)
{
    return (diffuseAlbedo * nDotL);
}

float4 PS(VS_OUTPUT input) : SV_TARGET
{
    input.normal = normalize(input.normal);

    float4 diffuseAlbedo = ObjTexture.Sample(ObjSamplerState, input.TexCoord);

    float nDotL = dot(input.normal, light.dir);

    float3 diffuseLighting = diffuseAlbedo * light.ambient * light.diffuse;

    diffuseLighting += saturate(DirectDiffuseBRDF(diffuseAlbedo, nDotL);

    return float4(diffuseLighting, diffuseAlbedo.a);
}


这似乎已解决。我忘记增加环境光。

评论


$ \ begingroup $
那么light.diffuse呢(漫射光的颜色呢?)
$ \ endgroup $
–narthex
16-10-9在9:56



$ \ begingroup $
哦,我忘了补充说明,我已经用它更新了答案。
$ \ endgroup $
– Arjan Singh
16-10-9在10:05



$ \ begingroup $
它不是颜色=漫射+环境吗?
$ \ endgroup $
– Zouch
16-10-11在18:34

$ \ begingroup $
是的,您不应将环境乘以,如果为0,则最终将得到0的扩散。它应该是漫反射+环境
$ \ endgroup $
–PaulHK
16-10-13在3:36