Valve公司在《半条命》中提出了一种技术,叫做半兰伯特光照模型

通过这个方式,可以把点积的结果从[-1,1]到[0,1]范围内,也就是说,对于模型的背光面,从原模型中点积结果会映射到同一个值,即0处;而在半兰伯特模型中,背光面也可以有明暗变化,不同的点积结果会映射到不同的值上。

// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'// Upgrade NOTE: replaced '_World2Object' with 'unity_WorldToObject'//半兰伯特
Shader "HalfLambert"
{Properties{_Diffuse("Diffuse", Color) = (1,1,1,1)}SubShader{Pass{Tags{"LightModel" = "ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#include "Lighting.cginc"float4 _Diffuse;struct a2v{float4 vertex : POSITION;float3 normal : NORMAL;};struct v2f{float4 pos : SV_POSITION;float3 worldNormal : TEXCOORD0;};v2f vert(a2v v){v2f o;//转换顶点从模型空间到裁剪空间o.pos = UnityObjectToClipPos(v.vertex);//转换法线从模型空间到世界空间o.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject);return o;}fixed4 frag(v2f o) : SV_TARGET{//获取环境光fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;//获取法线float3 normal = normalize(o.worldNormal);//获取世界空间的直射光float3 worldLight = normalize(_WorldSpaceLightPos0.xyz);//计算半兰伯特fixed halfLambert = dot(normal, worldLight) * 0.5 + 0.5;//计算漫反射光fixed3 diffuse = _Diffuse.rgb * _LightColor0.rgb * halfLambert;return fixed4(diffuse + ambient, 1);}ENDCG}}Fallback "Diffuse"
}

标准光照模型-半兰伯特模型相关推荐

  1. 【Unity Shader】(2)半兰伯特模型 构建光照

    在unity的Shader中使用半兰伯特模型来构建光照 在认识半兰伯特模型之前,建议查看一下我之前的兰伯特模型构建光照 兰伯特光照模型 半兰伯特光照模型 由于兰伯特模型的计算公式仅截取了[0,1]的光 ...

  2. U3D Shader半兰伯特模型

    兰伯特光照模型--在平面某点漫反射光的光强与该反射点的法向量和入射光角度的余弦值成正比.逐像素光照可以得到更加哦平滑的光照效果.但是,即便使用了逐像素漫反射光照,有一个问题仍然存在.在光照无法达到的区 ...

  3. 9.半兰伯特光照模型

    前情提要:前面一节的漫反射实际上是根据兰伯特光照模型来进行实现的 但这种做法有个缺点就是顶点法线和光的夹角大于90度的时候的成色是完全黑的这和我们生活中见到的事物是不一样的.所以就有了新的光照模型-- ...

  4. 兰伯特光照模型(Lambert Lighting)和半兰伯特光照模型(Half-Lanbert)

    关于漫反射 光打到凹凸不平的平面上,光线会被反射到四面八方,被称为漫反射 关于这种模型,由于光线由于分散,所以进入人眼的光线强度和观察角度没有区别 在A点和B点接收到的光线强度是一样的 在漫反射下,光 ...

  5. Shader学习3——半兰伯特

    半兰伯特其实就是把暗的地方提亮了一些,在数值上就是获取到的光源强度* 0.5 + 0.5,也就是原来是0的会变成0.5,原来是1的还是1. 半兰伯特:漫反射颜色 = 光源颜色 x 材质的漫反射颜色 x ...

  6. 庄懂老师TA学习笔记 - 半兰伯特光照模型

    先看一下兰伯特光照模型的公式 Max(0, nDir ·lDir) 通过公式我们知道,当法线方向和光照方向的反方向的角度大于90度时,点乘就会出现负数的结果,所以我们使用与0取最大值来排除掉这些没有实 ...

  7. Unity shader学习-漫反射-兰伯特光照模型和半兰伯特光照模型

    兰伯特漫反射公式:Diffuse = 直射光颜色 *物体颜色* max(0,cos夹角(光和法线的夹角) ) 下面给出顶点漫反射代码:   Shader "Unlit/005" { ...

  8. Unity Shader漫反射光照模型与半兰伯特光照模型

    文章目录 一.基础光照模型中漫反射部分的计算公式 二.逐顶点光照实现 逐顶点代码 逐顶点效果图 三.逐像素光照模型实现 逐像素代码 逐像素效果图 四.半兰伯特光照模型实现 广义半兰伯特光照模型公式 半 ...

  9. Unity shader 使用 半兰伯特 (Half-Lambert)漫反射会使得模型在没有直射光的情况下漆黑一片

    问题: Unity shader 使用 半兰伯特 (Half-Lambert)漫反射会使得模型在没有直射光的情况下漆黑一片,原因不得而知. 使用半兰伯特漫反射代码如下: *************** ...

最新文章

  1. 如何分析java程序_如何利用 JConsole观察分析Java程序的运行,进行排错调优
  2. cxGrid 在 GridMode = True 模式下实现标题点击排序以及标题列过滤筛选!!!
  3. 小窍门解决大问题(组图)
  4. NHibernate学习导航
  5. 开源 计划管理_公司开源计划的三大好处
  6. POJ 1981 Circle and Points 单位圆覆盖
  7. html下拉框绑定字段,封装html的select标签的js操作实例
  8. 【原创】技术员 Win10 PE 网络版启动工具 V6.2 兼容UEFI双启动
  9. 第三方支付系统简易版支付系统部署
  10. protobuf静态库隐藏符号的坑
  11. 连接网络打印机报错0x000003e3
  12. Sketch Less for More: On-the-Fly Fine-Grained Sketch Based Image Retrieval (CVPR 2020 Oral)
  13. 面试了10几家公司后被怼,逼的我把源码都吃透了,最终成功入职阿里
  14. C++——Hook教程[1]:虚函数表(VMT)Hook
  15. keil 增加 芯片包_国内首家!平头哥刚刚宣布开源RISCV内核MCU芯片设计平台
  16. c# 容联云_Rest Server Demo_开发文档_容联云通讯
  17. Σoφoς:简单但有效的前向安全对称可搜索加密
  18. linux的网络管理,Linux之网络管理
  19. 个人计算机也可称为,个人计算机简称为PC机,这种计算机属于什么?
  20. c语言初学知识点,C语言学习关于数据类型的一些知识点(初学者)

热门文章

  1. Python面向对象之:三大特性:继承,封装,多态以及类的约束
  2. 采用scp命令进行FTP数据迁移
  3. 流利说AI刘扬:从教授到”AI虚拟老师“
  4. 遇文件尾测试结束c语言,Fortran和C语言测试文件尾的方法
  5. c语言停车场的收费管理系统,c语言停车场管理系统
  6. 【计算机原理与接口技术(UNIX)⑲ 完结篇】——可编程计数器 8254 [ 流光发生器、8254工作方式检测程序的设计]
  7. poj 3274 数的哈希
  8. MySQL 幻读和不可重复读的区别
  9. harris角点匹配 matlab,基于Harris角点的图像匹配算法
  10. ffmpeg学习笔记