Shader之小白入门学习一

前言

Shader,中文名为着色器,对很多开发者来说它是一个神秘的存在,就如我一样想学但是又不知道如何去学,或者学了一段时间发现Get不到它的点,是种感觉游离在外,无法开窍,学完之后过一阵就依旧是一脸懵逼。从本章开始打算一步步学习并熟练运用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得Higj Level Shading Language,简称HLSL;
  3. NAVIDIA公司的C for Graphic,简称Cg语言。

GLSL与HLSL分别是基于OpenGL和DirectD的接口,两者不能混用。而Cg语言是用于图形的C语言,这也说明了当时设计人员的一个初衷,**就是让基于图形硬件的编程变得和C语言编程一样方便,自由。**正如C,C++,Java的语法是基于C的,Cg语言本身也是基于C语言的。如果熟练掌握C,C++,Java中任意一个,那么Cg的语法也是比较容易掌握的。Cg语言极力保留了C语言的大部分语义,力图让开发人员从硬件细节中解脱出来,Cg同时拥有高级语言的好处,如代码的易重用性,可读性高等优点。
Cg语言的Microsoft和NVIDIA相互协作在标准硬件光照语言的语法和语义上达成了一致,所以,HLSL和Cg其实是同一种语言。

什么是Unity Shader

我们知道显卡有NVIDIA,ATI,Intel等
图形API有OpenGL,DirectX,OpenglIES,Vulkan,Metal等
Shader编程语言有GLSL,HLSL,Cg等

虽然看着有点多,但这一切在Unity中反而变得简单了,我们只需要如何去实现我们想要的效果就好了,其余的事情全部交给Unity来自动处理。因为我们在Unity中编写的Shader最终会根据不用的平台来编译成不同的着色器语言,那么我们在Unity中应该使用什么语言来书写Shader呢?

Unity官方的建议是用Cg/HLSL来编写,当然也可以使用GLSL,主要是因为Cg/HLSL有更好的跨平台性,更倾向于使用Cg/HLSL来编写Shader程序。
Unity Shader严格来说并不是传统上的Shader,而是Unity自身封装后的一种便于书写的Shader,又称ShaderLab。
Unity中的3种Shader(其实就是三种不同的写法)

  1. Surface Shaders 表面着色器
  2. Vertex/Fragment Shaders 顶点/片段着色器
  3. Fixed Function Shaders 固定管线着色器

其中Fixed Function Shader已经被淘汰,如果有兴趣也可以了解下。
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?

总之,在今后的学习过程中,主要还是以Vertex/Fragment为主。Shader的学习也会给我们带来很多的好处:

  1. 在游戏开发过程中会遇到模型边粉色的情况,原因可能是Shader丢失,Shader不符和当前平台,又或者是Shader代码有语法错误等。如果了解并学会Shader之后这些问题也就不会再困扰自身了。
  2. 内建Unity Shader仅仅只是“通用”用例,还不自满足我们所有的画面表现需求。
  3. 当我们掌握了Shader后,可以为游戏/应用床罩独一无二的视觉享受。可根据实际需求,为游戏和应用实现特定功能的Shader。
  4. 能大大的帮助我们做渲染上的性能优化,因为通过Shader可以控制渲染对象以及渲染效果
  5. 撰写Shader的能力对整个游戏团队非常重要,掌握Shader技能的开发一直是炙手可热的职。现在一个不争的事实就是,技术美术永远是各大厂商的稀缺资源。

所谓技多不压身 ,让我们一起加油吧!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值