shader渲染管线简述

342 阅读3分钟

本文已参与[新人创作礼]活动,一起开启掘金创作之路。 本章导图: 在这里插入图片描述

一、渲染流水线概述

渲染流水线由CPU和GPU协同工作,可分为三大阶段:

  • 应用阶段:输出渲染图元
  • 几何阶段:输出屏幕空间的顶点信息
  • 光栅化阶段:输出最后结果

1.应用阶段

  • 参与者:CPU,开发者主导
  • 任务: 首先,构建场景 其次,将不可见的物体进行剔除 最后,设置模型的渲染状态,即怎么渲染的 核心:输出渲染所需的几何信息

2.几何阶段

  • 参与者:GPU
  • 任务: 对输入的渲染图元进行处理,输出屏幕空间的二维顶点坐标,每个顶点的深度值,着色信息 核心:将顶点坐标变换到屏幕空间中

3.光栅化阶段

  • 参与者:GPU
  • 任务: 使用上一阶段传递数据产生屏幕上的像素,输出最终图像

二、CPU和GPU之间的通信——应用阶段

应用阶段可分为三个子阶段:

  • 加载:将数据加载到显存
  • 设置:设置渲染状态
  • 调用:调用 Draw Call

1.把数据从硬盘加载到显存

  • 首先,数据从硬盘到系统内存
  • 然后,网格和纹理数据从内存加载到显存,再由显卡读取

在这里插入图片描述

2.设置渲染状态

  • 定义:表示场景中的网格是怎么被渲染的

在这里插入图片描述

3.调用 Draw Call

  • 定义:向GPU发送渲染请求 在这里插入图片描述

三、GPU流水线——几何阶段和光栅化阶段

在这里插入图片描述 (黑色代表可编程可配置,灰色代表不可编程但可配置,白色代表不可编程不可配置)

1.几何阶段

  • 首先,在顶点着色器进行顶点的空间变换、顶点着色。其中,无论对顶点进行怎样的变化,都要进行归一化,也就是将模型空间转换到齐次裁剪空间。
  • 然后,在曲面细分重色器中细分图元
  • 再在几何着色器中进行逐图元的着色操作
  • 然后进行裁剪,将不再摄像机视野内的点去掉。其中,完全在单位立方体外部的图元被舍弃,完全在立方体内部的图元被保留,和立方体相交的图元被裁剪,新的顶点被生成,外部的顶点被舍弃。
  • 最后将图元坐标转换到屏幕空间中

2.光栅化阶段

  • 首先是三角形设置与遍历阶段,由顶点坐标信息得到边的像素信息,判定哪些像素被三角形网格覆盖,得到对应的片元信息。
  • 然后,在片元着色器总进行逐片元的着色操作,利用插值的结果对片元的颜色进行计算。
  • 再对GPU配置,进行逐片元操作。主要任务为决定每个片元的可见性(模板测试和深度测试)和颜色的混合。 具体流程图如下: 在这里插入图片描述 决定片元可见性: 在这里插入图片描述 颜色混合: 在这里插入图片描述
  • 最后根据颜色缓冲区中的颜色值得到屏幕图像,利用双重缓冲,让前置缓存与后置缓存交替,保证图像的连续性。

四、什么是shader

  • GPU上可高度编程的阶段,并在GPU上运行,例如顶点着色器和片元着色器。