游戏渲染管道

高级的渲染步骤是由管道(软件架构)实现,各个阶段会操作输入流中的数据项,并对输出流产生数据。

管道每个阶段独立于其他阶段,所以管道的最大有点在于非常适合并行化。

渲染管道分为3个概要阶段。但在这里多讲几个阶段(包含脱机工具创建场景的阶段):

  1. 工具阶段(脱机):定义几何和材质

  2. 资产调节阶段(脱机):资产调节管道处理几何和材质数据,生成引擎可用的格式

  3. 应用程序阶段(CPU):识别潜在可视的网格实例并把它们和材质提交给GPU

  4. 几何处理阶段(GPU):变换顶点、照明,并投影至齐次裁剪空间

  5. 光栅化阶段(GPU):三角形转换成片段并着色。期间片段会进行多种测试,最终和帧缓冲混合

工具阶段

在Maya、3ds Max、SketchUp等工具中制作三维模型。美术也需要定义材质(包括贴到网格表面的纹理设置,以及其他高级特性比如选用哪个着色器、着色器的输入参数。。。)

资产调节阶段

导出、处理、链接多个种类的资产,生成一个整体,并已准备就绪供引擎导入。

应用程序阶段

主要进行三个方向的处理:

  • 可见性判断。仅把潜在可见的物体提交给GPU。

  • 提交几何图元给GPU。

  • 控制那些不可编程但可配置的GPU管道参数及渲染状态。

可见性判断

首先进行平截头体剔除,用物体的包围体积(通常是球体)与平截头体的六个平面进行运算。每个平截头体的六个平面向外移动球体半径的距离,如若球的中心点在平截头体内部,则视为是在平截头体里面无需剔除,否则就应该剔除。

但目前游戏能达到非常大的规模,所有物体进行平截头体剔除有点不太现实,所以可以通过“场景图”的方式来进行剔除,即设计一些数据结构来管理几何物体,这类数据结构能短时间内判断是否在平截头体中,并在判断不在时迅速丢弃里面的物体。

四叉树是其中一个数据结构,把空间递归分割成象限,每层递归生成四个节点,直到每个子节点中含有n个物体。通常是每个子节点中包含一个物体。进行平截头体判断的方式很简单,就是从根节点向叶节点遍历,检查节点是否在平截头体范围内,如果该节点不在则迅速停止判断,并且此节点的叶节点都不可能在平截头体范围内了。

八叉树是四叉树的三维版本。二元空间分割(BSP)则是空间递归分割一半。kd树和BPS的特殊情况,BSP每次分割可以任意方向,kd每次分割都是轴对齐,先切割x坐标,再切割y坐标,依次类推。

其次进行遮挡判断。

有几项技术,其中一项是潜在可见集(PVS),即将场景划分为几个区域,每个区域提供能看见的其他区域列表。

还有另一个方法:入口,每个区域用孔洞连接,每个孔洞(比如窗户/门户)和摄像机交互并向前延伸形成类似平截头体的效果,便可以和平截头体剔除一样确定哪些物体可不被渲染。

反入口则是相反概念,锥形视角也可视作是不可见区域,通过不可见区域来排除一定不可见的那些物体。

几何排序

为了增加GPU渲染效率,可以按照材质来排序几何物体,即先渲染材质A再渲染材质B。但是为了保证预先丢弃被遮挡的像素,有应该从前至后的顺序来渲染三角形,这样是更快的。那如何解决这一冲突呢,可以采用GPU的深度预渲染步骤,主要方式是渲染场景两次,第一次快速产生深度缓冲的内容,不透明物体用从前至后的顺序更新深度缓冲,第二次再用材质进行排序,用最少的状态改变渲染颜色。

渲染完不透明物体后再从后至前渲染半透明表面。也可使用次序无关透明,每个像素存储多个片段,场景渲染后无需排序直接渲染透明物体。但是因为每个像素要存储所有透明片段,所以存在高内存成本。

GPU管道

几乎所有GPU(图形处理器)都会把管道拆分为以下的子阶段:

顶点着色器负责变换及着色顶点。输出是变换和着色后的顶点。

几何着色器处理以齐次裁剪空间表示的整个图元(三角形、线段、点),包括剔除、修改、添加图元,包括阴影体积拉伸、立方体贴图的渲染、布料模拟等。

流输出即数据能从这里回到管道开始的地方做进一步处理,比如头发的渲染,顶点着色器进行物理模拟完之后交给几何着色器渲染,然后顶点数据重新流入管道开始的地方渲染。

裁剪即是把三角形在平截头体外的部分切掉。同样能剔除完全在平截头体外的三角形。此阶段可配置,比如除了平截头体的平面外可定义额外的裁剪平面。

屏幕映射即简单的顶点变换,把其从齐次裁剪空间变换到屏幕空间。

三角形建立&遍历即将三角形转换成片段(光栅化)。

在提前深度测试阶段能够检查片段的深度,若某片段确定会被帧缓冲内的像素遮挡,就可在此时丢弃该片段。值得注意的是,不是所有GPU都支持这项操作,过去的GPU的深度测试是在像素着色器之后进行,所以这里被称为提前z测试或者提前深度测试。

像素着色阶段里,输入时一组每片段属性(通过顶点属性插值获得),输出则是颜色矢量,代表片段颜色。

合并/混合/光栅运算(ROP)阶段中,负责执行多个片段测试,包括深度测试、alpha测试、模板测试等。此片段若通过所有测试,则与帧缓冲原来的颜色进行混合。为了让alpha混合显示正常,必须先将不透明几何物体渲染至帧缓冲,然后依次渲染透明物体。

可编程着色器

着色器从输入数据取得一个元素,并变换为输出数据的零个或多个元素。

  • 顶点着色器输入模型空间或者世界空间的顶点,输出变换和着色后的齐次裁剪空间的顶点。

  • 几何着色器输入一个有n个顶点(1是点,2是线段,3是三角形)的图元,输出一个经过阴影体积拉伸、立方体贴图的渲染、布料模拟等处理后的图元。

  • 像素着色器输入一个片段,输出的是将要写进帧缓冲的颜色。也可以丢弃这个片段,输出则是空。

抗锯齿

全屏抗锯齿/超采样抗锯齿(FSAA)

把场景渲染至比实际屏幕大的帧缓冲中,渲染完之后再向下采样至目标分辨率。

多采样抗锯齿(MSAA)

因为锯齿主要产生在三角形边缘而非内部,所以相对上个方法有所改良。

因为光栅化三角形可分为三个操作:1.判断三角形重叠(覆盖测试)。2.判断三角形遮挡(深度测试)。3.这两个测试之后着色。

非抗锯齿情况下的光栅化中每个像素都是基于一个点来做上面三个操作的,一般是选像素中央点。

但是MSAA中就是一个像素内采样多个点进行前两个测试,着色时就取这些采样点的子样本平均值来着色。

覆盖采样抗锯齿(CSAA)则是以上方法进一步优化,一次着色,N次深度测试,但是覆盖测试过程中会更多采样点进行测试,这样子能有更细致的色彩融合效果。比如1次着色,4次深度测试,16次覆盖测试。

形态学抗锯齿(MLAA)

正常尺寸渲染,通过扫描找出阶梯形状的图像模式,发现这些图像模式后通过模糊化降低混叠效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/423086.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Maven《四》-- 基于Idea进行Maven工程构建

目录 🐶4.1 构建概念和构建过程 🐶4.2 命令方式项目构建 1. 🥙编译:mvn compile 2. 🥙清理:mvn clean 3. 🥙打包:mvn package 4. 🥙安装:mvn install …

第二节 K8S 的架构

第二节 K8S 的架构 K8S 架构图如下: 官方文档: https://kubernetes.io/docs/concepts/architecture/ kube-api-server 是集群的核心, 是k8s中最重要的组件, 因为它是实现声明式api的关键, 整个集群的入口,所有请求都要经过它, api接口服务. kubernetes…

制造业管理软件:为何ERP替代不了MES?

一、ERP和MES的功能区别 ERP是一种综合性的企业管理软件,它涵盖了企业的各个方面,包括财务、采购、库存、销售、人力资源等。它的主要功能是将企业内部的各项业务整合为一个整体进行管理,实现信息共享和协同工作。ERP的主要特点是可以对企业…

街头霸王II神经网络AI训练项目

简介: 该项目通过对街头霸王II进行足够的人工或自动训练,最终生成的神经网络可以让对局双方在AI的掌控下自动进行对局。 要求: 一、MAME版本:MAME01850b-64位 二、ROM版本: “街头霸王Ⅱ加速终极格斗日版”(sf2hfj) …

ESP8266模块双模式(AP+STA)共存同时与电脑及手机进行UDP通信

1.准备工作: 硬件: ESP8266模块 USB连接线: 连接ESP8266模块到电脑 如果电脑没有USB接口,准备一个USB HUB: USB HUB 连接电脑Type-C接口,ESP8266模块连接USB HUB 软件: 安装Arduino IDE 2.2.1 在Arduino IDE中安装esp8266开发板(USB没识别芯片,要安装对应操作系统CH2340或…

k8s集群异常恢复

前提、我自己的k8s采用的是单master节点两个从节点部署,我针对单master情况进行恢复说明 场景一:正常开关虚拟机,可直接重启kubelet进行恢复 1、1、一般重启后三个节点都需要检查,输入命令检查kubelet: systemctl s…

立创EDA学习:PCB布局

目前进度 ESP32最小系统板项目,已完成原理图绘制 点击“更新/转换原理图到PCB” 点击“应用修改” 对应器件的封装就可以对应到PCB中 布局传递 回到原理图,框选每一个模块,“设计-布局传递” 会跳转到PCB界面,可以自己选择放置位…

java使用双异步,性能优化

一、一般我会这样做: 通过POI读取需要导入的Excel;以文件名为表名、列头为列名、并将数据拼接成sql;通过JDBC或mybatis插入数据库;操作起来,如果文件比较多,数据量都很大的时候,会非常慢。 访问之后,感觉没什么反应,实际上已经在读取 + 入库了,只是比较慢而已。 读…

详解APQC流程分级分类框架PCF13个高阶分类和5级业务流程

一:什么是APQC 美国生产力与质量中心(American Productivity and Quality Center,简称为APQC),创立于1977年是一个会员制的非营利机构,使命是“发现有效的改进方法,广泛地传播其发现成果,实现个人之间及其…

MySQL ORDER BY(排序) 语句

昨天介绍了 MySQL 数据库 UNION 操作符的使用,今天主要讲解下 ORDER BY(排序)语句。 我们知道从 MySQL 表中使用 SELECT 语句来读取数据。如果需要对读取的数据进行排序,我们就可以使用 MySQL 的 ORDER BY 子句来设定你想按哪个字…

有效的数独[中等]

优质博文:IT-BLOG-CN 一、题目 请你判断一个9 x 9的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一…

ArrayList(集合)

一、ArrayList构造器 1.ArrayList()&#xff1a;构造一个初始容量为10的空列表 2.ArrayList(int n)&#xff1a;构造一个初始容量为n的空列表 3.ArrayList(Collection<? extends E> c)&#xff1a;按照集合的迭代器返回的顺序构造一个包含指定集合元素的列表 二、基本…