IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> 21.11.25 《Unity 2018 Shaders and Effects Cookbook》笔记Chapter4 -> 正文阅读

[游戏开发]21.11.25 《Unity 2018 Shaders and Effects Cookbook》笔记Chapter4

4.Lighting Models

  1. 自定义光照模型(custom lighting model)

    1. 改变#pragma指令为:#pragma surface surf LightingModelName
    2. 创建一个名为Lighting + LightingModelName的函数
    3. 例:指令为【#pragma surface surf SimpleLambert】,创建对应函数【LightingSimpleLambert()】
  2. 当两向量点积为0时(求点积函数dot()),两向量成90°角(正交)

  3. 兰伯特反射

    1. 仅用点积作为光强的系数NdotL(N:Normal 表面法线 L:lightDir 光的方向)
    2. Unity已实现对应函数LightingLambert,可以直接使用#pragma surface surf Lambert(同时也有Phong、BlinnPhong)
    3. color.rgb = s.Albedo * _LightColor0.rgb * (NdotL * atten);
  4. ToonShader

    1. 仅用曲面函数得到卡通效果是代价极其昂贵且耗时的(extremely expensive and time consuming)

    2. 卡通阴影需要使用光照模型实现,被称为赛璐珞/赛璐璐(celluloid, 简写CEL)

    3. 使用坡道贴图决定收到的阴影,使用NdotL在坡道贴图上采样得到光强的系数

    4. 或者不使用坡道贴图,用NdotL的值在0到1之间等距采样 (snap),如:

      half cel = floor(NdotL * _CelShadingLevels / (_CelShadingLevels - 0.5);

  5. Unity还提供了观察方向viewDir,在自定义光照模型中是可选的,可以写

    1. half4 LightingCustomName (SurfaceOutput s, half3 lightDir, half atten)
    2. half4 LightingCustomName (SurfaceOutput s, half3 lightDir, half3 viewDir, half atten)
  6. 冯氏反射(Phong, 镜面反射模型,带viewDir)

    1. 最终光强I = 漫反射颜色D + 镜面反射S

    2. D = NdotL(与兰伯特反射相同)

    3. S = (Reflection dot viewDir)p

      float spec = pow(max(0, dot(reflectionVector, viewDir)), _SpecPower);

    4. Reflection = 2 * N * (N * NdotL) - LightDir :向量代数中可以依此公式计算出来

      float3 reflectionVector = normalize(2.0 * s.Normal * NdotL - lightDir);

    5. c.rgb = (s.Albedo * _LightColor0.rgb * max(0,NdotL) * atten) + ( _SpecularColor.rgb *_LightColor0.rgb * spec);

  7. 布林冯模型(BlinnPhong模型)

    1. 使用半程向量(viewDir和LightDir)替代了反射向量R的计算,半程向量halfVector = |V + L|
    2. float3 halfVector = normalize(lightDir + viewDir);
    3. spec = pow(max(0, dot(s.Normal, halfVector)), _SpecPower) * _SpecularColor;
    4. color.rgb = (s.Albedo * _LightColor0.rgb * NdotL) + ( _SpecularColor.rgb *_LightColor0.rgb * spec) * atten;
  8. 各向异性镜面模型Anisotropic

    1. 创建数据连接,需要把anisoDir信息(存在tex中)传递给Lighting函数,在surf函数中可以计算出这个值(tex2D()函数),所以用到自定义的输出结构

      strutc SurfaceAnisoOutput { … } 设置surf(Input IN, inout SurfaceAnisoOutput o)

      设置fixed4 LightingAnisotropic(SurfaceAnisoOutput s, fixed3 lightDir, half3 viewDir, fixed atten)

    2. 计算半程向量halfVector和NdotL

    3. 计算HdotA,A是各向异性方向和法线的半程向量(可以反应反射方向和各向异性方向的夹角)

      fixed HdotA = dot(normalize(s.Normal + s.AnisoDirection), halfVector);

    4. 计算各向异性系数,用sin函数帮助修正上面得到的值,这个公式可以得到一个较暗的中间高光

      float aniso = max(0, sin(radians((HdotA + _AnisoOffset) * 180)));

    5. 用pow函数放大各项异性的影响,并乘以反射系数来降低总体强度

      float spec = saturate(pow(aniso, s.Gloss * 128) * s.Specular);

    6. c.rgb = ((s.Albedo * _LightColor0.rgb * NdotL) + ( _SpecularColor.rgb * _LightColor0.rgb * spec)) * atten;

  9. 注:注意到从书中摘抄的公式中,atten系数有些只乘在漫反射上,有些只乘在镜面反射上,有些两个都乘了,不清楚是作者故意为之还是其中有什么讲究,通过修改代码实验,肉眼也没有看出来区别;按照个人理解,光照衰减对两种反射都应该有影响,才疏学浅且眼光有限,故该问题留个人实力提升后解答

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-11-27 10:14:05  更:2021-11-27 10:14:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 22:22:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码