跳转到主要内容

Shader

Unity Shader阴影

表面遮挡住光源路径就会产生阴影,由理想点光源产生的阴影边缘是比较锐利的,而现实世界中的阴影边缘确是模糊的,该模糊部分成为半影。半影的出现,是由于现实世界的点光源不是空间意义上的一个点,它会覆盖一定的面积,就会产生以不同角度掠过物体边缘的光线。

unity shader光照模型与光照贴图

我们必须要明白我们是如何看到一个物体的,我们在现实生活中看到某一物体的颜色并不是这个物体真正拥有的颜色,而是它所反射的(Reflected)颜色。换句话说,那些不能被物体所吸收(Absorb)的颜色(被拒绝的颜色)就是我们能够感知到的物体的颜色,所以最终的颜色要由光源的颜色以及物体的颜色来共同决定。

Unity Shader 常见光照模型

Unity 表面着色器为开发者提供了一层简单快速的编写 Shader 的方式,对开发者来说隐藏了光照模型这些复杂的的概念,但是有时候 Unity 自带的光照模型往往不能满足我们的需求,而需要自己定义光照模型。所以接下来就一起看看 Unity 中常见的光照模型函数。

瞎聊 Unity Shader 系列:深度缓存

Frame Buffer 是用来存储帧位图的数据存储区域。这里在介绍另外一个缓存,叫深度缓存 (Depth Buffer), 也叫作 Z-Buffer。从名字上来看这是一个存储深度(数据)的存储区。深度是什么?要描述一个物体的位置,需要借助参照物。我们这里扩展一下, 要用数值来表述一个物体的某种属性,要有这个数值参照的原点。既然深度值是数值,那它的参照原点是什么呢?

Unity中的Shader及其基本框架

<font size="3"><strong> shader和Material的基本关系</strong></font>

Shader(着色器)实际上就是一小段程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出。绘图单元可以依据这个输出来将图像绘制到屏幕上。输入的贴图或者颜色等,加上对应的Shader,以及对Shader的特定的参数设置,将这些内容(Shader及输入参数)打包存储在一起,得到的就是一个Material(材质)。之后,我们便可以将材质赋予合适的renderer(渲染器)来进行渲染(输出)了。

所以说Shader并没有什么特别神奇的,它只是一段规定好输入(颜色,贴图等)和输出(渲染器能够读懂的点和颜色的对应关系)的程序。而Shader开发者要做的就是根据输入,进行计算变换,产生输出而已。

<font size="3"><strong>Unity中Shader的三种基本类型</strong></font>

按照渲染管线的分类,可以把Sharder分成3个类别:

OpenGL-渲染管线的流程(有图有真相)

学习shader之前必须知道的事情:shader(着色语言)到底发生在那个阶段?OpenGL的渲染管线有哪些阶段?这对开发人员来说很重要,也许你刚刚接触,或者你在使用已有的产品,很优秀的游戏引擎,或者渲染引擎,你觉得知道这个没有太大意义,但知道了这些,总归对你没有坏处。

下图是一个非常简化框图流水线的各个阶段,并在他们之间传播的数据。虽然极其简单,它是足够的着色器编程,提出了一些重要的概念。固定管线中存在很多阶段,并存在很多细节,这里只是粗略的介绍。
<center><img src="http://imgtec.eetrend.com/sites/imgtec.eetrend.com/files/201901/blog/19…; alt=""></center>

(1)顶点变换: