Unity Shader——Writing Surface Shaders(2)——Custom Lighting models in Surface Shaders
2024-10-19 03:29:28
Surface Shader中的自定义光照模型
当你在编写 Surface Shaders 时,是在描述一个表面的属性(反射颜色、法线……),而且光的交互过程是由一个光照模型来计算的。内建的光照模型有Lambert(漫反射光照)和BlinnPhong(镜面光照)。
有时候,你可能想要使用一个自定义的光照模型,这在Surface Shader中是可能的。光照模型其实就是一些满足某些约定的Cg/HLSL函数。Unity内建的光照模型Lambert和BlinnPhong定义在Lighting.cginc文件中。这个文件在:
- Windows:{Unity安装目录}/Data/CGIncludes/Lighting.cginc
- Mac:/Applications/Unity/Unity.app/Contents/CGIncludes/Lighting.cginc
光照模型声明
光照模型是一系列名字以Lighting开头的约定函数。它们能够声明在shader文件或者包含的文件中的任何地方。这些函数是:
- half4 Lighting<Name> (SurfaceOutput s, half3 lightDir, half atten);用于正向渲染路径中不依赖视线方向的光照模型。
- half4 Lighting<Name> (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten);用于正向渲染路径中依赖视线方向的光照模型。
half4 Lighting<Name>_PrePass (SurfaceOutput s, half4 light);
用于延迟光照路径中。
注意:你不需要声明所有的函数。光照模型要么使用视线方向,要么不使用。同样的,如果光照模型不工作在延迟光照中,就不要声明 _PrePass函数,而且所有使用它的shader只会编译到正向渲染中。
解码光照贴图
用于正向渲染和延迟光照的光照贴图数据的解码可以被自定义在类似光照函数的方式中。根据光照模型是否依赖视线方向,选择下面其中一种函数。要解码标准的Unity光照贴图纹理数据(传入到color
, totalColor
,indirectOnlyColor
和scale
参数中),请使用内建的DecodeLightmap函数。
自定义解码单张光照贴图的函数是:
- half4 Lighting<Name>_SingleLightmap (SurfaceOutput s, fixed4 color);用于不依赖视线方向的光照模型(如漫反射)。
half4 Lighting<Name>_SingleLightmap (SurfaceOutput s, fixed4 color, half3 viewDir);
用于依赖视线方向的光照模型。
自定义解码两张光照贴图的函数是:
half4 Lighting<Name>_DualLightmap (SurfaceOutput s, fixed4 totalColor, fixed4 indirectOnlyColor, half indirectFade);
用于不依赖视线方向的光照模型(如漫反射)。half4 Lighting<Name>_DualLightmap (SurfaceOutput s, fixed4 totalColor, fixed4 indirectOnlyColor, half indirectFade, half3 viewDir);
用于依赖视线方向的光照模型。
自定义解码方向光照贴图的函数是:
- half4 Lighting<Name>_DirLightmap (SurfaceOutput s, fixed4 color, fixed4 scale, bool surfFuncWritesNormal); 用于不依赖视线方向的光照模型(如漫反射)。
half4 Lighting<Name>_DirLightmap (SurfaceOutput s, fixed4 color, fixed4 scale, half3 viewDir, bool surfFuncWritesNormal, out half3 specColor);
用于依赖视线方向的光照模型。
例子
Surface Shader Lighting Examples
最新文章
- 针对每种Windows Server 操作Excel、Word等Office组件遇到“ComException";、”80070005“等COM错误的解决方案大汇总
- iOS--异步下载
- JavaScript之旅(三)
- Block 及注意事项
- (转) java 简单工厂模式(实现一个计算器)
- 四则运算<;3>;单元测试
- 重构3-Pull Up Method(方法上移)
- NodeJS:树的反序列化
- UIwebView实现html的离线缓存
- 《FPGA零基础入门到精通视频教程》-第001a讲软件的安装
- moodle其他搜集
- Asp.net MVC4高级编程学习笔记-模型学习第五课MVC表单和HTML辅助方法20171101
- Process Doppelg&#228;nging
- V5.7_UTF8_SP1、SP2---任意前台用户登录(cookie伪造)
- AutoHotkey 自动化脚本工具实例
- git客户端的安装及使用
- Python之路(第三十一篇) 网络编程:简单的tcp套接字通信、粘包现象
- urls.py路由系统分发的本质
- Field笔记
- windows无法停止 服务 错误1053 服务没有及时响应
热门文章
- 20160824_CentOS6.4x64_关闭IPv6
- View绘制--onMeasure() 、onLayout()
- 使用 GPG 对数据进行加密解密签名
- rpm安装和卸载软件
- Js获取下拉框当前选择项的文本和值
- mac os 中类似于Linux的yum工具,或ubuntu的apt-get工具Homebrew
- Java:多线程<;四>; Lock、停止线程、守护线程、join、优先级&;yield
- Jenkins快速上手
- 初始化脚本(Os_Init_Optimization.sh)
- 2014年5月份第2周51Aspx源码发布详情