项目里有一个其他同事实现的shader,美术那边希望能支持多个光源, 我一看代码里面, frag 函数里已经实现了
#ifdef _ADDITIONAL_LIGHTS
uint pixelLightCount = GetAdditionalLightsCount();
for (uint lightIndex = 0u; lightIndex < pixelLightCount; ++lightIndex)
{
Light light = GetAdditionalLight(lightIndex, i.posWorld.xyz);
half3 attenuatedLightColor = light.color * (light.distanceAttenuation * light.shadowAttenuation);
lightColor += LightingLambert(attenuatedLightColor, light.direction, normalDirection);
}
#endif
代码也加了:
#pragma multi_compile _ _ADDITIONAL_LIGHTS_VERTEX _ADDITIONAL_LIGHTS
材质里加了这个keyword还是没起作用, 若宏控制注了有效。 一开始没搞明白……
想到很可能这个关键字是系统本身控制的, 搜索了一下"_ADDITIONAL_LIGHTS",找到ForwardLights.cs里 确实控制了 _ADDITIONAL_LIGHTS 和 _ADDITIONAL_LIGHTS_VERTEX的开关,且2个只能存在一个(所以 multi_compile 是配置在一起的)
最后发现是 UniversalRenderPipelineAsset 这个自定义配置里Additional Lights的配置:

perVertex (开 _ADDITIONAL_LIGHTS_VERTEX宏)表示 在顶点着色器 计算时,就取其他光源数据计算 光照值, 这样顶点数少 但像素绘制比较多(片元着色器执行次数更多)的情况,就能节省不少计算。
perPixel (开 _ADD

文章讨论了在Unity项目中,如何使Shader支持多个光源。作者分析了代码中的#ifdefADDITIONAL_LIGHTS宏,发现问题在于UniversalRenderPipelineAsset的AdditionalLights配置。顶点着色器和片元着色器的计算方式对性能有影响,适合不同类型的光源。作者提供了在Shader中添加对_ADDITIONAL_LIGHTS及_ADDITIONAL_LIGHTS_VERTEX支持的方法,并提醒在处理点光源时,可能需要考虑使用lightmap烘培或优化计算方式。

2648

被折叠的 条评论
为什么被折叠?



