Unity Shader - Custom lighting models in Surface Shaders 在Surface Shaders中自定义光照模型

本文讲解如何在Unity的SurfaceShaders中自定义光照模型,包括漫反射和高光光照的内置模型,以及如何定义和使用自定义光照模型,适用于正向和延迟渲染路径。同时,介绍了如何自定义全局光照。

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

目录:Unity Shader - 知识点目录(先占位,后续持续更新)
原文:Custom lighting models in Surface Shaders
版本:2019.1

Custom lighting models in Surface Shaders

在Surface Shaders中自定义光照模型

当编写Surface Shaders时,你在描述Surface的属性(如:Albedo颜色,法线),然后是光照模型的计算交互。

有两种内置的光照模型:漫反射光照的Lambert,高光光照的BlinnPhong。Unity Lighting.cginc文件里面定义了这些模型(Windows系统位于:<unity install path>/Data/CGIncludes/Lighting.cginc;mac系统位于:/Applications/Unity/Unity.app/Contents/CGIncludes/Lighting.cginc)。

有时你可能想使用自定义光照模型。你可以使用Surface Shader来实现。一个光照模型仅仅是一些Cg/HLSL函数,它们遵守一些规定。

Declaring lighting models

定义光照模型

一个光照模型的常规函数由名称Lighting开头的函数名。你可以定义它们你的在Shader中的任意地方,或是任意一个include文件里。函数如下:

  1. half4 Lighting<Name> (SurfaceOutput s, UnityGI gi); 在正向渲染路径中使用这个光照模型是不需要依赖view direciton(视角方向)的。
  2. half4 Lighting<Name> (SurfaceOutput s, half3 viewDir, UnityGI gi); 在正向渲染路径中使用这个光照模型也是需要view direciton(视角方向)的。
  3. half4 Lighting<Name>_Deferred (SurfaceOutput s, UnityGI gi, out half4 outDiffuseOcclusion, out half4 outSpecSmoothness, out half4 outNormal); 在延迟渲染路径中使用。
  4. half4 Lighting<Name>_PrePass (SurfaceOutput s, half4 light); 在prepass(旧版延迟渲染)渲染路径中使用。

注意你不需要定义所有的函数。一个光照模型可使用view direction也可以不使用。同样的,如果光照模型只能在正向渲染路径中正常执行,那就不能定义在 _Deferred 或是 _Prepass 函数。确保Shader用于正向渲染中编译。

Custom GI

自定义全局光照

定义以下函数实现自定义解码lightmap与probes数据:

  1. half4 Lighting<Name>_GI (SurfaceOutput s UnityGIInput data, inout UnityGI gi);

注意在解码标准的Unity lightmaps和SH probes数据是,你可以使用内置的DecodeLightmapShadeSHPerPixel函数,查看UnityGI_Base在Unity的文件UnityGloballIllumination.cginc里面(Windows系统位于:<unity install path>/Data/CGIncludes/UnityGloballIllumination.cginc;mac系统位于:/Applications/Unity/Unity.app/Contents/CGIncludes/UnityGloballIllumination.cginc)。

Examples

例子

查阅文档Surface Shader Lighting Examples了解更多信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值