在进行 PBR 相关的学习时,博主写的 shader 环境光在 SRP 中一直获取不到,但是切换到 URP 的管线下就可以正常显示,查找了很多资料最后成功解决了该问题,特此记录一下
在加入环境光的相关计算后,依然只显示 BRDF 的效果
解决问题后的材质球:
可以看到环境光的效果已经成功显示出来了
解决思路
这类问题首先想到的就是找出哪些参数没有获取到,这时就要用到我们功能强大的 Frame Debugger 了
在博主写的 SRP 中,我们可以看到 unity_SpecCube0 是默认状态,并且下方的球谐函数全部都没有获取到
切换成 URP 之后,这些都能够正常获取
所以我猜测可能是管线的某些东西没有设置或者开启,导致相关的变量都没有成功传入 shader 里
解决方法
经过博主阅读了一下午 URP 的源码以及查阅网上资料后,终于解决了这个问题
我们可以在 URP 的 UniversalRenderPipeline.cs 中找到下面所示的方法
如果你不了解 URP 的源码,可以阅读博主之前写的文章: URP学习笔记1——URP源码解读
static PerObjectData GetPerObjectLightFlags(int additionalLightsCount)
{
var configuration = PerObjectData.ReflectionProbes | PerObjectData.Lightmaps | PerObjectData.LightProbe | PerObjectData.LightData | PerObjectData.OcclusionProbe;
if (additionalLightsCount > 0)
{
configuration |= PerObjectData.LightData;
// In this case we also need per-object indices (unity_LightIndices)
if (!RenderingUtils.useStructuredBuffer)
configuration |= PerObjectData.LightIndices;
}
return configuration;
}
我们都知道 unity_SpecCube0 就是环境贴图,所以我猜测是反射探针和光照探针这些都没有开启,于是在 URP 的源码中找到了相关的设置
把定义 configuration 的这一行复制下来加到我们自己写的 SRP 中
var drawingSettings = new DrawingSettings(unlitShaderTagId,sortingSettings)
{
enableInstancing = isUseGPUInstancing,
enableDynamicBatching = isUseDynamicBatching,
// 在初始化 drawingSettings 的时候开启这些参数就行了
perObjectData = PerObjectData.ReflectionProbes | PerObjectData.Lightmaps | PerObjectData.LightProbe | PerObjectData.LightData | PerObjectData.OcclusionProbe
};
context.DrawRenderers(cullingResults, ref drawingSettings, ref filteringSettings);
设置好参数后,在上下文里提交渲染命令,在渲染时就会获取到环境贴图(反射探针)和球谐函数(光照探针)了