在unity的Shader中使用半兰伯特模型来构建光照

在认识半兰伯特模型之前,建议查看一下我之前的兰伯特模型构建光照

  • 兰伯特光照模型

  • 半兰伯特光照模型

由于兰伯特模型的计算公式仅截取了[0,1]的光照区间,因此可能会丢失掉阴影部分的暗部细节。而Valve公司在开发《半条命》的时候,提出了一个新的光照技术,该技术是有原兰伯特光照模型的基础上进行了一个简单的修改——因此被称为半兰伯特光照模型。广义的半兰伯特光照模型如下:

和兰伯特光照模型类似,只是将Max函数替换成了(a·(n·I)+b)这样一来就可以保留充足的暗部细节。通常情况下,a和b的值为0.5。即该公式为如下:

之所以能够保留住暗部细节,是因为就算 n·I 的值最大为1,也会被乘0.5,然后再加上0.5。仍然可以确保右边括号仍然大于0且小于1。意思是将所有点积结果缩小后,再整体放大0.5,最终的效果其实是偏亮的。因为就算是阴影部分,最后还是会被提高了0.5。

  • 兰伯特模型 和 半兰伯特模型 的对照:

  • 半兰伯特光照模型Shader代码


Shader "LeonShader/shader_6_4_Diffuse_HalfLambert"
{Properties{_Diffuse("Diffuse",Color) = (1,1,1,1)}SubShader{Pass{Tags { "LightMode" = "ForwardBase"}CGPROGRAM#pragma vertex vert#pragma fragment frag#include "Lighting.cginc"fixed4 _Diffuse;struct a2v {float4 vertex : POSITION;float4 normal : NORMAL;};struct v2f {float4 pos : SV_POSITION;float3 worldNormal : TEXCOORD0;};v2f vert(a2v v) {v2f o;//将定点左边从本地空间转变投影空间o.pos = UnityObjectToClipPos(v.vertex);//得到环境信息fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;//法线信息由物体空间转变为世界空间o.worldNormal = mul(v.normal, (float3x3)unity_WorldToObject);return o;}fixed4 frag(v2f i) : SV_Target{fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;fixed3 worldNormal = normalize(i.worldNormal);fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);fixed halfLambert = dot(worldNormal, worldLightDir) * 0.5 + 0.5;fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * halfLambert;fixed3 color = ambient + diffuse;return fixed4(color , 1.0);}ENDCG}}FallBack "Diffuse"
}

【Unity Shader】(2)半兰伯特模型 构建光照相关推荐

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

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

  2. 标准光照模型-半兰伯特模型

    Valve公司在<半条命>中提出了一种技术,叫做半兰伯特光照模型 通过这个方式,可以把点积的结果从[-1,1]到[0,1]范围内,也就是说,对于模型的背光面,从原模型中点积结果会映射到同一 ...

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

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

  4. U3D Shader半兰伯特模型

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

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

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

  6. Shader学习2——兰伯特

    本以为写个兰伯特很简单,但是仔细考虑了一下,不光要受场景中光源影响,还需要受环境光影响,然后发现单个pass通道只能实现单光源.因此前期我们都只考虑单平行光. 兰伯特:漫反射颜色 = 光源颜色 x 材 ...

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

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

  8. 漫反射:兰伯特和半兰伯特

    兰伯特定律(Lambert is law); 反射光线的强度与表面法线和光源方向之间夹角的余弦值成正比: 漫反射公式:C diffuse=(C light * M diffuse)max(0, < ...

  9. 6.2 漫反射-半兰伯特

    //漫反射 半兰伯特 diffuse = (c.m)(0.5(n.i)+0.5) //模型背光面有可以有明暗变化 Shader "Unity shader book/Chapter 6/Ha ...

最新文章

  1. LabVIEW色彩分类识别(基础篇—15)
  2. 6. Oracle闪回特性
  3. (Spring)使用注解开发
  4. Autofac框架初识与应用
  5. mybatis postgresql insert后返回自增id
  6. Zookeeper 的 5 大核心知识点!
  7. 常用的作业调度算法应用练习
  8. STM32学习笔记(五)——通用定时器计数延时
  9. git-对比不同-版本与文件的对比,版本与版本的对比
  10. mysql function DATE_FORMA T(date, format)
  11. 第十一讲 在ASP.NET中使用用户控件
  12. B站视频下载:如何下载B站视频到电脑上
  13. BMZ-MISC-损坏的压缩包
  14. Wiz.Editor.md 为知笔记 Markdown 插件
  15. 几个IDS开源系统介绍
  16. vue+spring boot项目实现PC端微信登录
  17. Android心率测试
  18. C++实现单链表的基本操作
  19. java循环购物车结算系统,购物车js代码_JS实现购物车商品列表结算功能代码
  20. qq家园文字版二战风云的建筑类型

热门文章

  1. 基于Inception v2实现判别mnist手写数据集
  2. ALM新手上路(四)
  3. 基于C++实现视频聊天软件(一)
  4. 【Beta阶段】Scrum meeting 3
  5. matlab 归一化功率谱,求大神指点如何画归一化功率谱的图像啊
  6. java获取每周的周一到周日时间节点
  7. 基于matlab的数字图像边缘检测算法研究,基于MATLAB数字图像边缘检测算法的研究与对比分析...
  8. 反恐精英枪王对决 服务器维护6,反恐精英之枪王对决
  9. uni app图片预览
  10. Python基础(一)- 介绍