| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 游戏开发 -> 计算机图形学笔记(一)渲染管线概述 -> 正文阅读 |
|
[游戏开发]计算机图形学笔记(一)渲染管线概述 |
计算机图形学笔记(一)渲染管线概述
一、什么是渲染管线渲染管线(渲染流水线)是将三维场景模型转换到屏幕像素空间输出的过程。图形渲染管线接受一组3D坐标,然后把它们转变为屏幕上的有色2D像素输出。
二、CPU与GPU之间的通信渲染管线的起点是CPU,CPU与GPU的通信即上文的应用阶段,在这个阶段可分为以下三个步骤: 三、GPU渲染管线渲染管线是将三维场景模型转换到屏幕像素输出的过程。图形渲染管线接受一组3D坐标,然后把它们转变为屏幕上的有色2D像素输出。
上图是对渲染管线的一种描述,其中绿色部分代表可编程的阶段,所以也被称为可编程渲染管线(这区别于一些较旧的GPU渲染管线,这种渲染管线只提供一些配置操作,开发者没有对流水线的完全控制权),接下来介绍下上图中的各个流程。 顶点着色器:顶点着色器的处理单位是顶点,即对于输入的每个顶点都会调用一次顶点着色器。顶点着色器主要功能是进行坐标系变换操作,所输入的顶点坐标等位于模型局部坐标空间,因此在这里需要将顶点坐标数据变换为到齐次裁剪空间。当顶点坐标被变换到齐次裁剪空间后,通常再由硬件做透视除法,最终得到归一化的设备坐标(NDC)。顶点着色器还可执行顶点光照计算(高洛德着色),但顶点光照效果通常不尽人意,因此通常在片元着色器中执行逐片元光照计算。 曲面细分着色器:曲面细分着色器是一个可选的阶段。曲面细分是利用镶嵌化处理技术对三角形进行细分,以此来增加物体表面的三角面数量。
几何着色器:几何着色器也是一个可选的阶段。顶点着色器以顶点数据作为输入数据,而几何着色器则以完整的图元(Primitive)作为输入数据。例如,以三角形的三个顶点作为输入,然后输出对应的图元。与顶点着色器不能销毁或创建顶点不同,几何着色器的主要亮点就是可以创建或销毁几何图元,此功能让GPU可以实现一些有趣的效果。例如,根据输入图元类型扩展为一个或更多其他类型的图元,或者不输出任何图元。需要注意的是,几何着色器的输出图元不一定和输入图元相同。几何着色器的一个拿手好戏就是将一个点扩展为一个四边形(即两个三角形) 裁剪:裁剪操作就是将相机看不到的物体、顶点剔除,使其不被下一阶段处理。只有当图元完全位于视锥体内时,才会将它送到下一阶段,对于部分位于视锥体内的外部的顶点将被剔除掉。由于已经知道再NDC下的顶点位置(即顶点位置在一个立方体内),因此裁剪就变得简单:只需要将图元裁剪到单位立方体内。裁剪这一步骤是硬件的固定操作,因此是不可编程的。 屏幕映射:这一步输入的坐标仍是三维坐标(范围在单位立方体内),屏幕映射的任务就是将每个图元的x、y值变换到屏幕坐标系(屏幕坐标系是一个2D空间)。由于输入坐标范围在[-1,1],因此这是一个拉伸到屏幕分辨率大小的过程。对于输入的坐标z值不做任何处理(实际上屏幕坐标系和z坐标一起构成窗口坐标系)。这些值会被一起传递到光栅化阶段。 三角形设置:光栅化第的第一个流水线阶段是三角形设置,这个阶段会计算光栅化一个三角形所需的信息。具体来说上一阶段输出的都是三角形的顶点,但如果要得到整个三角形网格对像素的覆盖情况,就必须计算每条边上的像素坐标。为了能计算边界像素的坐标信息,就需要得到三角形边界的表示方式。这样一个计算三角网格表示数据的过程就叫做三角形设置。它的输出是为下一阶段做准备的。 三角形遍历:该阶段会检查每个像素是否被一个三角形网格所覆盖。若被覆盖的话就会生成一个片元。而这样一个找到哪些像素被三角形网格覆盖的过程就是三角形遍历,这个阶段也被称为扫描变换。三角形遍历阶段会根据上一个阶段的计算结果来判断一个三角形网格覆盖了哪些像素,并使用三角网格3个顶点的顶点信息对整个覆盖区域的像素进行插值。
片元着色器:片元着色器是一个非常重要的可编程着色器阶段,前面的光栅化阶段实际上并不会影响每个像素的颜色值,而是会产生一系列的数据信息,用来表述一个三角网格是怎样覆盖每个像素的,而片元就负责存储这样一系列信息,真正会对产生影响的是下一个阶段逐片元操作。 逐片元操作(输出合并):逐片元操作是渲染管线的最后一个阶段,这一阶段有几个重要任务: (1)决定每个片元的可见性,这涉及到很多测试功能,例如深度测试、模板测试。 深度测试同样是高度可配置的,如果开启了深度测试,GPU会把该片元的深度值和已经存在于深度缓冲区中的深度值进行比较,这个比较函数也是可以由开发者设置,通常这个值是小于等于的关系,因为我们总想显示出离相机最近的物体(不包括透明/半透明),而那些被遮挡的就不需要出现在屏幕。如果一个片元通过了测试,那么开发者可以指定是否要用这个片元的深度值覆盖所有的深度值。
(2)如果一个片元通过了所有测试,就需要把这些片元的颜色值和颜色缓冲中已有的颜色值进行混合。 四、渲染管线中的坐标系变换从输入的顶点局部坐标最终到屏幕坐标需要经过一系列的变换,才能显示到屏幕上,变换过程如上图所示。 世界空间:世界空间是描述虚拟世界的最大空间,顶点变换的第一步就是将顶点坐标从模型空间中变换到世界空间中,这个变换通常叫做“模型变换”。在模型变换时,通常还需要将法线变换到世界空间中(后续执行光照计算),对于法线变换不能简单的使用模型变换矩阵来变换法线,对于包含非均匀缩放的变换,需要求解模型变换的逆转置矩阵。具体参考法线变换矩阵公式推导。 观察空间:观察空间也被称为摄像机空间,是一种特殊的模型空间,相机决定了渲染所使用的视角。按照OpenGL的传统,观察空间的相机位于原点,面向-z方向,+y轴指向上方。 裁剪空间:裁剪空间的目标是能够方便的对图元进行裁剪,这块空间是由视锥体决定的,视锥体外为看不到的区域,也就是被裁剪的部分。如果直接使用视锥体定义的空间进行裁剪,那么不同的视锥体就需要不同的处理过程,而且对于透视投影来说,要判断一个顶点是否位于视锥体内是比较麻烦的。因此,通过一个投影矩阵将顶点转换到裁剪空间中是一种通用、方便的方式。用于变换的到裁剪空间的矩阵叫做“投影矩阵”,常见的投影矩阵有透视投影和正交投影。实际上,投影矩阵并没有真正的进行投影工作,而是为投影做准备,真正的投影发生在齐次除法过程中,这发生在屏幕空间映射阶段,经过投影矩阵变换后,顶点的w分量具有特殊意义(判断x、y、z是否位于[-w,w]范围,说明是否需要裁剪)。详细参考:齐次坐标系与Unity投影矩阵的推导、齐次坐标与投影几何。 屏幕空间:经过投影矩阵变换,就可以进行裁剪操作。当完成所有裁剪工作后,就需要进行真正的投影了,经过这一步才会得到真正的像素位置。首先需要进行齐次除法,实际上就是用齐次坐标系的w分别除x、y、z分量。经过这一步,就可以把坐标从齐次裁剪空间转换到NDC空间中。 Reference
|
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 6:13:40- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |