位置: 编程技术 - 正文

【猫猫的Unity Shader之旅】之一个完整的Shader示例(猫猫的娱乐)

编辑:rootadmin
Unity Shader结构介绍

推荐整理分享【猫猫的Unity Shader之旅】之一个完整的Shader示例(猫猫的娱乐),希望有所帮助,仅作参考,欢迎阅读内容。

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

  上回我们创建了一个用自己的材质和Shader的立方体,并且举例说了模型、材质、Shader三者的关系,想必大家已经很了解了。还不了解的同学请戳这里。对于我们创建的Shader,虽然我们自己没有写代码,但是Unity为我们生成了一个简单的Shader:

  从结构上来看,Shader最外层是一个“Shader”开头的代码块,中间的”Custom/CubeShader”是Shader的路径,也就是我们从材质的Shader列表中选择的位置。

  代码块中间是Shader的具体内容,这里分为三部分:

Properties块,该Shader的属性,也就是Shader的接口,会以UI的形式显示在使用该Shader的材质的属性面板上。

SubShader块,是Shader的主要内容,一个Shader中可以有一个或多个SubShader,Unity会选择一个合适的执行。如果有多个合适的,会按照从上到下的顺序选择。这样的目的是为了兼容新旧显卡,我们可以把只有在新显卡才能支持的代码写在上面,新旧都支持的写在下面,这样当程序运行在新显卡的时候就会显示更好的效果,在旧的显卡上也能保证正常运行。

FallBack语句,Shader的“备胎”,类似于default语句。当所有的SubShader都不合适的时候,Unity就会选择FallBack给定的Shader运行。

 Shader属性

  Unity Shader中属性的定义语法如下:

  

  Ps技术让大家见笑了…

  总体来说,属性就是Shader内外交互的一个桥梁。无论是从编辑器UI上去修改,还是通过脚本给Shader赋值,我们最终会通过变量名去拿到输入的值。至于显示名,是在UI中显示的该属性的描述。比如我们新建的Shader,UI上显示是这样的:

  

  这里的“Base(RGB)”就是属性的显示名。

  Unity Shader提供了不同类型的属性,这些属性决定了属性可以接受的值得类型和默认值是什么。具体的类型有以下几种,:

  在UI上看到的结果是这样的:

  

 SubShader块

  这里就是Shader的主要代码啦。这里第一行有个Tags。这个Tags里面是当前SubShader的所有标签。这些标签的形式都是“xxx”= “yyy”,告诉Unity“xxx”这个属性的值是“yyy”。多数情况下,我们使用内置的标签就可以了,如果有需要,也可以自己定义标签自己用。在我们这个例子中,就是告诉Unity我们定义的渲染类型为Opaque。

【猫猫的Unity Shader之旅】之一个完整的Shader示例(猫猫的娱乐)

  之后的一行定义了LOD值为。LOD是Levels of Detail的缩写,我们可以简单的认为LOD给我们的Shader标示了一个品质,比方说就是紫色品质。在Unity中可以设置最大允许的LOD值。这样如果我们设置的最大LOD比这个SubShader的LOD低,Unity就会认为这个SubShader是不合适的啦。不过具体这个最大LOD怎么设置猫猫现在还没有弄明白,如果有路过的大神懂得怎么设置还请赐教。

  再后面位于CGPROGRAM和ENDCG之间的就是SubShader的主要代码啦~用CGPROGRAM和ENDCG表示我们的Shader用的是Cg/HLSL语言编写的,如果用GLSL则需要改为GLSLPROGRAM和ENDGLSL。后面一句#pragma surface surf Lambert是一条编译指令,告诉Unity我们现在写的是一个Surface Shader,它的Surface方法名叫surf,我们使用的光照模型叫做Lambert(兰伯特)。

  这里简单给大家补充一下,Unity中的shader分为三类:

固定管线Shader可编程Shader(vertex+fragment Shader)Surface Shader

  其中的Surface Shader最容易上手,虽然对于一些复杂的渲染效果Surface Shader会力不从心,但是它毕竟可以让我们快速的了解和学习Shader,而且编写一些比较简单的Shader时Surface Shader也足够了,所以我们选择从Surface Shader开始我们的旅程。

  后面我们定义了变量_MainTex。注意这里的定义是真正的Shader内部的定义,属性的定义其实还是Unity层面的一个接口,我们用同名的方式来关联属性的值和内部的变量。

  在后面我们定义了一个结构体Input,同时可以看到这个结构体是给下面的surf函数用的。surf函数我们可以理解为一个回调函数,当然我们也可以定义为MySurf,只需要修改编译指令就可以啦。这个surf函数接受一个参数是我们定义的Input类型,另一个参数SurfaceOutput类型是Unity内置的,不过我们可以找到它。在Unity安装目录的Editor下找到DataCGIncludes,用任意文本编辑器打开Lighting.cginc,搜索SurfaceOutput就可以找到了,它包含这些信息:

  在surf函数中,我们用到了内置的tex2D方法,这个方法是从一张贴图中根据贴图坐标得到颜色等信息。这里我们用到了Input结构中的uv_MainTex,表示”_MainTex”的贴图坐标。text2D返回一个half4类型的值,表示贴图对应坐标的一点的颜色和Alpha值。之后就是给SurfaceOutput结构赋值了,实际上,surf方法主要的任务就是给SurfaceOutput结构赋值。

 FallBack语句

  这个就不要讲了吧,它真的只是个备(hǎo)胎(rén)而已。

Surface Shader渲染过程简介

  还记得吗?我们上文说过Shader君是个无所不能的有着高度自主权的家伙,那它自然不止上面说到的那点功能。回头看看上面的编译指令,我们只是指定了一个名叫surf的surface function和一个叫Lambert的光照模型。其实所谓的光照模型,也不过是个函数罢了,我们到Lighting.cginc中搜索Lambert就可以看到它的真容:

  这里需要注意一下,Lambert光照模型对应的函数名为LightingLambert,这是一个约定,所有的光照模型需要以“LightingMyLight“这样的形式命名。好吧,本着拿来主义,我们把这个模型拿到我们的代码中,此时我们的Shader应该是这样:

  回头看看我们的立方体,好像没什么变化,毕竟本质上还是同一个光照模型嘛。除了自定义surface函数和光照模型,其实我们还可以通过编译指令自定义vertex函数和finalcolor函数,vertex函数用于对模型的顶点信息进行修改,finalcolor函数对最后的像素颜色进行修改,一个完整的Surface Shader渲染过程大概是这样的:

  

  我们可以自定义一下这几个函数,得到一个完整的Shader:

  在MyVert中,我们修改了原来顶点的位置,在Unity中拖动Shader中的MoveAmount,立方体就会发生变化:

  

     

  MyFinalColor函数中,我们直接用光照模型输出的颜色信息作为最终的颜色信息,感兴趣的童鞋可以自行修改最终颜色试试。

结束语

  呼~终于写完啦!猫猫本意是把Surface Shader的基本内容完整的向大家介绍一下,结果越写越多,只好把一些细节的东西留着以后再说啦~希望大家看了之后能有所收获,咱们下回再见!

孙其功陪你学之——unity3d进程暂停 在做unity3d工程的时候,有时候需要让进程暂停一段时间。有人建议使用yieldreturnnewWaitForSeconds(value);用法如下:IEnumeratorWait(floatvalue)//等待的时间,单位秒{

Unity Spine 动画模糊问题解决办法 1、在项目开发中有时候我们会使用到美工给我们制作的Spine动画,在这里呢我就不先介绍如何使用Spine动画在unity,而是先写关于解决我在项目中遇到的

上一篇的加强版:NGUI通过XML布局 反正做都做了,再做一个用XML来布局并生成界面的运行前它是这个样子:运行TestXMLloadUI.cs脚本后,就生成了一个UI:其中,加载XML布局的代码如下:using

标签: 猫猫的娱乐

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

上一篇:FlappyBird后期完善(flappy bird攻略)

下一篇:javascript发送短信验证码实现代码(js发送请求的几种方式)

  • 价外税怎么理解
  • 赠送的代金券属于销售费用吗?
  • 转让旧固定资产可以开专票吗
  • 开淘宝店怎么做账
  • 商品进销差价在贷方代表什么
  • 支付残疾人保证金的账务处理
  • 政府单位临聘人员辞退
  • 当月发票作废需要收回么
  • 食堂买菜无发票可以在费用中开支吗
  • 折扣销售的增值税处理方式
  • 公司收到转账支票怎么盖章
  • 我国进口货物交税如何计算? 
  • 未开票收入怎么写分录
  • 税控信息表
  • 建筑劳务增值税
  • 物业管理费属于政府购买服务吗
  • 售楼部购买空调计入哪个科目
  • 当月税负率怎么算
  • 建筑服务一般纳税人预缴税率
  • 保险代理人佣金的规定
  • 加计扣除两种情况
  • 收到上级补助收入怎么记账
  • 贷款买电脑的故事
  • 基金赎回未到账可继续买吗?
  • 开票系统能导出几年前的
  • 将捐赠收入计入资本公积转增增值税
  • 费用开两次发票怎么入账?
  • 房地产公司未售房产出租账务处理
  • swupdtmr.exe - swupdtmr进程是什么意思 什么作用
  • 运杂费计入什么科目
  • mac安装双系统教程
  • 无法连接到移动网络小米
  • msmpeng.exe 是什么
  • 哪些收入不纳税
  • antd-vue-pro
  • 商业一般纳税人增值税税负率最低多少
  • vue引入svg图片
  • 补计提去年所得税费用会计分录
  • 财务会计制度或纳税人财务会计核算办法
  • 增值税专用发票丢了怎么补救
  • uniapp自定义tabbar功能
  • vue前端框架搭建
  • 史上无敌的超级兵王
  • 【深度学习】datasets.ImageFolder 使用方法
  • 朴素贝叶斯算法
  • 去年计提的费用所得税汇算清缴之前冲销就不调整吗
  • 金税盘开票系统复核人员设置在哪里
  • 进项税额转出可以为负数吗
  • phpcms使用教程
  • vue获取dom元素的方法
  • 简易征收销售额是什么意思
  • 开票资料更改
  • 城建税如何计提税金
  • 跨年度冲红字发票账务处理
  • 销售商品发生的运输费计入什么科目
  • 商业会计主要做什么
  • 用银行承兑汇票购买原材料会计分录
  • 包工包料成本比例
  • 本期摊余成本
  • Ubuntu 12.04/14.04 LTS版内核更新 修复七个重大安全漏洞
  • 笔记本出厂预装系统
  • RedHat Linux5.5下Oracle 11g安装图解教程
  • Red Hat Enterprise Linux 5.X的图形安装教程
  • Windows文件夹共享权限不足
  • win8桌面右键无法使用
  • win8怎么调整显示器亮度
  • css命名大全
  • 详解九章算法
  • AngularJs ng-change事件/指令的用法小结
  • jQuery Ajax请求后台数据并在前台接收
  • 同一内容复制到多个单元格
  • python干嘛用
  • JavaScript中Number.MIN_VALUE属性的使用示例
  • socket客户端发送数据
  • pycharm sftp
  • 简述javascript
  • 河南的省直
  • 怎么删除天眼查诉讼信息
  • 外经证开错了怎么办
  • 出口退税函调不予退税的后果
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设