Notifications
Article
关于Unity Shader的学习笔记(一)
Published 25 days ago
333
1
Aim: 自己手写一个基本shader,包含颜色高光等等;
最近因为闲在家里,所以就有时间倒腾自己喜欢的东西。其实一直很想研究下怎么在Unity里实现卡通效果,水墨晕染效果等等,奈何本人的图形学知识一点没有,只有网上各种找视频文章看,算是偷师学艺吧。想要实现前面说的那些效果必须得对Unity的shader有一定了解,至少也得有基础,不然从网上断章取义了一些效果,后续在用的过程中出了问题想要调整又不知如何下手说明知识还是没学扎实。所以在学习过程中把学习的成果一点点总结起来就成为了本文及后续的初衷,把学到的知识归纳总结变成文章有助于对所学知识的掌握。
通过对网上资料的总结知道:
  1. CPU编程和GPU编程是不同的两种东西,不能混到一起,shader是运行在GPU上的程序。
  2. 目前主流针对GPU编程的技术有:
  • HLSL:微软研发,只能供Direct3D使用
  • GLSL:是用来在OpenGL中编程的着色器语言
  • CG:NVIDIA和微软合作开发,独立于三维编程接口,不依赖于D3D和OpenGL,可以和这两种图形渲染库结合起来使用
3. Unity中的着色器可以分为三类:
  • 固定管线着色器:为了兼容老一代GPU而设计,最早的图形学版本都是基于这个着色器来编写
  • 顶点片元着色器:比固定管线着色器要新,功能强大,可编程,缺点不支持光照
  • 表面着色器:Unity官方极力推荐的着色器,可编程,支持光照,自定义光照模型,自由度高。
4.Unity shader编程语言ShaderLab基本语法结构:
  • Shader"name"{
  • [Properties]//属性
  • Subshaders{......}//子着色器
  • [Fallback]//降级着色器
  • }
之后根据已知的知识点先写一个Shader的模板出来。打开Unity,我目前使用的Unity版本是2018.4.13c1,不同版本可能会有所区别,在Assets下或其子目录文件夹下鼠标右击->Creat->Shader->Standard Surface Shader,创建一个标准Shader,双击默认VisualStudio打开,清空里面的代码,之后按照ShaderLab的基本语法结构把Shader的结构框架写出来,如下图:
下一步是往属性块中填写内容,Properties块代表的是着色器中使用到的所有属性,可以在属性块中定义一些属性参数,这些参数可以在Inspector中进行编辑和调整,Properties的示例语法是:属性名("Inspector显示的名字",数据类型)=初始值,其中属性类型有Range(min,max)、Float、Int、Color(num,num,num,num)、Vector(num,num,num,num)、2D、3D等,具体等写到时详细补充。参照Unity的基本Shader填写Properties块,如下图:
填写完Properties块后就要开始写SubShader块了,真正用于呈现渲染物体的代码都放在SubShader块,其主要由可选标签,通用状态以及一个通道列表构成。每个Shader都包含一个SubShader列表,游戏运行时会根据实际的运行环境从上到下选择一个合适的SubShader来使用。SubShader语法结构:SubShader{[Tags][CommonState]Pass{}}(重要的代码和核心渲染逻辑基本都在Pass块中,一个SubShader可以包含多个Pass块,Pass的语法:Pass{[Name and Tags][RenderSetup][TextureSetup]},其中RenderSetup可以设置显卡的各种状态,例如:Lighting(光照,开启或者关闭对应On和Off)、Material{材质块}、SeparateSpecular(开启或者关闭顶点光照相关的镜面高光颜色,允许高光有不同的颜色)...)。接着填写SubShader块,代码如下:
写到这里这个基本Shader已经快完成了,最后是使用降级着色器Fallback,作用是当编写的Shader无法完成渲染任务时备选的渲染方案,以防渲染程序报错崩溃,代码如下:
到此,一个基本的Shader已经编写完成,如果有报错,对一下代码,最后可以拿来实验了,在场景里建一个3D物体,我这里建立了一个圆柱体,随便给了一个材质,之后在物体材质Shader选项里选择刚才编辑的Shader,图片如下:
选择刚编辑的Shader后场景中的圆柱体就发生了变化,可以调节颜色参数改变圆柱体的固有色,高光颜色等等,因为编辑的Shader没有法线属性,所以相对于之前的圆柱体表面比较平,先一步步来,至此,一个简单的Shader就完成了,整体下来感觉似乎对Unity的Shader有了一点点了解,写Shader较写平常的逻辑程序更加难一些,第一没提示,第二编写比较灵活反而不容易记忆,虽然现在出了很多Shader工具,操作起来比较直观,只顾看效果就行,比如ASE,Shader Graph,但我觉得还是得对原理有所理解才能做出更加满意的Shader.
下面是Standard Shader和自己编写的Shader效果图:
月三更
Programmer
5
Comments
l
line
23 days ago
6666
0