计算机渲染流水线流程
渲染流水线的工作任务 :有一个三维场景出发最总渲染成一张二维的图像 通常由CPU 与 GPU共同完成。
渲染流程在概念性阶段可以分为三个阶段:应用阶段(Application Stage), 几何阶段(Geometry Stage), 光栅化阶段(Rasterizer Stage)。
应用阶段--------->输出渲染图元-------->几何阶段-------->输出屏幕空间的顶点信息-------->光栅化阶段
应用阶段:
这个阶段由应用主导,通常由CPU负责实现,开发者对这个阶段有绝对控制权
任务:准备场景数据,摄像机位置,视椎体, 场景中包含的模型,使用的光源等等 。粗粒度的遮挡剔除处理 。最后设置每个模型的渲染状态,包括但不限于使用的材质,使用的纹理,使用的Shader 。这一阶段最重要的是输出渲染所需的几何信息,即渲染图元 ,通俗的讲:渲染图元可以是点 线 三角面等,这些渲染图元会传送给几何阶段
几何阶段
这一阶段通常在GPU上进行
任务:负责和每个渲染图元打交道,进行逐顶点,逐多边形的操作。把顶点坐标变换到屏幕空间,再交给光栅化器处理。通过对渲染图元的处理 将会输出屏幕坐标的二维顶点坐标,每个顶点对应的深度值等相关信息
光栅化阶段
这一阶段通常在GPU上进行
作用:使用上一阶段的传递数据来产生屏幕上的像素,并渲染出最终的图像 主要任务是决定每个渲染图元的那些像素应该绘制到屏幕上,需要对上一个流程的逐顶点数据(纹理坐标,顶点颜色)进行插值 最后进行逐像素处理
CPU与GPU之间的通信
渲染流水线的起点是CPU 1.将数据加载到显存中 2.设置渲染状态 3.调用DrawCall来进行一次绘制
1网格纹理等数据加载到显存中 显卡访问显存的速度比加快
2设置渲染状态 定义:定义了场景中的网格是怎么被渲染的 (使用哪个shader ,材质,光源属性等)
3调用DrawCall DrawCall 是一个命令 是由CPU发起的,接收方GPU GPU会根据渲染状态和所有输入的顶点数据进行计算最终生成像素点
GPU流水线
对于概念阶段的几何阶段和光栅化阶段,开发者没有绝对的控制权,实现的载体是GPU
GPU的渲染流水线接收顶点数据作为输入,来源于应用阶段加载到缓存的,设置渲染状态 这些数据会传递给顶点着色器
几何阶段
顶点着色器:完全可以编程的,通常实现顶点的空间变换,顶点着色等功能
曲面细分着色器:可选的着色器 用于细分图元
几何着色器:可选的着色器 用于执行逐图元的着色,或者产生更多的图元
裁剪:可配置的 将那些不在摄像机视野的顶点裁剪掉,并删除某些三角图元的面片
屏幕映射:可配置和编程 负责将每个图元的坐标转换到屏幕坐标系
光栅化阶段
三角形设置
三角形遍历
片元着色器: 完全可编程的 实现逐像素的着色操作
逐片元操作:高度可配置的 执行许多重要功能 修改颜色 深度缓冲 混合操作
顶点着色器:
输入来源CPU 处理单位是顶点,每个顶点会调用一次着色器,本身不能创建或者销毁顶点,无法得到顶点与顶点之间的关系
工作:坐标变换和逐顶点光照 当然还会输出后续阶段的数据 坐标变换就是对顶点的坐标进行变换。可以改变顶点的位置 顶点着色器必须完成的工作,把顶点从模型坐标变换到齐次裁剪空间 接着通常有硬件做透视除法得到归一化的设备坐标
裁剪:
工作:那些不在摄像机视野范围内的物体不需要被处理
屏幕映射:
工作:是把每个图元的x和y坐标转换到屏幕坐标系下,屏幕坐标系是一个二维坐标系,它和我们用于显示画面的分辨率有很大关系 屏幕映射得到的屏幕坐标决定了这个定点对应屏幕上那个像素以及距离这个像素多远
三角形设置:
工作:计算光栅化一个三角形网格所需的信息
三角形遍历:
工作:检查每个像素是否被一个三角形网格所覆盖,如果覆盖的话就会生成一个片元 片元不是真正意义上的像素包含了屏幕坐标,深度信息,顶点信息,法线信息等
片元着色器:
前面的阶段并不会影响屏幕的每个像素的颜色值,而是产生一些列的信息数据,真正对像素产生影响的是下一个流程 逐片元操作输入上一个阶段对顶点信息插值得到的结果 输出是一个或者多个颜色值 进行纹理采样
逐片元操作(输出合并阶段):
工作:1,决定每个片元的可见性,涉及很多测试工作美丽如深度测试,模板测试等 2,如果一个片元通过了所有的测试,就需要把这个片元的颜色值和已经存储在颜色缓冲区中的颜色进行混合 此阶段是高度可配置的