热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Unity中的基础光照(漫反射)

漫反射光照详情参见:https:github.commrxandlingsa(冯乐乐)兰伯特光照模型(Lambert&#x

漫反射光照

详情参见:https://github.com/mrxandlingsa
(冯乐乐)
兰伯特光照模型(Lambert)
应用:Lambert 模型较好地表现了粗糙表面上的光照现象,如石灰粉刷的墙壁、纸张等
公式:C(diffuse)=(C(light)*m(diffuse))*max(0,n,l)
C(light):入射光线的颜色和强度
m(diffuse):材质的反射系数发v
n:表面法线
l:光源方向
CG中saturate(x)函数可代替上述公式

1)Lambert光照的逐顶点光照实现

Shader "Unlit/Lambert"
{
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;float3 normal : NORMAL;};struct v2f {float4 pos : SV_POSITION;fixed3 color : COLOR;};v2f vert(a2v v) {v2f o;// Transform the vertex from object space to projection space//顶点位置的坐标转化到剪裁空间o.pos = UnityObjectToClipPos(v.vertex);// Get ambient term环境光fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;//公式应用是都在世界空间下进行// Transform the normal from object space to world space//世界坐标下法线向量并归一化fixed3 worldNormal = normalize(mul(v.normal, (float3x3)unity_WorldToObject));// Get the light direction in world space//世界坐标下的光源方向(单一光源)fixed3 worldLight = normalize(_WorldSpaceLightPos0.xyz);// Compute diffuse term//Lambert公式的应用(dot为2个向量的点积)fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal, worldLight));o.color = ambient + diffuse;return o;}fixed4 frag(v2f i) : SV_Target {return fixed4(i.color, 1.0);}ENDCG}}FallBack "Diffuse"
}

在这里插入图片描述
``效果如上
2)逐像素的Lambert光照实现
之需要将世界空间下的法线传递给片元着色器
实现如下:

在这里插入代码片
struct
{float4 pos:SV_POSITION;float3 worldNormal:TEXCOORD0;
}
v2f vert(a2v v) {v2f o;// Transform the vertex from object space to projection space//顶点位置的坐标转化到剪裁空间o.pos = UnityObjectToClipPos(v.vertex);o.worldNormal=mul(v.normal,(float3x3)unity_WorldToObject);return o;}fixed4 frag(v2f i) : SV_Target {fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;fixed worldNormal=normalize(i.worldNormal);fixed3 worldLight=normalize(_WorldSpaceLightPos0.xyz);fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * saturate(dot(worldNormal, worldLight));fixed3 color = ambient + diffuse;return fixed4(color, 1.0);}

效果如下
在这里插入图片描述
3)半兰伯特模型
公式:
C(diffuse)=(C(light)*m(diffuse))(0.5(n,l)+0.5)
原理:将n·l的结果范围从[-1,1]映射到[0,1]的范围内。
只需要更改片元着色器的代码即可

fixed4 frag(v2f i) : SV_Target {// Get ambient termfixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;// Get the normal in world spacefixed3 worldNormal = normalize(i.worldNormal);// Get the light direction in world spacefixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);// Compute diffuse termfixed halfLambert = dot(worldNormal, worldLightDir) * 0.5 + 0.5;fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * halfLambert;fixed3 color = ambient + diffuse;return fixed4(color, 1.0);}

不知道关于漫反射还有其他模型么?


推荐阅读
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • IjustinheritedsomewebpageswhichusesMooTools.IneverusedMooTools.NowIneedtoaddsomef ... [详细]
  • 本文讨论了如何使用Web.Config进行自定义配置节的配置转换。作者提到,他将msbuild设置为详细模式,但转换却忽略了带有替换转换的自定义部分的存在。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 如何在跨函数中使用内存?
    本文介绍了在跨函数中使用内存的方法,包括使用指针变量、动态分配内存和静态分配内存的区别。通过示例代码说明了如何正确地在不同函数中使用内存,并提醒程序员在使用动态分配内存时要手动释放内存,以防止内存泄漏。 ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
author-avatar
banli
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有