: 渲染管线

Posted tiny_ten

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了: 渲染管线相关的知识,希望对你有一定的参考价值。

【Unity shader 入门精要】内容精要--第二章: 渲染管线

what&why

什么是渲染管线? 为什么要学渲染管线,即了解渲染管线的意义是啥?
渲染管线(Render Pipeline)
渲染 + 管线
渲染:3D模型转化成2D图像的过程
管线:其实就是流水线,pipe英文有管道之意,管线就这么翻译了,其实就是流水线。
一个过程具备两个特点,就可以认为是流水线,1有多道工序(可并行)2.工序之间有前后顺序
那所以渲染管线就是 计算机把3D模型转化成2D图像的程序化过程
为什么要了解
(升职加薪,了解更多,增加生命厚度)
想要对一个过程进行控制与干预,就要了解这个过程,了解的越详细,可控的粒度越小。
控制手段:编写着色器
控制工具:着色器语言(shader)

正文(精要)

阶段一: 应用阶段

参与者:
CPU,GPU
做的事情

  • 准备场景数据(把数据加载到内存以及显存)
  • 剔除(culling):删除不可见的物体
  • 设置渲染状态(参数):包括但不限于配置 材质、纹理、使用的着色器,就像配置部署流水线的工人一样。
  • CPU向GPU发起Draw Call指令,并告诉GPU这个指令对应的渲染图元列表

输入:人的设置
输出:一堆渲染图元(rendering primitives),可渲染的最小几何单位,包括点、线、三角面

阶段二: 几何阶段

参与者:
GPU
做的事情

  • 坐标系的转化,把顶点的坐标变换到屏幕坐标

输入:一堆渲染图元
输出:一堆屏幕坐标系下的图元顶点坐标,包括这些顶点对应的深度值、着色、法向、视角方向等相关信息

子阶段

顶点着色器(必要,可编程)

Vertex Shader
每个顶点都会被输入到顶点着色器中 执行一遍顶点着色器的逻辑,具体逻辑是可编程的。
做的事情

  • 光栅化:把图元栅格化像素,即计算每个图元覆盖了哪些像素
  • 计算像素的颜色

曲面细分着色器(可选,可编程)

几何着色器(可选,可编程)

执行 逐图元的着色操作

裁剪(必要,可配置,不可编程)

图元和摄像机视野的关系:

  • 完全在视野内
  • 部分在视野内(裁剪 clipping):与视野边界求交点
  • 完全在视野外(剔除)

几何阶段到次此为止,会得到归一化的设备坐标(Normalized Device Coordinates, NDC)

屏幕映射(必要,GPU固定实现,不可配置,不可编程)

坐标会进一步转化,坐标从NDC转化到屏幕坐标系下(Screen Coordinates)

阶段三: 光栅化阶段

参与者:
GPU
做的事情

  • 坐标系的转化,把顶点的坐标变换到屏幕坐标

输入:一堆屏幕坐标系下的图元顶点坐标,还有一些额外信息
输出:图像(主色后的像素阵列)

子阶段

三角形设置(必要,可配置,不可编程)

得到三角网格三边的表达方式

三角形遍历(必要,可配置,不可编程)

三角网格的栅格化,检查每个像素是否被一个三角网格覆盖,如果是,就会生成一个片元(fragment),该过程也被称为扫描变换,会生成一个片元序列
片元:显示在屏幕上的叫像素,而最终颜色还没有计算出来之前,叫片元,一个片元是一堆状态的集合,这些状态都是计算一个特定像素最终颜色所需要的各种信息,比如屏幕坐标、深度信息、纹理坐标等等。

片元着色器(可选,可编程)

Fragment Shader, 根据一个片元的特定信息计算最终颜色,计算方式可编程。

逐片元操作(必要,可配置,不可编程)

所有片元的合并,包括计算可见性以及一个像素的最终颜色(一个像素可能由多个片元共同决定,比如涉及到半透明物体的时候)
计算可见性的操作比如:深度测试、模板测试
颜色混合:多片元颜色合并的方式,会得到一个屏幕坐标,也就是一个像素的最终颜色。

以上是关于: 渲染管线的主要内容,如果未能解决你的问题,请参考以下文章

图形渲染管线简介

Unity渲染管线流程

[Unity Shader] 渲染管线流程

《Unity Shader入门精要》读书笔记

UnityShader入门精要-第二章 渲染流水线笔记

OpenGL渲染管线(rendering pipeline)