首页 > 其他分享 >unity shader入门精要第六章原理总结

unity shader入门精要第六章原理总结

时间:2023-10-24 14:36:26浏览次数:31  
标签:法线 漫反射 光反射 shader 方向 unity 表面 精要 光照

前言

开发中常常有一些画面表现上的需求,但苦于不会写Shader,没办法实现,现在特地来学习相关原理知识。

UnityShader入门精要的第六章前的内容已经很详尽了,在此不做记录。但第六章中的基础光照模型比较常见,这部分内容在GAMES101中也有讲解,可见其重要性,在此记录一下。

标准光照模型(Blinn-Phong模型 )

最初的光照模型由Phong提出,他把进入到摄像机的光照分为四个部分:自发光、高光反射、漫反射、环境光。

  1. 自发光:emissive,给定某个方向时,一个表面自身会向该方向散发多少辐射量。
  2. 漫反射:diffuse,光照某个表面时,该表面会向每个方向散发多少辐射量。
  3. 高光反射:specular,光照某个表面时,该表面会向完全镜面反射方向散发多少辐射量。
  4. 环境光:ambient,其他所有间接光照。

计算光照时,就由这四个部分做贡献,接下来介绍对应公式。

自发光

自发光计算最简单。它的贡献度(Cemissive)就是该表面材质的自发光颜色(Memissive)。

\[c_{emissive} = m_{emissive} \]

漫反射

漫反射符合兰伯特定律。它的贡献度,即反射光线的强度(Cdiffuse)与表面法线和光源方向之间夹角的余弦值成正比。

\[c_{diffuse} = (c_{light}·m_{diffuse})max(0, n·I) \]

Clight是光强,Mdiffuse是该表面材质的漫反射颜色,n是表面法线,I是指向光源的单位矢量。这里对表面法线和指向光源的单位矢量点乘的结果做max运算是为了将结果截取到0,防止光源将物体的背后也照亮。

高光反射

这里的高光反射是一种经验模型,它并不完全符合现实世界的高光反射现象。

它的贡献度(Cspecular)由四个参数计算得出,分别是入射光强(Clight)、表面材质的高光反射系数(Mspecular)、视角方向(v)和反射方向(r)。除此之外还可以加上材质的光泽度(Mgloss)来控制高光区域的范围。

\[c_{specular} = (c_{light}·m_{specular})max(0, v·r)^{m_{gloss}} \]

其中反射方向r可以由表面法线(n)和光照方向(I)计算得出。

\[r = I - 2(n·I)n \]

Blinn对这里做了一些修改,他提出不再计算反射方向r,而是改为:将视角方向v和光照方向I相加后做归一化,得到一个新矢量h,然后使用h和表面法线n作点乘,以此替代Phonn模型中的v·r

环境光

它的贡献度(Cambient)一般为全局变量,由开发者自行设置。

标签:法线,漫反射,光反射,shader,方向,unity,表面,精要,光照
From: https://www.cnblogs.com/OtusScops/p/17784713.html

相关文章

  • 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(1)
    在我们的SqlSugar的开发框架中,整合了Winform端、Vue3+ElementPlus的前端、以及基于UniApp+Vue+ThorUI的移动前端几个前端处理,基本上覆盖了我们日常的应用模式了,本篇随笔进一步介绍前端应用的领域,研究集成WPF的应用端,循序渐进介绍基于CommunityToolkit.Mvvm和HandyControl的WPF应用......
  • Unity中国、Cocos为OpenHarmony游戏生态插上腾飞的翅膀
    Unity中国、Cocos为OpenHarmony游戏生态插上腾飞的翅膀2023年是OpenHarmony游戏生态百花齐放的一年!为了扩展OpenHarmony游戏生态,OpenHarmony在基金会成立了游戏SIG小组,游戏SIG小组联合cocos,从cocos2dx入手一周内快速适配了cocos2.2.6的MVP版本,随后又分别适配了cocos2dx 3.x、4.x版......
  • Unity3D学习记录04——利用射线实现角色类似LOL的移动
    首先新建一个空白的GameObject,挂在一个MouseManager的脚本实现思路:通过获取鼠标点击的位置,获得该位置的信息,然后使角色移动到该位置MouseManager脚本的代码如下:1usingSystem.Collections;2usingSystem.Collections.Generic;3usingUnityEngine;4usingUnityEngi......
  • Unity中国、Cocos为OpenHarmony游戏生态插上腾飞的翅膀
     2023年是OpenHarmony游戏生态百花齐放的一年!为了扩展OpenHarmony游戏生态,OpenHarmony在基金会成立了游戏SIG小组,游戏SIG小组联合cocos,从cocos2dx入手一周内快速适配了cocos2.2.6的MVP版本,随后又分别适配了cocos2dx 3.x、4.x版本以及cocos creator的2.4.12和3.18版本并在官......
  • Unity3D学习记录03——Navigation智能导航地图烘焙
    首先还是在PackageManager中安装AINavigation接着选择我们场景的地面,右键,找到AI的NavMeshSurface,它会为我们的Ground添加一个叫NavMeshSurface的子物体在Inspector窗口中可以看到它的详细的参数:图中的R,H为你人物的参数,45°为你的人物可以爬行的最大角度AgentType里面可......
  • Unity战斗单元UI血条架构设计
    1:如何选取技术方案 Unity战斗系统中,每个角色经常会有血条与昵称。如何架构设计才高效,我们列举一些常用的做法:(1)onGUI来做昵称与血条;(2)3D世界中创建一个3D物体来做血条与昵称,然后让血条与昵称对着摄像机;(3)基于UGUI/NGUI单独做血条与昵称的UI节点,然后把UI节点位置......
  • 你是如何做好Unity项目性能优化的
    在面试中,我们经常会被问各种”莫名奇妙”的问题, 比如这道:”你是如何做好Unity项目性能优化的?”。“这个问题也太泛了吧,没有具体的优化点,这怎么回答?”瞬间跃入脑海。做面试复盘的时候,你可能会想这个面试官是不是什么都不懂,是个”青铜”啊。没错,能问这道问题的面试官要么是个......
  • 循序渐进介绍基于CommunityToolkit.Mvvm 和HandyControl的WPF应用端开发(12) -- 使用
    1、代码生成工具Database2Sharp生成WPF界面代码WPF应用端的基础接口,和Winform端、Vue3+ElementPlus前端一样,都是调用SqlSugar开发框架中的相关业务接口,如果对我们的SqlSugar框架还有疑问,可以参考我的随笔集《SqlSugar开发框架》进行系列的学习或了解。要了解项目的快速生成,需要......
  • unity 使用interface 判断 null错误的问题
     在使用Interface,并且由Monobehaviour继承Interface情况下,判断interface的实际UnityEngine.Object是否null,出现错误,没有成功的判断出已经Destroy https://gamedev.stackexchange.com/questions/128971/unity-c-interface-object-never-equals-null解决方案:https://discuss......
  • Unity2023零基础入门学习
    Unity游戏引擎是什么?游戏引擎是一种软件框架,用于开发和创建电子游戏。它提供了一系列工具和功能,帮助开发者设计、构建和管理游戏的各个方面,包括图形渲染、物理模拟、音频处理、动画、碰撞检测、人工智能等。游戏引擎可以简化游戏开发过程,提高效率,并提供跨平台的支持,使开发者能......