渲染管线(随笔)

渲染管线概述

渲染管线功能

  1. 图形渲染管线的主要功能是在给定一个虚拟相机,三维物体,光源和其他信息的情况下,渲染一幅二维图像。
  2. 在二维图像中:物体的位置取决于物体的三维位置,环境的一些性质和相机的位置。
  3. 在二维图像中:物体的颜色取决于材质的属性,光源,纹理和着色器等。

CPU和GPU的区别

3D游戏中,是有成千上万的三角面,CPU肯定是计算不来的。GPU可以并行计算。

渲染管线渲染流程

在渲染流程里,CPU与GPU联动合作,渲染画面。这个流程可以被分为3个阶段:应用阶段,几何处理阶段,光栅化

应用阶段

  • 这个阶段完全由开发人员掌控。这个阶段主要由CPU负责,CPU将决定传递给GPU什么样的数据(特效雾、场景模型、灯光或者摄像机)。有时候还会对这些数据进行处理(只传递GPU可以被看见的元素,其他不可见的元素被剔除[culling]),还会告诉GPU这些数据的渲染状态(纹理、材质、着色器)。
  • CPU从RAM(内存)中将数据拿出来,并经过筛选(数据处理,如剔除),连同数据的处理方式(如着色器)移交给GPU。这里CPU与RAM用的是更加复杂的语言,但是GPU中就是使用的指令(着色器语言 shader)。
放入显存和DrawCall
  • CPU从硬盘把数据加载进内存,再传递给GPU,一般来说,这些数据在内存中就会被释放了。但是有些特殊数据却可以得到保留,例如一面墙需要计算物体碰撞,它不仅需要被渲染出来,CPU还要对它进行计算物体碰撞。
  • 在传递完数据给GPU后,CPU还需要下达一个指令,这个指令就是DrawCall。由于之前已经把这个数据准备的很充分了,所以DrawCall只是一个指向需要被渲染的图元列表,相当于告诉GPU可以开始工作了。
DrawCall

为了CPU和GPU可以并行工作,就需要一个命令缓冲区 (Command Buffer)。命令缓冲区中的命令有很多种,DrawCall只是其中的一种。

  • 命令缓冲区包含了一个命令队列,CPU添加命令,GPU读取命令。
  • 为了让CPU和GPU相互独立工作,CPU需要渲染一些对象时,它就添加命令。GPU完成上一次渲染任务之后,就去取下一次的渲染任务并执行。(这里可以从CPU占用率和GPU占用率体现)

造成DrawCall的性能问题的元凶一般是CPU。

  • 每次调用DrawCall的时候,CPU都会需要向GPU发送很多信息,需要完成很多检查的准备工作。
  • 为了提高提交DrawCall的速度,有一种解决方式是批处理 (Batching),即把需要的渲染的模型合并在一起提交给GPU。

几何阶段

这个阶段由GPU掌控。几何阶段将把CPU在应用阶段发来的数据进行处理,这个阶段中又有若干的子阶段,可以理解为流水线(几何阶段)上的一道道工序(子阶段)。

顶点着色器

【开发者可以完全控制】

曲面细分着色器

【开发者可以完全控制,此阶段不是必须的】

几何着色器

【开发者可以完全控制,此阶段不是必须的】

投影

【开发者无法控制,GPU固定实现】

裁剪

【开发者无法完全控制,但可以配置】

屏幕映射

【开发者无法控制,GPU固定实现】

待补充

参考

https://zhuanlan.zhihu.com/p/137780634
https://zhuanlan.zhihu.com/p/368065919

posted @ 2021-11-10 12:06  阿初  阅读(85)  评论(0编辑  收藏  举报