2.3 GPU流水线
图元:由三个顶点组成的三角网格
2.3.2 顶点着色器 Vertex Shader
顶点着色器是GPU流水线的第一个阶段,输入来自CPU。处理单位为顶点,每个顶点都会调用一次顶点着色器。
主要工作:顶点的坐标变换与逐顶点光照
2.3.3 裁剪
裁剪即为去除摄像机视野范围外的物体,只对视野范围内的物体进行处理。
完全在视野范围外的图元会被忽略,完全在视野范围内的会保留,而部分在视野内的会进行裁剪得到新的顶点。
该阶段是不可编程的
2.3.4 屏幕映射
每个图元在三维坐标系内的坐标会由屏幕映射后按照屏幕的比例计算得到在屏幕上具体显示的坐标
OpenGL的屏幕坐标系原点在左下角,而DirectX在屏幕左上角
2.3.5 三角形设置
光栅化的第一个阶段,即根据顶点坐标信息计算得到其三条边的表示方式
2.3.6 三角形遍历
光栅化的第二个阶段,根据三角形设置得到的边的表示方式来计算得到该三角形网格所覆盖的所有像素,每个被覆盖的像素都会产生一个片元(fragment)。
片元是一个用于生成像素的数据包,包含了颜色,深度,纹理等信息。
2.3.7 片元着色器
输入为上一个阶段得到的顶点信息的插值,输出为一个或者多个颜色值。
输出的为数据,而不会真正对当前显示的像素产生影响。
2.3.8 逐片元操作
此阶段为GPU流水线最后一个阶段,是高度可配置的
这一阶段即为输出合并阶段,通过所有测试工作的片元会与当前颜色缓冲区内储存的颜色进行混合
2.4
2.4.1 DirectX&OpenGL
DX与OGL为显卡驱动与CPU之间的中间接口层,为将用户的代码指令传递给显卡驱动进行翻译的中间层
显卡驱动(Graphics Driver):将OGL或DX的函数调用翻译成GPU能够执行的指令
显存(Vedio Random Access Memory/VRAM):显卡的内存
2.4.2 着色语言GLSL/HLSL/CG
控制着色器语言的语言为着色语言(Shading Language)
GLSL:OpenGL提供的语言,编写后的代码无需再进行一次编译,直接交由显卡驱动翻译,是依赖硬件的语言。优点是跨平台性好,缺点是不同的硬件可能最后的到的编译结果不经相同。
HLSL(High Level SL):由微软进行编译,但支持的平台有限,几乎为微软的平台
CG(C for Graphic):由英伟达提供编译,是真正的跨平台语言,且对于HLSL有很好的移值性。
Unity Shader语言选择:Unity Shader的语言与上述三者的语言很类似,但并非完全相容。
2.4.3 Draw Call
什么是Draw Call:DC即指CPU调用图形渲染接口这个动作
CPU与GPU之间的并行工作:在CPU与GPU之间还有一个命令缓冲区,是CPU向GPU传输指令的队列。CPU在计算出Draw Call或者改变渲染状态的指令后,将其加入到命令缓冲区中,而GPU在命令缓冲区中不断取出指令然后进行渲染。
批处理(Batching):
为什么会有批处理:当有大量的单次Draw Call需要CPU计算时,会导致CPU过载而效率低下,而GPU对DC的执行效率是很高的,就会导致GPU会出现大量的空闲状态而导致渲染阻塞。所以需要对大量的DC进行批处理
定义:批处理即为将很多的小DC合并为一个大的DC进行计算并提交来提高效率
适用:批处理更适用于静态物体,例如不会移动的大地与石头等等,因为其为静态的所以只需要合并一次处理即可。
减少Draw Call开销:(1)避免使用大量很小的网格。当不可避免地需要使用很小的网格结构时,考虑是否可以合并它们。(2)避免使用过多的材质。尽量在不同的网格之间共用同一个材质。
2.5 何为Shader
GPU流水线上一些可高度编程的阶段,而由着色器编译出来的最终代码是会在GPU上运行的;
有一些特定类型的着色器,如顶点着色器、片元着色器等;
依靠着色器我们可以控制流水线中的渲染细节,例如用顶点着色器来进行顶点变换以及传递数据,用片元着色器来进行逐像素的渲染。