目录
一、书籍分类和全书重点(尽量简化)
1.书籍分类
2.全书重点
二、第二章 渲染流水线
1.本章重点(尽量简化)
2.章节联系
2.1 二之一
2.2 二之三
2.3 二之四
三、本章详解
1 综述
1.1 应用阶段
1.2 几何阶段
1.3 光栅化阶段
2 CPU和GPU之间的通信
3 GPU流水线
四、问题
1.什么是OpenGL和DirectX?
2. 什么是HLSL、GLSL、CG?
3. 什么是 Draw Call,为什么 Draw Call多了会影响帧率?
4. 如何减少 Draw Call?
五、思维导图
实用文,学习Unity Shader基础。
从基础开始,逐渐了解并掌握如何编写Unity Shader。并且建立对渲染流程的基本认识,学习Unity 中的一些渲染机制以及如何使用 Unity Shader实现各种自定义的渲染效果。
第二章讲授GPU怎么渲染流水线的。
第一章就是聊聊天,介绍了一下书籍结构。
第三章讲的是Unity Shader实现原理和基本语法。
第四章讲的是学籍Shader所需的数学基础。
Shader是着色器,与之关系非常紧密的是渲染流水线。
流水线就是将需求分步骤进行,然后间距一个或多个步骤进行操作,让每一步间隔开来,每一个时间同时做多个步骤,会让速度大幅度提升。
渲染流水线的工作目的:由一个三维场景出发、生成(渲染)一张二维图像到屏幕上。
渲染流程分为三个阶段:应用阶段-几何阶段-光栅化阶段。
CPU负责,主要任务:准备好场景数据,例如摄像机位置,场景包含那些模型等;粗粒度剔除(culling)工作,将不可见的物体剔除除去;设置好每个模型的渲染状态,例如使用的纹理,材质等;输出的是渲染图元,渲染所需的几何信息。
GPU上运行,主要任务:对每一个渲染图元进行逐顶点、逐多边形的操作;将顶点坐标变换到屏幕空间;输出的是屏幕空间的而为顶点坐标、深度值等。
GPU上运行,主要任务:将上一个阶段传递过来的数据产生屏幕上的图像,渲染出最终图像。
渲染流水线的起点是CPU,就是应用阶段。分为三个阶段:将数据加载到显存中;设置渲染状态;调用Draw Call。
把数据加载到显存中:所有渲染所需的数据都需要从硬盘加载到系统内存中,然后网格和纹理等数据加载到显卡上的存储空间——显存(感觉像显卡的Cache)。
设置渲染状态:渲染状态就是定义场景中网格是怎么样被渲染的。例如顶点着色器(Vertex Shader)/片元着色器(Fragment Shader)、光源属性、材质等。
调用Draw Call:CPU发起到GPU接收,命令指向需要被渲染的图元(primitives)列表,之后就让GPU渲染这些图元。
渲染流水线
顶点着色器:逐顶点光照和坐标变换(转换为齐次裁剪坐标系)。输出后续所需的数据。
裁剪:不在摄像机视野范围内的不需要被处理。
屏幕映射:把每个图元的x和y坐标转换到屏幕坐标系。就是在1*1的坐标系的点变换为你屏幕的1920*1080的点上。
三角形设置:计算每个图元覆盖了那些像素,以及计算其颜色。
三角形遍历:检查每一个像素是否被三角形所覆盖(覆盖的就是片元)。找到这些片元。并且使用这三个顶点信息对覆盖区域进行插值(深度)。输出带有数据的片元序列。
三角形遍历
片元着色器:根据上一阶段的插值结果,输出片元的颜色。
片元着色器
逐片元操作:决定每片片元的可见性(深度、模板测试等),通过测试后就和已经存储在颜色缓冲区的颜色进行合并(屏幕不是突然就变颜色的,会有个缓冲,就是颜色合并;缓冲区就是计算机提前计算好下一帧的显示画面在缓存区里,就可以直接替换屏幕画面)。
OpenGL和DirectX是图像编程接口,是各种寄存器、显存等硬件的一层抽象。就是让我们编程能让计算机听懂并执行的桥梁。
CPU、OpenGL/DirectX、显卡驱动和GPU之间的关系
着色器语言。HLSL是DirectX的、GLSL是OpenGL的、NVIDIA是CG。这些语言会编译成中间语言IL,之后交给显卡驱动翻译成机器语言(有点类似CLR)。
Draw Call就是CPU调用图形编程接口,叫显卡干活了。CPU到GPU整了个命令缓冲器,为了让GPU渲染之后干下一个活(没干完活你就叫他渲染其他的,就会发生有部分渲染不到的屏幕),CPU添加命令,GPU读取,两者不冲突。
命令缓冲区
GPU一般渲染速度会大于CPU提交命令的速度,如果一个个提交DrawCall的话,GPU就会渲染一下,然后就睡觉等你继续提交。为了不让GPU睡觉,就让CPU一次提交批处理过的Draw Call(就类似复制一百个1kb文件是比复制100kb文件慢)。
对Draw Call进行批处理。将很多小的Draw Call合并成大的Draw Call。但是合并也要耗费性能,所以尽量对静态物体进行批处理,就可以减少合并次数,动态的批处理就要每次重新合并。(类似背包系统就要用到批处理Draw Call)