Unity中URP下的SimpleLit的 Lambert漫反射计算

本文详细解析了UnityURP中的Lambert漫反射计算过程,包括MixRealtimeAndBakedGI函数的不同调用,以及LightingLambert函数在BlinnPhong计算中的应用,展示了如何获取主光信息并混合实时光照与全局光照效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


前言

在之前的文章中,我们已经知道了 SimpleLit 下的主光数据怎么获取。

有了这些数据,我们就可以计算 Lambert漫反射 和 BlinnPhone高光反射 了。


一、Lambert漫反射计算1

  • 我们在获取了主光信息后

Light mainLight = GetMainLight1(inputData, shadowMask, aoFactor);

  • 就来到了 Lambert 漫反射的计算(这里同时包含了实时光照 和 全局光照GI的计算)

MixRealtimeAndBakedGI(mainLight, inputData.normalWS, inputData.bakedGI, aoFactor);
在这里插入图片描述

  • 我们来分析一下 MixRealtimeAndBakedGI 函数

1、MixRealtimeAndBakedGI 函数有三个重载

  • 我们这里为了方便称呼,把他们分别称为 1号、2号、3号重载 在这里插入图片描述
  • 调用时,我们首先调用了 3号
    在这里插入图片描述

2、3号 调用了 2号

在这里插入图片描述

3、1号调用了 SubtractDirectMainLightFromLightmap函数

  • 该函数就是实现了 Lambert漫反射计算的核心部分 同时混合了 GI
    在这里插入图片描述

4、我们重点来看 Lambert漫反射的实现部分

在这里插入图片描述

  • 得到
### 如何在 Unity URP 中实现风格化渲染 #### 创建新项目并配置URP 为了创建一个新的Unity项目来测试URP下的风格化渲染,需先安装Universal RP Asset Package。这可以通过打开Unity Hub, 新建一个使用URP模板的项目完成[^1]。 #### 添加Toon Shader资源 对于想要快速上手的人来说,可以考虑下载已经做好的Toon Shader资源包。例如,在探索Unity URP的卡通渲染中提到的一个项目提供了丰富的功能,包括但不限于混合透明度的支持、多种光照选项以及高级特效如法线贴图和屏幕空间阴影等[^4]。此外还有专门针对水体效果设计的`water-urp`项目也值得借鉴[^2]。 #### 编写或导入Shader代码 如果打算自己动手编写着色器,则可以从官方GitHub仓库中的例子获取灵感。下面是一个简单的Toon Shader片段: ```csharp // Simple Toon Shader Example Shader "Custom/BasicToon" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _RampTex ("Toon Ramp (RGB)", 2D) = "gray" {} // 自定义色调渐变纹理 } SubShader { Tags { "RenderType"="Opaque"} CGPROGRAM #pragma surface surf Lambert sampler2D _MainTex; sampler2D _RampTex; struct Input { float2 uv_MainTex; half3 worldNormal; INTERNAL_DATA }; void surf(Input IN, inout SurfaceOutput o){ fixed4 col = tex2D(_MainTex, IN.uv_MainTex); // 使用世界坐标系下法线计算漫反射强度,并映射到自定义调色板 half NdotL = dot(WorldNormalVector(IN), _WorldSpaceLightPos0.xyz)*0.5 + 0.5; half3 rampCol = tex2D (_RampTex,half2(NdotL,NdotL)).rgb * col.rgb; o.Albedo = rampCol; } ENDCG } } ``` 此示例展示了如何利用一张额外的ramp texture来进行非真实的光照响应曲线调整,从而达到更加艺术化的视觉呈现效果。 #### 配置材质球与应用至模型 有了上述着色器之后,下一步就是将其关联给Material对象,并设置好对应的参数(比如基础颜色贴图和toon ramp)。最后一步则是把准备好的material赋值给目标GameObject上的Mesh Renderer组件即可看到变化后的外观表现形式。 #### 调整灯光和其他后期处理效果 为了让场景看起来更接近于动画片或者漫画书里的样子,还可以进一步调节场景内的光源属性——特别是启用像素级光照模式;另外加入一些特殊的post-processing filters也会有助于增强整体氛围感,像bloom滤镜能够制造出光晕现象而使画面显得更为梦幻。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

楠溪泽岸

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值