目录
一、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 的

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

被折叠的 条评论
为什么被折叠?



