SRP中环境光不生效问题

在进行 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);

设置好参数后,在上下文里提交渲染命令,在渲染时就会获取到环境贴图(反射探针)和球谐函数(光照探针)了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值