在 D3D12 中实现 GenerateMipmaps

本文介绍了在 Direct3D 12 中如何手动实现 Render Target 的 Mipmap 生成,包括原理、具体实现、优化方法以及遇到的坑。通过 Shader 和 Quad 模型,结合 Resource Barrier 和 DrawInstance,实现实时生成 Mipmap 数据,同时避免了使用 ID3D11DeviceContext::GenerateMips 的性能损失。

目录

一、Render Target 的 Mipmap 需要数据

二、生成 Mipmap 数据方法的原理

 三、具体实现和优化

四、坑

 五、总结


一、Render Target 的 Mipmap 需要数据

        在纹理中使用 Mipmap 的方法很常见,其数据一般都是从纹理文件中读取而来。还有另一种带 Mipmap 的纹理,它就是 Render Target。在完成渲染到纹理之后,Render Target 可以被当成贴图再次使用。但是如果 Render Target 带有 Mipmap 则除了被渲染的那层 Mip 之外其他层都没有数据。在 D3D11 中提供了一个方法 ID3D11DeviceContext::GenerateMips 可以帮助 Render Target 生成指定 Mip 层的数据,但是这个好用的方法在 D3D12 中取消了,因为 D3D12 更底层,想要生成 Mipmap 的数据就需要自己动手。

二、生成 Mipmap 数据方法的原理

        从一张原图生成 Mipmap 数据的方法很多,做起来都非常耗时,看看 nVidia 给 PS 做的纹理插件就知道生成 Mipmap 有多少道道。但是 Render Target 生成 Mipmap 数据都是需要在运行时实时生成的,不可能像 PS 插件那么精细,时间和效率都耗不起。所以我们只要解决 Mipmap 数据的有无问题就行。

        一般来说 Render Target 分辨率最高的那层就是原图数据,其他每一层只要使用上一层的 Mipmap 作为纹理输入进行 Render To Texutre 就可以了,其实方法可以看作最简单后处理。注意,由于有 Cubemap 的存在,除了 Render Target 还需要对 Render Target Array 生成 Mipmap 数据。Cubemap 的

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值