文章著做权归做者全部。转载请联系做者,并在文中注明出处,给出原文连接。
本系列原更新于做者的github博客,这里给出连接。git
本系列仅用于记录并分享本身的学习过程,以及学习过程当中遇到的问题,若有错漏,欢迎讨论。(第0章是Shader系列的引导部分,已经有计算机图形学基本认识、游戏开发基础知识、Unity基础的能够选择性跳过。)github
从冯诺依曼到现代计算机,从简单的计算结果呈现到丰富多彩的视觉体验,计算机老是在带给咱们惊喜。而这一切,都离不开计算机图形学。算法
什么是计算机图形学?首先,随着硬件水平的发展,咱们已经可以支持的最小显示精度是 Pixel (像素),但仅仅只有精度还远远不够,咱们还须要配套的显示模式来发挥这一优点,因此,为了尽量好地呈现画面,计算机图形学应运而生。既然咱们已经知道了图像显示的最小单位,那么咱们要作的就是如何把想要呈现的图像绘制到屏幕的一个个像素点上,也就是栅格化图像。简单来讲,计算机图形学就是研究将图形转化为计算机显示器栅格形式的算法的科学。性能
游戏老是给咱们带来最直观的计算机视觉盛宴,而在这背后,计算机为咱们作了不少事情。假设如今咱们在玩一款第三人称RPG游戏,主角就站在咱们屏幕中间。对于这样一个简单的画面,在计算机内部是如何实现的呢?学习
首先,计算机的精度是有穷的,有穷意味着不连续,因此咱们只能以简单的、足够小的平面去近似获得曲面的效果,在计算机中,一般以三角面或者四边形为最小的面元。咱们以三角面为例,如今咱们已经有了一个三角面,但我不知道它在哪,这个时候,咱们须要一个三维坐标系来辅助定位这个面,有了坐标系,咱们就知道了这个三角形三个顶点的坐标,但仅仅知道顶点位置还不够。咱们还知道,物体是经过反射光来让咱们看到的,因此,咱们还须要一个光源,以及一个观测者(观测者即虚拟摄像机,呈如今屏幕前的图像就是他看到的)。如今已经有了观察者,被观察物体,还有光,是否是咱们就能够“看到”图像了呢?对于现实世界来讲,确实能够,但计算机不行,由于这些都是咱们的假设,计算机所能理解的只有计算。因此,咱们要“计算”出这个物体在哪,观察者才能看到。怎么计算呢?首先,虚拟摄像机会基于本身的“视角”在摄像机和物体之间铺上一张网格(由于计算机的图像是不连续的,因此不是铺上平面),视点和图像连线与网格的交点就是图像最终显示出来的样子,它对应着一个个的像素,这一个步骤,咱们便形象地称为栅格化。如今已经知道了三角形基于屏幕的相对位置信息,只要按屏幕比例缩放即可以呈现出图像了。但仅仅是这样还不够,每个步骤都必须等待上一步工做完成后才能够开始进行,这并不高效,为了解决这个问题,计算机渲染引入了流水线工做模式,在流水线上,每个阶段都有特定的程序和硬件去执行,最后把数据统一发送给下一阶段,这也就是咱们一般所说的 Render Pipeline (渲染流水线)。游戏
如今咱们知道了,屏幕画面其实就是顶点和片元的 Render (绘制,呈现,渲染)过程,这个过程本质上是一种信息转换。不能否认,视觉上的冲击是最直观的,在游戏上更是如此,这也是Arts drive us crazy的缘由。ip
游戏你们都不陌生,但游戏最重要的是什么?是最直接迅速的反馈,尤为是视觉反馈。这又更依赖于强大的渲染技术。但与通常的计算机图形绘制不一样,游戏渲染更注重效率。因为性能瓶颈,咱们永远也没法为玩家提供最优质的游戏体验,但咱们能够有侧重地进行计算,也就是让计算发生在最值得计算的地方,或者,使用更高效,但并不必定彻底正确的算法。可能你们会有疑惑,为何不正确的东西也能够被推崇呢?在图形学领域有一句名言: If it seems right, it is. (若是他看起来是对的,那他就是对的。)这实际上是在告诉咱们,没有绝对的正确的渲染,只有看上去正确的,即使有,但若是它的代价很大,咱们仍然会选择效率高的经验模型(如经典光照模型)去计算。这也是为何咱们偶尔会在一些游戏镜头中看到“穿帮”镜头,但这并不影响咱们的游戏体验。游戏开发
相信你们都是被游戏的精美画面或者独特玩法所吸引,进而热爱游戏,但愿接触游戏开发。若是是前者,那么能够更深刻地了解游戏美术行业,乐在其中。开发
这里给出一个书籍资料目录:get
《3D数学基础:图形与游戏开发》
《Unity Shader入门精要》
《Real-Time Rendering》
《GPU gems》
《Unity Shaders and Effects Cookbook》