Shader即着色器,实际上Shader只是渲染流水线上的一个环节,想要了解Shader是怎么工作的,就必须先了解Shader在渲染流水线中扮演了怎样的角色。对于开发者而言,想要开发出炫酷的特效,需要我们在渲染流水线中控制一些数据的输入以达到我们期望的效果。这些数据包括虚拟摄像机,光源,Shader,纹理等等。
讲渲染流水线之前先了解一下流水线,到底什么是流水线呢,我们知道一辆汽车的组装需要很多的步骤,而每一个步骤都是有先后顺序的,流水线工作的方式就是把这些步骤分给专门的人来完成,步骤一的人完成任务后交接给步骤二的人,然后又开始进行下一辆车的组装,而不需要组装完一辆车再组装下一辆,如果有N个步骤,理论上流水线的工作方式是后者的N倍。当然,流水线也存在性能瓶颈,如果某一个步骤花费的时间较长,那么平均生产一辆车的时间也会变长(理论上平均生产一辆车的时间为花费时间最长的步骤的时间)。
流水线的概念同样适用于计算机的图形渲染中,渲染流水线的最终产物是将一系列的顶点数据,纹理等的数据转化成人眼可以看到的二维图像。而这个工作通常由CPU和GPU来完成。渲染流程一般分为三个阶段:
渲染流水线的起点是CPU即应用阶段,应用阶段又可以分为三个阶段:
所有渲染所需的数据都要从硬盘(HDD)中加载到系统内存(RAM),然后网格和纹理等数据又被加载到显卡的存储空间中-显存(VRAM),这是因为显卡访问显存的速度更快而且大多数显卡对RAM没有直接访问的权利。
当把数据加载到显存中后RAM中的数据就可以移除了,但是当我们需要对场景中的物体进行碰撞检测是,CPU仍然需要访问网格数据,所以我们并不希望这些数据被移除,因为CPU访问HDD的速度是很慢的。
渲染状态定义了网格的数据是怎么被渲染的,这些都是通过CPU来告知GPU需要哪些顶点着色器,片元着色器,材质,光源属性等
调用DrawCall:
DrawCall是CPU通知GPU的命令,他指向一个渲染图元的列表,也就是说CPU叫GPU渲染哪个图元,GPU就会根据渲染状态将所有输入的数据进行计算最后输出成屏幕上显示的像素。后者我们叫GPU流水线
几何阶段用于处理所有我们要绘制的几何相关的事情,几何阶段负责和每个渲染图元打交道,进行逐顶点,逐多边形的操作,这一阶段可以进一步分成更小的流水线阶段(本篇文章不会深入)
这一阶段会使用上个阶段产生的数据来生成屏幕上的像素,并渲染出最终的图像,这一阶段在GPU上运行。光栅化的主要任务主要是决定哪些渲染图元应该被绘制在屏幕上。他需要对上一个阶段得到的逐顶点数据进行插值,然后再进行像素处理。光栅化阶段也可分为更小的流水线阶段(本篇文章不会深入)
原文:https://www.cnblogs.com/FanJiangDaoHai/p/14036984.html