unityshader⼊门精要_零基础⼊门UnityShader(⼀)
前⾔
Shader,中⽂名为着⾊器,对很多开发者来说它是⼀个神秘的存在,想学但是⼜不知道如何去学,或者学了⼀段时间发现Get不到它的点,始终感觉游离在外,⽆法开窍。
那么本专栏(Unity技术美术)在前⼏篇介绍了美术资源标准后,打算接下来花⼀些篇章来讲下如何从零基础⼊门Shader,⽬的在于让初学Shader的程序或者美术可以快速进⼊这个丰富多彩的世界。
什么是Shader
虽然上⾯有简单的说了下Shader就是着⾊器,但是还是有必要详细说明⼀下具体什么是Shader。
Shader其实就是专门⽤来渲染图形的⼀种技术,通过shader,我们可以⾃定义显卡渲染画⾯的算法,使画⾯达到我们想要的效果。⼩到每⼀个像素点,⼤到整个屏幕,⽐如下⾯这两个游戏内⽐较常见的效果。
Shader分为两类 :
1. 顶点Shader(3D图形都是由⼀个个三⾓⾯⽚组成的,顶点Shader就是计算每个三⾓⾯⽚上的顶点,并为最终像素渲染做准备)。
2. 像素Shader,顾名思义,就是以像素为单位,计算光照、颜⾊的⼀系列算法。 ⼏个不同的图形API都有各⾃的Shader语⾔,在
DirectX中,顶点shader叫做 Vertex Shader ,像素Shader叫做 Pixel Shader; 在OpenGL中,顶点Shader也叫做 Vertex Shader ,但像素Shader叫做 Fragment Shader,也就是我们常说的⽚断Shader或者⽚元Shader。
说⽩了,Shader其实就是⼀段代码,这段代码的作⽤是告诉GPU具体怎样去绘制模型的每⼀个顶点的颜⾊以及最终每⼀个像素点的颜⾊。Shader编程语⾔
既然Shader是⼀段代码,那必然要⽤⼀种语⾔来书写它,⽬前主流的有三种语⾔:
1. 基于OpenGL的OpenGL Shading Language,简称GLSL。
2. 基于DirectX的High Level Shading Language,简称HLSL。
3. 还有NVIDIA公司的C for Graphic,简称Cg语⾔。
GLSL与HLSL分别是基于OpenGL和Direct3D的接⼝,两者不能混⽤。⽽Cg语⾔是⽤于图形的C语⾔,这其实说明了当时设计⼈员的⼀个让基于图形硬件的编程变得和C语⾔编程⼀样⽅便,⾃由。正如C++和 Java的语法是基于C的,Cg语⾔本⾝也是基于C语⾔初衷,就是让基于图形硬件的编程变得和C语⾔编程⼀样⽅便,⾃由
的。如果您使⽤过C、C++、Java其中任意⼀个,那么Cg的语法也是⽐较容易掌握的。Cg语⾔极⼒保留了C语⾔的⼤部分语义,⼒图让开发⼈员从硬件细节中解脱出来,Cg同时拥有⾼级语⾔的好处,如代码的易重⽤性,可读性⾼等。
Cg语⾔是Microsoft和NVIDIA相互协作在标准硬件光照语⾔的语法和语义上达成了⼀致,所以,HLSL和Cg其实是同⼀种语⾔。
美术⼈员看到这⾥时也不⽤害怕,语法上并不难,⽽且在后续的章节中碰到相关的语法时我们会详细的进⾏说明。
什么是Unity Shader
显卡有NVIDIA、ATI、Intel等等。。。
图形API有OpenGL、DirectX、OpenglES、Vulkan、Metal等等。。。
Shader编程语⾔有GLSL、HLSL、Cg等等。。。
是不是有点头晕,该怎么去选择呢?在Unity中我们⼜应该如何做呢?
其实在Unity中反⽽⼀切变的简单起来了,我们只需关⼼如何去这实现我们想要的效果就好了,其余的事情全部交给Unity来⾃动处理。因为我们在Unity中编写的Shader最终会根据不同的平台来编绎成不同的着⾊器语⾔,那么我们在Unity中应该⽤什么语⾔来书写Shader呢?官⽅的建议是⽤Cg/HLSL来编写,当然你也可以使⽤GLSL,主要是因为Cg/HLSL有更好的跨平台性,更倾向于使⽤Cg/HLSL来编写Shader程序。
java零基础该怎么学
Unity Shader严格来说并不是传统上的Shader,⽽是Unity⾃⾝封装后的⼀种便于书写的Shader,⼜称为ShaderLab。
在Unity中有3种Shader(其实就是三种不同的写法):
Surface Shaders 表⾯着⾊器
Vertex/Fragment Shaders 顶点/⽚断着⾊器
Fixed Function Shaders 固定管线着⾊器
其中Fixed Function Shaders已经被淘汰,完全没有学习的必要了。
Surface Shader其实就是Unity对Vertex/Fragment Shader的⼜⼀层包装,以使Shader的制作⽅式更符合⼈类的思维模式,同时可以以极少的代码来完成不同的光照模型与不同平台下需要考虑的事情。
但是Surface Shader也有它的局限性,就是Vertex/Fragment Shader能实现的效果,Surface Shader不⼀定能实现,反过来则成
⽴,Surface Shader能实现的Vertex/Fragment Shader则⼀定可以实现。
并且在Unity2018后的版本中推出了Unity官⽅⾃⼰的可视化Shader⼯具(Shader Graph)。从⽣成的代码上来看,也全部是⽤的Vertex/Fragment Shader,那是不是可以理解为在今后的可编程渲染管线中,Unity⾃⼰也抛弃了Surface Shader,⽽全部采⽤了Vertex/Fragment Shader?
总之,在今后的学习过程中,也会涉及⼀些Surface Shader的内容,但主要还是会以Vertex/Fragment为主。
另外,学会Shader也会给我们带来很多的好处:
1. 游戏中模型显⽰粉⾊的情况你⼀定碰到过吧,是Shader丢失呢,还是Shader不符合当前平台呢,⼜或者是Shader上有语法的错误
呢?如果我们有了解并学会Shader的话,这些问题就不会再是⼀脸懵逼啦。
2. 內建Unity Shader仅仅只是“通⽤”⽤例,不⾜以满⾜我们所有的画⾯表现需求。
3. ⼀旦掌握Shader,可以为游戏/应⽤创造独⼀⽆⼆的视觉享受。根据实际需求,为游戏和应⽤实现特定功能的Shader。
4. 能⼤⼤的帮助我们做渲染上的性能优化,因为通过Shader可以控制渲染什么以及如何渲染。
5. 撰写Shader的能⼒对于游戏团队⾮常重要,掌握Shader技能的开发⼀直是炙⼿可热的职位。现在⼀个不争的事实就是,技术美术永
远是各⼤⼚商的稀缺资源。
好处多多,⼤家快快学习起来吧~
最后
Unity技术美术 ( ID:gh_8b69cca044dc )
欢迎⼤家关注更多⼲货的:Unity技术美术 ( ID:gh_8b69cca044dc )
19470667(1已满)、763506271
Unity技术美术QQ交流分享:19470667(1已满)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。