DirectX11 压缩纹理格式

2023-11-01 04:20
文章标签 格式 压缩 纹理 directx11

本文主要是介绍DirectX11 压缩纹理格式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

压缩纹理格式

1. 为什么需要压缩纹理?

一个虚拟场景可能会载入数百幅纹理,而些纹理会占用大量的GPU内存(记住,我们必须让所有的纹理驻留在GPU内存中,只有这样着色器才能快速地访问纹理)。使用这些格式的好处是它们可以压缩存储在GPU内存中,当使用时由GPU实时解压缩。将纹理存储为DDS压缩文件的另一个好处是可以减少磁盘空间的占用量。

2. 压缩纹理格式有哪些?

了缓解GPU内存压力,Direct3D提供了以下压缩纹理格式:BC1、BC2、BC3、BC4、BC5,BC6和BC7。

1.BC1(DXGI_FORMAT_BC1_UNORM):该格式支持3个颜色通道,仅用1位(开/关)表示alpha分量。

2.BC2(DXGI_FORMAT_BC2_UNORM):该格式支持3个颜色通道,仅用4位表示alpha分量。

3.BC3(DXGI_FORMAT_BC3_UNORM):该格式支持3个颜色通道,以8位表示alpha分量。

4.BC4(DXGI_FORMAT_BC4_UNORM):该格式支持1个颜色通道(例如,灰阶图像)。

5.BC5(DXGI_FORMAT_BC5_UNORM):该格式支持两个颜色通道。

6.BC6(DXGI_FORMAT_BC6_UF16):该格式用于压缩的HDR(高动态范围,high dynamic range)图像数据。

7.BC7(DXGI_FORMAT_BC7_UNORM):该格式用于高质量的RGBA压缩。特别的有,这个格式可以显著地减少由于压缩法线贴图带来的错误。

关于这些格式的更多信息,请读者在SDK文档的索引中查找“Block Compression(块压缩)”。

注意:

  1. 压缩纹理只能作为输入数据传递给渲染管线的着色器阶段。

  2. 因为块压缩算法使用4×4像素块,所以纹理尺寸必须为4的倍数。

3. 如何创建压缩纹理?

(1)D3DX11CreateShaderResourceViewFromFile
我们可以在载入纹理时使用D3DX11CreateShaderResourceViewFromFile函数的pLoadInfo参数,让Direct3D把纹理转换为某种压缩格式。例如下面的代码,它载入了一个BMP文件:

D3DX11_IMAGE_LOAD_INFO loadInfo;
loadInfo.Format = DXGI_FORMAT_BC3_UNORM;HR(D3DX11CreateShaderResourceViewFromFile(md3dDevice,L"Textures/darkbrick.bmp", &loadInfo, 0, &mDiffuseMapSRV, 0 ));// 从资源视图获取2D纹理
ID3D11Texture2D* tex;
mDiffuseMapSRV->GetResource((ID3D11Resource**)&tex);// 从2D纹理获取纹理描述
D3D11_TEXTURE2D_DESC texDesc;
tex->GetDesc(&texDesc);

(2)使用DDS(DirectDraw Surface)格式
另外,你也可以使用DDS(DirectDraw Surface)格式直接存储压缩纹理。操作步骤是运行SDK目录D:\Microsoft DirectX SDK(June 2010)\Utilities\Bin\x86中的DirectX纹理工具(DXTex.exe),打开你的图像文件。然后执行菜单命令Menu>Format>Change Surface Format,选择DXT1、DXT2、DXT3、DXT4或DXT5,并保存DDS文件。这些格式其实是Direct3D 9的压缩纹理格式,DXT1相当于BC1,DXT2和DXT3相当于BC2,DXT4和DXT5相当于BC3。例如,当我们用D3DX11CreateShaderResourceViewFromFile 函数载入一个DXT1格式的DDS文件时,它的实际纹理格式为DXGI_FORMAT_BC1_UNORM:

HR(D3DX11CreateShaderResourceViewFromFile(md3dDevice,L"Textures/darkbrick.dds", 0, 0, &mDiffuseMapSRV, 0 ));// 从资源视图获取2D纹理
ID3D11Texture2D* tex;
mDiffuseMapSRV->GetResource((ID3D11Resource **)&tex);// 从2D纹理获取纹理描述
D3D11_TEXTURE2D_DESC texDesc;
tex->GetDesc(&texDesc);

注意,如果DDS文件使用了某种压缩格式,那么我们可以将 pLoadInfo参数设为空值,D3DX11CreateShaderResourceViewFromFile会自动使用由文件指定的压缩格式。

(3)其他方法
对于BC4和BC5格式,你可以使用NVIDIA Texture Tools(http://code.google.com/p/nvidia-texture-tools/)。对于BC6和BC7格式,DirectX SDK包含了一个叫做“BC6HBC7EncoderDecoder11”的示例。这个程序可以用来将纹理转换为BC6或BC7格式。这个示例包含了完整的源代码,所以你可以将它整合到你自己的素材管道中。而且,若你的显卡支持计算着色器,这个示例还会使用GPU进行转换工作,这比通过CPU进行转换快得多。

你还可以用DirectX纹理工具生成多级渐近纹理层(Menu>Format>Generate Mip Maps),并保存为DDS文件。通过一方式,多级渐近纹理层可以被提前计算出来并保存在文件中,节省载入时的计算时间(它们只需要被载入 。

4. 调试检查压缩纹理格式

下图a是在调试器中看到的texDesc值;它包含了我们指定的压缩纹理格式,即使用压缩格式DXGI_FORMAT_BC3_UNORM创建纹理。当参数pLoadInfo设为空值时,Direct3D将使用源图像格式(下图b),即非压缩格式DXGI_FORMAT_R8G8B8A8_UNORM。
这里写图片描述

这篇关于DirectX11 压缩纹理格式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/320456

相关文章

SpringBoot3实现Gzip压缩优化的技术指南

《SpringBoot3实现Gzip压缩优化的技术指南》随着Web应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈,为了减少数据传输量,提高用户体验,我们可以使用Gzip压缩HTTP响应,... 目录1、简述2、配置2.1 添加依赖2.2 配置 Gzip 压缩3、服务端应用4、前端应用4.1 N

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

Python实现将MySQL中所有表的数据都导出为CSV文件并压缩

《Python实现将MySQL中所有表的数据都导出为CSV文件并压缩》这篇文章主要为大家详细介绍了如何使用Python将MySQL数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到... python将mysql数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到另一个

python dict转换成json格式的实现

《pythondict转换成json格式的实现》本文主要介绍了pythondict转换成json格式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下... 一开始你变成字典格式data = [ { 'a' : 1, 'b' : 2, 'c编程' : 3,

Python中Windows和macOS文件路径格式不一致的解决方法

《Python中Windows和macOS文件路径格式不一致的解决方法》在Python中,Windows和macOS的文件路径字符串格式不一致主要体现在路径分隔符上,这种差异可能导致跨平台代码在处理文... 目录方法 1:使用 os.path 模块方法 2:使用 pathlib 模块(推荐)方法 3:统一使

Java中使用注解校验手机号格式的详细指南

《Java中使用注解校验手机号格式的详细指南》在现代的Web应用开发中,数据校验是一个非常重要的环节,本文将详细介绍如何在Java中使用注解对手机号格式进行校验,感兴趣的小伙伴可以了解下... 目录1. 引言2. 数据校验的重要性3. Java中的数据校验框架4. 使用注解校验手机号格式4.1 @NotBl

Python批量调整Word文档中的字体、段落间距及格式

《Python批量调整Word文档中的字体、段落间距及格式》这篇文章主要为大家详细介绍了如何使用Python的docx库来批量处理Word文档,包括设置首行缩进、字体、字号、行间距、段落对齐方式等,需... 目录关键代码一级标题设置  正文设置完整代码运行结果最近关于批处理格式的问题我查了很多资料,但是都没

基于Python开发PDF转Doc格式小程序

《基于Python开发PDF转Doc格式小程序》这篇文章主要为大家详细介绍了如何基于Python开发PDF转Doc格式小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 用python实现PDF转Doc格式小程序以下是一个使用Python实现PDF转DOC格式的GUI程序,采用T

Python如何实现读取csv文件时忽略文件的编码格式

《Python如何实现读取csv文件时忽略文件的编码格式》我们再日常读取csv文件的时候经常会发现csv文件的格式有多种,所以这篇文章为大家介绍了Python如何实现读取csv文件时忽略文件的编码格式... 目录1、背景介绍2、库的安装3、核心代码4、完整代码1、背景介绍我们再日常读取csv文件的时候经常