当前位置: 首页 > news >正文

4.4 光照(4) - 高光反射

1.高光

2.Unity环境光

3.Phong光照模型

4.Blinn - Phong光照模型


1.高光

物体表面的反射除了漫反射, 还有高光反射; 观察者的位置对于高光反射很重要, 只有最终直接反射到自己身上的光才能被看见, 其余的地方, 不会看到高光; 因此我们需要物体表面到观察者的方向(顶点和相机的世界空间位置)

在这里插入图片描述

可以通过float3 _WorldSpaceCameraPos访问相机的位置

在这里插入图片描述


2.Unity环境光

unity环境光设置:Window - Rendering - Lighting - Environment - Environment Lighting 

在这里插入图片描述

1).若环境光来源是Skybox和Color时, 可以通过UNITY_LIGHTMODE_AMEIENT获得环境光2).若环境光来源是Gradient(渐变)a.unity_Ambientsky 周围的天空环境光b.unity_AmbientEquator 周围的赤道环境光c.unity_AmbientGround 周围的地面环境光这些内置变量包含在UnityShaderVariables.cginc中

3.Phong光照模型

1).Phong光照模型中物体表面反射光线由三部分组成:环境光 + 漫反射光 + 高光2).Phong光照模型中, 高光的计算方式如下:光源的颜色 * 材质高光反射颜色 * pow(max(0, 视野方向 * 反射光方向), 光泽度)a.视野方向和反射光方向是单位向量

在这里插入图片描述

3).使用pow的原因对于镜面高光的直观感受, 一个微小的偏离就应该造成亮度的大幅度下降a.cos(θ)的曲线在θ = 0°附近变化平缓, 在θ = 90°附近变化剧烈- 当θ从0°增大到30°时, cos(θ)1.0下降到0.87- 当θ从60°增大到90°时, cos(θ)0.5急剧下降到 0.0b.pow(cos(θ), n)曲线在θ = 0°附近的导数(变化率)远远大于cos(θ), 这意味着视线只是产生了一个微小的偏移Δθ, pow(cos(θ), n)的下降量ΔI会比cos(θ)的下降量大得多得多

在这里插入图片描述

4).反射光通过标准函数reflect函数计算反射光的方向, 它采用入射光线的方向, 并根据表面法线进行反射, 因此我们需要取入射光线的反方向

在这里插入图片描述

5).Smoothness 平滑度Phong高光模型产生的高光大小取决于材料的粗糙程度, 光滑的材料可以更好地聚焦光线, 因此它们的高光通常较小; 可以将Smoothness设置为材料属性来控制平滑度, 它通常定义为01之间的值

在这里插入图片描述

通过pow和平滑度值来缩小高光范围, 平滑度值必须大于1才能得到所需的效果, 因此通过将它乘以100

在这里插入图片描述

6).Specular Color 镜面反射颜色高光反射的颜色取决于材质, 不同于反照率; 金属往往几乎没有反照率, 但是具有很强的镜面反射率; 非金属往往具有明显的反照率, 镜面反射率较弱; 因此我们可以添加纹理和色调来定义镜面反射颜色

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


4.Blinn - Phong光照模型

1).最常用的光照模型还是Blinn - Phong光照模型, 其光照模型为:环境光 + 漫反射光 + 高光2).Blinn - Phong中高光的计算时通过半角向量, 如下:高光反射颜色 = 光源颜色 * 材质高光反射颜色 * pow(max(0, 半角向量 * 法线向量), 光泽度)3).半角向量就是视野方向和光线方向角平分线的向量

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

http://www.dtcms.com/a/360486.html

相关文章:

  • 硬件工程师成长之路:从入门到精通的技术旅程
  • [Plecs基础知识系列]建立自定义模块/子系统(Subsystem)
  • C++ 面试高频考点 力扣 69. x 的平方根 二分查找 题解 每日一题
  • Linux网络socket套接字(中)
  • 切片语法[::-1]及其可用的类型
  • 基于单片机智能鞋柜/智能鞋橱/智能鞋盒
  • Linux - #操作系统概念 #权限
  • 获取某天的零点日期
  • Java 异常处理全解析:从基础到实践
  • Rust 登堂 之 枚举和整数(八)
  • OpenCL C++ 平台与设备
  • 集合-单列集合(Collection)
  • DrissionPage 实战:动态 IP 代理与百度翻译 API 数据抓取
  • LeetCode算法日记 - Day 27: 计算右侧小于当前元素的个数、翻转对
  • Linux wlan 之网络问题定位分析 实例一
  • 如何确定虚拟机的IP
  • Qt QML连接数据库如何解决重复创建连接问题
  • 【嵌入式】【电机控制】基础知识列表
  • K8s调度核心:从Pod分配到节点优化
  • MATLAB R2010b系统环境(四)MATLAB帮助系统
  • LeetCode 每日一题 2025/8/25-2025/8/31
  • 模拟在线测试六线测试相关知识
  • 如何快速学习新技能
  • io进程线程;标准IO;0831
  • Java全栈开发面试实录:从基础到微服务架构的深度解析
  • Augment 宣布 Auggie CLI正式向所有用户开放
  • 利用DeepSeek编写验证xlsx格式文件中是否启用sharedStrings.xml对读写效率影响python程序
  • Ring Buffer解析
  • Thread、ThreadLocal、ThreadLocalMap
  • 用户态 kill 与 pthread_kill 的区别?