: 渲染管线
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, 根据一个片元的特定信息计算最终颜色,计算方式可编程。
逐片元操作(必要,可配置,不可编程)
所有片元的合并,包括计算可见性以及一个像素的最终颜色(一个像素可能由多个片元共同决定,比如涉及到半透明物体的时候)
计算可见性的操作比如:深度测试、模板测试
颜色混合:多片元颜色合并的方式,会得到一个屏幕坐标,也就是一个像素的最终颜色。
以上是关于: 渲染管线的主要内容,如果未能解决你的问题,请参考以下文章