自我介绍
广东双非一本的大三小白,计科专业,想在制作毕设前夯实基础,毕设做出一款属于自己的游戏!
目的
了解各类名词:
GPU
优点:
- 由于GPU具有高并行结构,所以GPU在处理图形数据和复杂算法方面拥有比CPU更高的效率。
- CPU大部分面积为控制器和寄存器,与之相比,GPU拥有更多的
ALU(Arithmetic Logic Unit
,逻辑运算单元)用于数据处理,这样的结构适合对密集型数据进行并行处理。 - GPU采用流式并行计算模式,可对每个数据进行独立的并行结算,即流内任意元素的计算不依赖于其它同类型数据
缺点:
- 由于“任意一个元素的计算不依赖于其它同类型数据”,导致“需要知道数据之间相关性”的算法,在GPU上难以得到实现,一个典型的例子是射线与物体的求交运算。GPU中的控制器少于CPU,致使控制能力有限。
三大shader编程语言
- 基于 OpenGL 的 OpenGL Shading Language,简称 GLSL;
- 基于 DirectX 的 High Level Shading Language, 简称 HLSL;
- 还有 NVIDIA 公司的 C for Graphic,简称 Cg 语言。
渲染流水线
- 应用阶段:输出渲染图元
- 几何阶段:输出屏幕空间的顶点信息
- 光栅化阶段:最终渲染出图像
CPU应用阶段
1. 把数据加载到显存中。
将渲染所需数据从硬盘加载到内存中,网格纹理等数据又被加载到显存中(一般加载到显存后内存中的数据就会被移除)
2. 设置渲染状态。
定义场景中的网格是怎么被渲染的。例如,使用哪个顶点着色器, 片原着色器,光源属性,材质等。
3. 调用Draw Call。
Draw Call 就是一个命令,它的发起方是Cpu,接收方是Gpu。这个命令仅仅会指向一个需要被渲染的图元列表,而不会包含任何材质信息。
GPU流水线
绿色代表完全可编程控制;黄色代表可配置但不可编程;蓝色代表Gpu固定实现。
逐片元操作
逐片元操作是OpenGL中的说法,在DX中这个阶段被称作输出合并阶段。
- 决定每个片元的可见性,涉及很多测试工作,例如深度测试,模板测试。
- 如果一个片元通过了所有测试后,就需要把这个片元的颜色值和已经储存在颜色缓冲区的色彩进行合并,或者说混合。
模板测试
- 模板测试,与之相关的是模板缓冲(Stencil Buffer)。
- 模板缓冲和颜色缓冲,深度缓冲几乎是一类东西。
- 如果开启了模板测试,Gpu首先读取(使用读取掩码)模板缓冲区中该片元位置的模板值,然后将该值和读取(使用读取掩码)到的参考值进行比较,这个比较函数可以由开发者指定的,例如小于等于舍弃该片元,或者大于等于舍弃该片元。
- 如果这个片元没有通过测试,该片元就会被舍弃。不管一个片元有没有通过模板测试,我们都可以根据模板测试和之后的深度测试结果来修改模板缓冲区,这个操作也是由开发者指定的。
- 模板测试通常用于限制渲染区域,或者渲染阴影,轮廓渲染等。
深度测试
- 如果开启了深度测试,Gpu会把该片元的深度值和已经存在于深度缓冲中的深度值进行比较。这个比较函数也是可由开发者设置的,例如小于时舍弃该片元,或者大于时舍弃该片元。通常这个比较函数是小于等于,即如果这个片元的深度大于等于当前深度缓冲区中的值,那么就舍弃它。
- 这是因为我们总想只显示出离摄像机最近的物体,而那些被其他物体遮挡的就不需要出现在屏幕上。
- 和模板测试不同的是,如果一个片元没有通过深度测试,它就没有权利更改深度缓冲区的值。如果一个片元通过了测试,那么开发者可以指定是否要用这个片元的深度值覆盖所有的深度值。
合并混合
- 合并,渲染过程是一个物体接着一个物体画到屏幕上,而每个像素的颜色信息被储存在一个名为颜色缓冲的地方。因此,当我们执行这次渲染时,颜色缓冲中往往已经有了上次渲染之后的颜色结果,那么,我们使用这次渲染得到的颜色完全覆盖掉之前的结果还是进行其他处理,就是合并需要解决的。
- 对于不透明物体,开发者可以关闭混合(Blend)操作。这样片元着色器计算得到的颜色值就会之间覆盖掉颜色缓冲区中的像素值。
- 但对于半透明物体,就需要混合操作来让这个物体看起来是透明的。
CPU与GPU如何并行工作?
- 我们之前看到的是一个流水线式的模式,如果需要CPU和GPU并行工作,就需要使用命令缓冲区(Command Buffer)。
- 命令缓冲区包含了一个缓冲队列,由Cpu向其中添加命令,而由Gpu从中读取命令,添加和读取过程是相互独立的。
- 命令缓冲区使得Cpu和Gpu可以相互独立工作。当Gpu需要渲染一些对象时,它就可以从命令队列中取出一个命令并执行。
- 命令缓冲区有很多种类,Draw Call 就是一种。其他命令还有改变渲染状态等。
UnityShader
- Unity Shader实际上指的就是一个ShaderLab文件。以.shader作为后缀的一种文件。在Unity shader里面,我们可以做的事情远多于一个传统意义上的Shader。
- 在传统的shader中,我们仅可以编写特定类型的Shader,例如顶点着色器,片元着色器等。在Unity Shader中,我们可以在同一个文件里面同时包含需要的顶点着色器和片元着色器代码。
- 在传统shader中,我们无法设置一些渲染设置,例如是否开启混合,深度测试等,这些是开发者在另外的代码中自行设置的。而Unity shader中,我们通过一行特定的指令就可以完成这些设置。
- 在传统shader中,我们需要编写冗长的代码设置着色器的输入和输出,要小心的处理这些输入输出的位置对应关系等。而在Unity shader中,我们只需要在特定语句块中声明一些属性,就可以依靠材质来方便的改变这些属性。而对于模型自带的数据(如顶点,纹理坐标,法线等),Unity Shader也提供了直接访问的方法,不需要开发者自行编码来传给着色器。