位置: 编程技术 - 正文

【猫猫的Unity Shader之旅】之Lambert光照(猫的所有视频)

编辑:rootadmin

推荐整理分享【猫猫的Unity Shader之旅】之Lambert光照(猫的所有视频),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:猫的好玩视频,猫的所有视频,猫咪的testflight,猫的游戏解说,猫的好玩视频,猫的游戏解说,猫的游戏解说,猫猫的游戏,内容如对您有帮助,希望把文章链接给更多的朋友!

  在介绍高光材质的时候我们提到了Lambert(兰伯特)光照,这是一种surface shader中非常常用的光照模型。兰伯特光照用来描述简单的漫反射情形时非常好用。这种光照模型的特点就是颜色的亮度会随着光照方向与物体表面的垂直程度来决定,当光照方向垂直于物体时,颜色就会非常亮,接近平行时,颜色就会非常暗。兰伯特光照其实是这样一个等式:

  Idiffuse = Iincomingkdiffusemax(0, N·L)

Lambert 原理

  首先,我们来回忆一下颜色的产生过程。学过物理的人都知道,比如我们看到一个物体是红色,其实是由于它反射了红色的光,如果我们把这个红色的物体放到一个密室中,用绿色的光照射它,那么我们看到的物体应该是黑色,因为它不能反射绿色的光。也就是说我们通常说的物体的颜色其实指的是它对于不同颜色光的反射能力,我们给它一个名字叫反射率(Albedo)。这个反射率用一个三元数来表示对光的颜色的三个不同分量的反射程度。比如刚才的红色物体,我们就可以说它的Albedo是(1.0, 0.0, 0.0),当我们用太阳光(白色)照射它时,显示为红色(1,0, 0.0, 0.0),是一个乘的关系。

  我们再看下上面的等式(人家专业名字叫光照方程),前半部分Iincomingkdiffuse就表示光照颜色和反射率相乘。然而在现实世界中,由于光照直射程度的不同,物体的颜色也会有明暗的变化,为了表示这种变化,Lamber光照又加入了表示直射程度的修正参数max(0, N·L)。当光照方向L与物体法线方向N平行时,即光照垂直于物体表面,这个参数为最大值1,垂直时,为最小值0,max函数为了避免当两者夹角大于度时情况,因为此时光照在后面,我们不考虑这种情况。

需要解决的几个问题光照颜色从哪来反射率从哪来光照方向和法线方向从哪来

  嗯。正是光照方程的几个数据。先说第一个,Unity内部已经为我们提供了很多参数,具体可以看这里,其中有一个就是_LightColor0,表示光照颜色,但是需要添加特定的Tag才能正确使用,后面会说到。至于反射率当然是由我们自己定义,由shader用户输入,毕竟物体是什么颜色还是要我们自己说了算。

  光照的方向就要分情况讨论了。有个内置的_WorldSpaceLightPos0变量,当它的w是0的时候表示这是一个方向光,此时xyz直接表示方向光的方向(世界坐标系),如果w不是0,则表示这是一个点光,此时xyz表示点光的位置(世界坐标系),我们需要手动计算光照方向。聚光灯属于比较复杂的情况这里就先不讨论了。

  法线在物体坐标系下的数据我们可以从appdata_xxx中获得,但是我们也光照方向是用世界坐标表示的,我们需要把法线从物体坐标转换到世界坐标,具体方法是右乘物体坐标到世界坐标的转换矩阵的转置矩阵的逆矩阵,这句话有点复杂,还好Unity已经给我们提供了内置的变量,用法线方向右乘_World2Object * unity_Scale.w。需要注意的是_World2Object * unity_Scale.w的右下角的元素其实是不正确的(文档有描述),但是我们的向量是三元数,乘的时候是需要补零的因此右下角的元素不会影响结果。另一点是我们的法线计算出来后会进行标准化所以 unity_Scale.w(用来修正缩放)也不需要了。这一块比较复杂,如果看不明白可以先记住怎么用。

简单的Lambert实现

  写具体代码之前其实还有一个问题就是我们的Shader用的是哪个光照。在Unity中我们可以有多个光源,也可以设置不同的渲染路径(在Edit->Project Setting->Quality中),不过这次我们先考虑前向渲染路径的情况。

  在前向光照中有三种处理:

逐像素处理(pixel light)逐顶点处理球谐函数(Spherical Harmonics,SH)处理

  这里为了简单起见,我们仍然只关注逐像素处理的方式。Unity中光照的规则还是很复杂的,还是以后有机会慢慢探索吧。

  那么什么样的光照是pixel light呢,大概有这么几个规则:

Unity所谓的“第一个像素光“,总是场景中最重要的方向光。光照的RenderMode会改变这里所说的”最重要“。像素光数目,在Edit->Project Settings->Quality中设置,一定程度上影响RenderMode为Auto的光源是否为pixel light。【猫猫的Unity Shader之旅】之Lambert光照(猫的所有视频)

  对于场景中有多个pixel light的情况,我们需要用多个Pass来分别处理。对于”第一个像素光”,Unity会调用Tags中有”RenderMode“ = ”ForwardBase“的Pass,其他的则调用Tags中有”RenderMode“ = ”ForwardAdd“的。

  不同的Pass之间的关系依然是通过Blend来处理。

  下面是大家期待已久的完整代码:

  下面是一些效果图:

  

  这是单个白色方向光,物体为红色的情况。

  

  红绿两种方向光,物体为白色的情况。

  

  红色方向光和蓝色点光,物体为白色的情况。

  可以看到第三种情况有较为明显的明暗变化。如果模型换成球效果应该会更好。

结束语

  真的已经往简单的写了,其实其中很多细节我也还没有研究明白。也可以看出来用Vertex&Fragment Shader写Shader需要填补多少细节,不像Surface Shader那样傻瓜化。不过还是那句话,两者各有方便之处,按需选择,就像傻瓜相机和专业相机,没有哪个一定比哪个好,看使用情况。

UnityShader实例:边缘光材质 边缘光材质边缘光材质原理和xray材质相类,shader代码也就长得几乎一样了,一般游戏中做一些角色的背光效果,或者宝石材质(如下图所示),总之看

【Unity3d】疑难杂症解决之系统报错:Supplied NxActorDesc is not valid. createActor returns NULL 最近用Unity3d开发的游戏项目忽然频频报错:SuppliedNxActorDescisnotvalid.createActorreturnsNULL.按照csdn的搜索结果:

linux下安装unity web player的方法 作者原创,复制转载请注明出处

标签: 猫的所有视频

本文链接地址:https://www.jiuchutong.com/biancheng/369261.html 转载请保留说明!

上一篇:【Unity3d】如何解决错误:A script behaviour has a different serialization layout when loading(unity小技巧)

下一篇:UnityShader实例03:边缘光材质(unity de)

  • 企业购买银行理财的条件
  • 本年利润呈亏损要不要上企业所得税?
  • 小规模做账流程详细
  • 什么企业符合加计扣除的条件
  • 增值税即征即退收入要交企业所得税吗
  • 建筑行业一般纳税人增值税税率是多少
  • 土地补偿费入什么科目
  • 中小企业工会经费怎么算
  • 小规模纳税人超过500万可以不转一般纳税人吗
  • 房地产项目结转条件
  • 延期缴纳税款的审批机关是
  • 商品互换的概念
  • 现金管理规定有哪些主要内容
  • 公司购买电脑费用怎么报销
  • 利润表中的上期金额怎么填?
  • 客户已经抵扣的发票怎么开负数发票给对方
  • 给职工发放的福利费,要从应付职工薪酬科目吗
  • 个人所得税0申报操作流程
  • 白酒出口税收
  • 财产租赁所得适用什么税率
  • 营改增后如何确认老项目营改增前收入
  • 增值税发票时效性
  • 出口运保佣账务处理
  • 无法支付的其他应付款可以用现金核销吗
  • mac电脑安装了windows
  • 办公家具折旧年限及计算方法
  • 进项税和销项税怎么算
  • 增值税专用发票和普通发票的区别
  • 销售收入的暂估入账
  • linux获取操作命令的使用方法
  • 税收保全有哪些
  • 营业外收入账户贷方登记企业发生的各项营业外收入
  • 损益类科目细分
  • 可变现净值高于成本计入当期损益吗
  • 戈佐西餐厅
  • wordpress自定义函数
  • 汽车因质量原因泡水能退车吗
  • linux查看ssh服务开启
  • 应收账款逾期的危险信号
  • php获取post请求参数
  • 贝尔纳贝
  • 税务申报说明怎么写范文
  • uniapp微信小程序广告
  • 管家婆付款单凭证科目如何修改
  • 残保金缴纳需要计提吗
  • 租金发票的税率多少
  • 其他综合收益什么情况下转入留存收益
  • 预收货款尚未发货
  • 建筑企业未按规定预缴增值税
  • python动态数据类型
  • 企业研发费用可以抵税吗
  • 补发去年工资会被扣税吗
  • 住宿发票规格型号一栏写什么
  • 小型商贸企业
  • PostgreSql新手必学入门命令小结
  • sql查询出各科成绩单
  • 28栏分次预缴税额是手动填写吗?
  • 以前年度损益调整
  • 租单位的房子怎么办营业执照
  • 律师事务所的所属行业是什么
  • 旅行社开具的发票可以作为福利费税前支出吗
  • 分公司能
  • 收到科技局补贴金费怎么入账
  • 用友t3月末转账流程图
  • 银行回单自助打印可以打多久的记录
  • 非营利医疗机构由谁批准
  • WINDOWS操作系统最新版本
  • win10分辨率2560*1080
  • adguard安全性
  • 如何将电脑的win7系统变为win10
  • win7怎么查看系统位数
  • 两台没联网的电脑怎么创建局域网
  • 游戏引擎有几种
  • rsync安装使用详解
  • 在javascript中用下面哪个关键词来定义变量
  • vs2010编译器在哪里?
  • 甘肃增值税发票查验平台官网
  • 开电子发票流程步骤
  • 收取广告费收入怎么入账
  • 国际贸易争端的形式
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设