RecursiveFrog 发表于 2023-2-9 17:55

【Shader开发实战】(一)前言,初始游戏图形

系列文章前言

背景:作为一名游戏开发人员, 相信一个游戏团队大部分人都是普通的应用编程,是指挥CPU工作的。目前国内游戏行业,大厂已经入局,游戏产品逐渐精细化,如果产品在渲染上没什么亮点,就很难有竞争力。但是提到渲染,就必然要指挥GPU进行工作,所以团队中就需要有专人负责渲染问题。最基本的特殊效果,如碧波荡漾效果、布料烧毁时的溶解效果、技能释放时的气浪等。虽然Unity这样的引擎有很名资源可用,但有的效果还是需要自己来实现。所以决定开始学习相关的知识, 将学习过程中一些思考和总结写成文字进行记录,决定将这些零散的内容整理成文,并集合成系列,将他们系统地记录下来,也希望能对热爱编程的各位有所帮助。
这些文章的原型是学习过程的读书笔记,对本书核心内容的演绎,解刨,精炼与解读,希望自己的这些文章,意在精确的传达作者含义的同时,用更通俗的语言给到各位有所帮助。也正如文章开头所说的,第一次在知乎写专栏,新的开始,希望各位多多指教。有理解不到位地方,还请各路大神多多指点
<hr/>

第一本书【Shader开发实战】

《Shader开发实战》本书深入浅出地介绍了完成一个常见游戏需要的所有着色器技术,并通过实际的代码示例,让读者及时获得反馈,理解了原理后就能灵活运用所学技术创建自己独一无二的渲染效果。作者不拘泥于同类技术书籍的写法,舍弃入门阶段不需要知道的大量枯燥难懂的理论和公式,对初学和进阶开发人员非常友好。例如,在介绍向量运算时,没有搬出数学课本上复杂的点乘、叉乘和除法的定义,而是介绍了向量在图形学中颜色计算的使用方式,简单易懂。浮点数的细节常常能把人转晕,在调试和优化着色器介绍浮点数时,作者也不是采用经典方法,顺着作者的思路能很轻松地理解浮点数引起的精度问题。
先放出这篇文章所涉及内容知识点的一张思维导图,就开始正文。


1.渲染

渲染用一句话说就是“用一组网格数据+颜色数据+场景其他信息(灯光等)创建图像的过程”。渲染创建的图形可以称为渲染帧,用户每秒钟所能看到的渲染帧越多,画面就越流畅,体验就会更好。通常大多数游戏需要达到的基本要求就是每秒30~60帧。游戏代码中,用来负责渲染这部分的代码就可以被称为渲染引擎,例如Unity、Unreal、Godot、Cocos 等等。
2.网格

“一组点、边、面的集合”,点可以连接成边,边可以组成面,面添加颜色看起来就是三维实体。其中网格的面可以是任意的二维形状,但是为了追求速度和简单性,许多游戏引擎都要求对网格进行三角形剖分(只剩下三角形)。顶点有一项重要的属性“顺序”,顺序用于定义面的哪一侧被当成二维形状的“正面”。为什么要区分“正面”和“背面”,是因为通常背面是看不到的,所以需要进行背面剔除的优化,只是可能在部分特殊的复杂场景不需要剔除。(顶点是用向量来定义的)


3.向量

大家都应该在数学课上学习了向量“向量是一个既有方向又有大小的量”。通常,我们在表示一个坐标系上的点的时候,使用 (x, y) 、(x, y, z) 这样的写法,那么这种写法用来表示向量的时候,每个数字都可以被称为向量的分量,有几个数字就有几个分量,就可以说向量是几维向量(在图形中常见的是四维向量 x,y,z,w 向量也常常写为vec3, vec4)。还有一种特殊的向量称为“单位向量”,是一个大小为1的向量,单位向量乘以任意一个数,最终得到的向量长度就是乘以的那个数。
4.计算机图形学中的颜色
说到颜色,最基础的“光学三原色”(RGB):红、绿、蓝。光学三原色混合后,组成显示屏显示颜色,三原色同时相加为白色,白色属于无色系(黑白灰)中的一种。在程序中,颜色通常被表示为 RGB(255, 0, 0)、RGBA(0.6,0.6,0.6,1.0)、十六进制(#FF0000)。在着色器中,通常使用4分向量(vec4)来储存颜色数据。
5.渲染管线



渲染管线的简化试图

顶点着色器:处理单位是顶点,即对于输入的每个顶点都会调用一次顶点着色器。主要功能将输入的顶点坐标变换到屏幕上应该出现的位置。
形状装配:负责连接刚被处理完成之后的所有顶点数据。
光栅化:GPU计算出装配出来的三角形网格占据了屏幕的哪些像素,并且生成相应的片元。
片元着色器:给所有片元填充颜色。
片元处理:片元测试,通过的片元才能被输出显示。混合,用于渲染透明度效果时,进行颜色混合功能。
这些步骤只是渲染管线的一个简化流程图,实际上还有其他许多复杂步骤和操作,这里不过多的讨论6.着色器
在GPU上执行的一段代码,核心能力就是允许我们控制管线的关键部分,创建符合我们要求的游戏和应用程序渲染效果。
页: [1]
查看完整版本: 【Shader开发实战】(一)前言,初始游戏图形