Shader入门学习记录——CPU与GPU之间的通讯

上一章Shader入门学习记录——渲染流程

1.把数据加载到显存中

所有渲染需要的数据都需要从硬盘(Hard Disk Drive,HDD)中加载到系统内存(Random Access Memory ,RAM)中。然后,网格和纹理等数据有被加载到显卡上的存储空间——显存(VRAM)中。这就是因为,显卡对于显存的访问速度更快,而且大多数显卡对于RAM没有直接的访问权利。
Shader入门学习记录——CPU与GPU之间的通讯
需要注意的是,真实渲染中需要加载到显存中的数据往往比上图所显示的情况要复杂许多。例如,顶点的位置信息、法线方向、顶点颜色、纹理坐标等。
当把数据加载到显存中后,RAM中的数据就可以移除了。但对于一些数据来说,CPU仍然需要访问它们(例如,我对这类数据开了读写),那么我们可以能不希望这些数据被移除,因为从硬盘加载到内存的过程是十分耗时的。
在这之后开发者还需要通过CPU来设置渲染状态,从而“指导”GPU如果进行渲染工作。

2.设置渲染状态

什么是渲染状态呢?一个通俗易懂的解释就是,这些状态定义了场景中的网格是怎么被渲染的。例如,使用哪个顶点着色器(Vertex Shader)片元着色器(Fragment Shader)、光源属性和材质等。如果我们没有更改渲染状态,那么所有的网格都将使用同一种渲染状态。下图显示了当使用同一种渲染状态时,渲染3个不同网格的结果。
Shader入门学习记录——CPU与GPU之间的通讯
在准备好上述所有工作后,CPU就需要调用一个渲染命令来告诉GPU:“嘿!老兄,我都帮你把数据准备好啦,你可以按照我的设置来开始渲染啦!” 而这个命令就是Draw Call

3.调用Draw Call

相信接触过渲染优化的读者应该都听过 Draw Call。实际上,Draw Call就是一跳命令,它的发起方是CPU,接收方是GPU。这个命令仅仅会指向一个需要被渲染的**图元(primitives)**列表,而不会在包含任何材质信息——这是因为我们已经在上一个阶段完成了这个过程。
当给定了一个Draw Call时,GPU就会根据渲染状态(例如材质、纹理、着色器等)和所有输入的顶点数据来进行计算,最终输出在屏幕上显示的那些漂亮的像素。而这个计算的过程就是GPU流水线。
Shader入门学习记录——CPU与GPU之间的通讯