unity3d 使用ForwardAdd过程正确计算Unity中点光源和聚光灯的衰减

flmtquvp  于 2023-03-09  发布在  其他
关注(0)|答案(1)|浏览(169)

我遇到了一个问题,在我的自定义几何着色器,我似乎不能钉正确的衰减。这导致所有的点光源和聚光灯有一个正方形的光围绕他们。颜色是正确的,所以是范围,但由于某种原因,距离不想改变(这导致衰减也关闭)。
这是我的传球

Pass {
    Tags 
    {
        "LightMode" = "ForwardAdd"
    }

    Cull Off
    Blend One One

    CGPROGRAM
    
    #pragma hull hull
    #pragma domain domain

    #pragma target 4.6

    #pragma vertex vert
    #pragma geometry geo
    #pragma fragment fragAdd

    #include "UnityCG.cginc"
    uniform float4 _LightColor0; 
    uniform float4x4 unity_WorldToLight;
    uniform sampler2D _LightTextureB0; 

    fixed4 fragAdd(geometryOutput i, fixed facing: VFACE) : COLOR
    {
        float3 normalDirection = normalize(i.normal);
        
        float3 viewDirection = normalize(_WorldSpaceCameraPos - i.world.xyz);
        float3 lightDirection;
        float attenuation;
        
        if (0.0 == _WorldSpaceLightPos0.w)
        {
            attenuation = 1.0;
            lightDirection = normalize(_WorldSpaceLightPos0.xyz);
        } 
        else
        {
            float3 vertexToLightSource = _WorldSpaceLightPos0.xyz - i.world.xyz;
            lightDirection = normalize(vertexToLightSource);
            
            float distance = length(vertexToLightSource); 
            attenuation = tex2D(_LightTextureB0, float2(distance, distance)).a;
        }
        
        float3 diffuseReflection = attenuation * _LightColor0.rgb;

        return float4(diffuseReflection, 1.0);
    }

    ENDCG
}

其结果是(光强度为1):Since I don't have 10 reputation points, the results are showcased here
光线是可见的,颜色是正确的,范围是正确的,但衰减是无处可见。我已经检查了vertexToLightSource是否关闭,但似乎是正确的。
如果有人能帮助我,我将不胜感激。
我尝试过直接返回distance,看看它是否会根据灯光和生成的几何体之间的距离而改变,但无论灯光或几何体移动到哪里,它都不会改变,并且保持不变。
vertexToLightSource具有正确的位置,因为在几何体周围移动灯光时该位置会发生变化。

6kkfgxo0

6kkfgxo01#

最后,我用UNITY_LIGHT_ATTENUATION宏修正了它,而不是自己计算光衰减。如果有人遇到这个问题,这里有UNITY_LIGHT_ATTENUATION的解决方案。

#include "UnityCG.cginc"
#include "Lighting.cginc"
#include "AutoLight.cginc"

fixed4 frag(geometryOutput i, fixed facing: VFACE) : COLOR
{
 UNITY_LIGHT_ATTENUATION(attenuation, i, i.world.xyz);
 float3 diffuseReflection = attenuation * _LightColor0.rgb * tex2D(_GroundTexture, i.uv.zw);

 return float4(diffuseReflection, 1.0);
}

更多信息可在this(Unity论坛light-attenuation-function.71168)找到

相关问题