我正在制作一个恐怖游戏,需要一个只在光源处显示颜色的灰度效果。因此,我在Unity URP 6000.0.61f1中创建了一个全屏着色器,实现了灰度和读取光源颜色的功能。但是,问题是光源在某些角度下只有在白色,而不是其本来的颜色(很可能是Position节点的问题,但我无法解决这个问题,因为我对着色器不太熟悉)。

着色器:https://preview.redd.it/msyrqmwcl6dh1.png?width=687&format=png&auto=webp&s=980836095f5701ddf3b7750e9adc32ebcf23d59b

自定义函数GetSpotLights(这个是AI生成的,我不知道HLSL):

#if defined(SHADERGRAPH_PREVIEW)
Color = float3(1, 1, 1);
Direction = float3(0, 1, 0);
#else
float3 totalColor = float3(0, 0, 0);
float3 mainDir = float3(0, 1, 0);
float maxIntensity = 0;
float3 actualWorldPos = WorldPos;
int pixelLightCount = GetAdditionalLightsCount();
for (int i = 0; i < pixelLightCount; ++i)
{
Light light = GetAdditionalLight((uint)i, actualWorldPos);
float attenuation = light.distanceAttenuation * light.shadowAttenuation;
float3 lightRadiance = light.color * attenuation;
totalColor += lightRadiance;
float currentIntensity = max(lightRadiance.r, max(lightRadiance.g, lightRadiance.b));
if (currentIntensity > maxIntensity)
{
maxIntensity = currentIntensity;
mainDir = light.direction;
}
}
Color = totalColor;
Direction = mainDir;
#endif

在某些角度下,红光会显示为红色:https://preview.redd.it/637gd74nl6dh1.png?width=807&format=png&auto=webp&s=b1e5f297765249dd017da8b3e52dcb6bfeb57e5c

而其他时候,它们只是白色:https://preview.redd.it/clfv8m7ol6dh1.png?width=811&format=png&auto=webp&s=2f651c7e4b4c4dad3dac30402e3645bdedf3062f