欢迎来到我的博客小站。  交流请加我微信好友: studyjava。  也欢迎关注同名公众号:Java学习之道

Shader之(一)渲染流水线

  |   0 评论   |   0 浏览

一渲染流水线

一个完整的渲染流程分为三个阶段:应用阶段,几何阶段,光栅化阶段

应用阶段

此应用阶段通常是由cpu负责实现的,换句话说我们这些开发者具有这个阶段的绝对控制权。在这个阶段有三个主要任务,首先,我们需要贮备好场景数据,例如摄像机位置角度,场景内的模型光源等等;其次为了提高渲染性能我们需要做一个粗粒度剔除工作,最后我们需要设置每个模型的渲染状态,这些渲染状态包括但不限于它使用的材质(漫反射颜色,高光反射颜色),使用的纹理,shader等,这一阶段中重要的是输出渲染所需要的几何信息,即渲染图元,通俗讲就是点线三角面等,这些渲染图元会被传递给下一个阶段——几何阶段。

几何阶段

几何阶段负责和每个渲染图元打交道,进行逐顶点,逐多边形的操作,这一阶段可以分为更小的流水线阶段,以后再说。几何阶段重要的任务就死吧顶点坐标变换到屏幕空间的二维顶点坐标,每个顶点对应的深度值,着色等相关信息,并传递给下一阶段。

光栅化阶段

这个阶段将会使用上个阶段传递的数据来产生屏幕上的像素,并渲染出追踪的图像。这一阶段跟几何阶段一样也是在GPU上运行 的,光栅化的主要任务决定每个渲染图元中的哪些像素应该被绘制在屏幕上,他需要对上一个阶段得到的逐顶点数据(例如纹理坐标,顶点颜色等)进行插值,然后进行逐像素处理。和上一个阶段一样,光栅化阶段也可以细分为更小的流水线阶段

GPU跟CPU之间的通信

渲染流水线的起点为cpu,即应用阶段。应用阶段大致分为以下三个阶段:

(1)把数据加载到显存中

(2)设置渲染状态

(3)调用DrawCall

把数据加载到显存中:

所有渲染所需要的数据都需要从硬盘里加载到系统内存里,然后网格和纹理等数据又被加载到显卡的存储空间-显存中。因为显卡对显存的访问速度更快,而且大多数显卡对系统内存没有直接的访问权限,如图

真实渲染中需要加载到显存中的数据往往很复杂,例如顶点的位置信息,法线方向,顶点颜色,纹理坐标等

当把数据加载到显存后,系统内存中的数据就可以删除了,但对于一些数据来说,cpu仍然需要访问他们,那么我就不希望这些数据被删除,因为从硬盘加载到系统内存的过程是很耗时间的

设置渲染状态

通俗的讲,这些状态定义了场景中的玩个是怎样被渲染的,例如使用哪个顶点着色器/片元着色器,光源属性,材质等,如果我们没有更改渲染状态,那所有的玩个都将使用同一种渲染状态。下图显示了当使用同一种渲染状态时,渲染三个不同网格的结果

当上述工作准备好后,cpu就需要调用一个命令告诉GPU可以开始渲染了。而这个渲染命令就是DrawCall

调用DrawCall

DrawCall就是一个命令,它的发起方是CPU,接收方是GPU。这个命令仅仅会指向一个需要被渲染的图元列表,而不会在包含任何材质信息,因为我们在上一个阶段已经完成了。当给定了一个DrawCall时,GPU就会根据渲染状态(材质纹理着色器等)和所有的输入的顶点数据来进行计算,最终输出屏幕上显示的那些漂亮的像素。而这个计算过程就是我们下一节要讲的GPU流水线



标题:Shader之(一)渲染流水线
作者:shirlnGame
地址:https://www.mmzsblog.cn/articles/2020/12/19/1608362419897.html
-----------------------------
如未加特殊说明,此网站文章均为原创。
网站转载须在文章起始位置标注作者及原文连接,否则保留追究法律责任的权利。
公众号转载请联系网站首页的微信号申请白名单!

个人微信公众号 ↓↓↓                 

微信搜一搜爱上游戏开发