我遇到了一个问题,在我的自定义几何着色器,我似乎不能钉正确的衰减。这导致所有的点光源和聚光灯有一个正方形的光围绕他们。颜色是正确的,所以是范围,但由于某种原因,距离不想改变(这导致衰减也关闭)。
这是我的传球
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
具有正确的位置,因为在几何体周围移动灯光时该位置会发生变化。
1条答案
按热度按时间6kkfgxo01#
最后,我用
UNITY_LIGHT_ATTENUATION
宏修正了它,而不是自己计算光衰减。如果有人遇到这个问题,这里有UNITY_LIGHT_ATTENUATION
的解决方案。更多信息可在this(Unity论坛
light-attenuation-function.71168
)找到