DirectX12(D3D12)基础教程(十二)—(1)

3、本章主要Shader

4、水彩画效果

5、Shader函数的本质与PSO对象

6、高斯模糊优化

6.1、并行计算条件和多遍渲染

6.2、高斯模糊优化思路及实现


1、前言

上一章中最后一个水彩画效果是有问题的,这一讲我们特意修正这个错误。其实错误主要是因为真正的水彩画效果还需要一个后处理——高斯模糊。

这一章主要的任务就是修正这个错误。同时这一章中将结合使用酷炫的多线程+多显卡渲染框架。为了能更好的理解本章教程示例,请各位最好已经仔细阅读了之前关于多线程渲染、多显卡渲染,以及Shader原始特效的章节文章及示例代码。

在本章中,多线程渲染依旧是用来录制渲染三个不同物体的命令列表。而多显卡渲染则主要用主显卡来渲染3D场景到纹理,而辅助显卡(核显)用来做后处理。后处理主要是实现水彩画效果以及两遍简单高斯模糊(垂直、水平分开各一遍)。

在我的笔记本上,主显卡就是来自N家的RTX2070,而辅助显卡就是Intel的核显UHD630,这是典型的混合显卡架构(我在这里不是为了秀设备的,请大家不要误解。而是因为现在大多数笔记本设备几乎都具有独显和核显,所以在需要高性能渲染时闲置任何一个都是“犯罪”,当然省电不是我们要考虑的问题)。

在之前的多显卡渲染示例中,已经介绍了使用无连接混合多显卡渲染的基本方法,在本章继续使用多显卡渲染有更进一步的目的,首先是为了让大家更加习惯并进一步书序多显卡渲染,其次主要就是为了让大家真正明白一个表面上很“孱弱”的核显,究竟能为我们做些什么?或者更确切的说,就是核显究竟能为我们的画质改进或者渲染性能提升带来什么样的效果?

本章中高斯模糊使用了与前一章原理性介绍不同的标准简化两遍高斯模糊,并且在性能上有明显提升。稍后会详细讲解改进优化的思路,这也是本章的重点之一。

本章示例运行后效果图如下:

使用键盘空格键可以控制水彩画效果的开关,Tab键控制高斯模糊效果的开关,Q键控制水彩画的随机采样半径,E键控制量化Bit数。

本章全部代码已经上传至GitHub:11-MultiThreadAndAdapter

2、多线程+多显卡整体渲染架构:

为了使大家能够彻底掌握和理解本章示例代码中的核心内容,首先来看一下这一次组合多线程+多显卡渲染后的程序整体逻辑。注意在这里依旧没有使用任何C++类封装,代码风格依然是C-Style,除了方便大家阅读代码外,更是为了让大家从整体上把握和理解多线程+多显卡渲染的整体框架。或者更贴切的说,是为了让大家能够从“上帝视角”来理解整个框架。

OK一图胜千言,下图中详细展示了本次示例的执行顺序框架:

上图只是展示了本章示例程序的大致执行逻辑顺序,特别要注意的是,图中先后顺序,并不是说GPU的过程与CPU的过程是串行执行的,本质上其实是CPU往GPU的命令队列中写入GPU命令的顺序而已,而CPU在调用了ExecuteCommandLists之后,CPU和GPU是真并行执行的。同时图中没有明显标识出Draw Call的调用,在D3D12的异步渲染框架中,其实Draw Call只是变成了一个命令记录而已,子线程录制命令列表最后一般都会写入一个Draw Call命令,同时每遍后处理最后也会写入一个Draw Call命令。通过前面的学习,这点各位应该不难理解。没有单独标出Draw Call的目的,是让大家不至于再混淆认为Draw Call时GPU就开始工作了,是耗时的调用。主要是为了让各位牢记或者说习惯现在D3D12中,实质上是调用ExecuteCommadLists之后,GPU才开始工作而已。

最终从图中可以看出,这个示例程序的框架其实与多线程渲染的框架大同小异,控制辅助显卡后处理的工作实质都是主线程单独完成的,因为到这一步,实质上CPU已经不用再做过多的工作了,所以一般也就不用CPU多线程来提高效率了。

当程序运行后主显卡和辅助显卡就是如下图形式的错帧运行了:

这个图在之前第八章教程中已经出现过了。需要注意的是,其中的时间值不是我们这个例子中的时间值,这里只是展示原理,我只是偷懒没有再重绘这个图了。

在我们实际例子中,辅助显卡主要是运行后处理,因为后处理基本上就是不断地处理屏幕像素大小的一张纹理而已,工作量基本上是固定的,所以其性能也是可以预期的。在本例中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值