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

相关文章

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

使用zip4j实现Java中的ZIP文件加密压缩的操作方法

《使用zip4j实现Java中的ZIP文件加密压缩的操作方法》本文介绍如何通过Maven集成zip4j1.3.2库创建带密码保护的ZIP文件,涵盖依赖配置、代码示例及加密原理,确保数据安全性,感兴趣的... 目录1. zip4j库介绍和版本1.1 zip4j库概述1.2 zip4j的版本演变1.3 zip4

Linux中压缩、网络传输与系统监控工具的使用完整指南

《Linux中压缩、网络传输与系统监控工具的使用完整指南》在Linux系统管理中,压缩与传输工具是数据备份和远程协作的桥梁,而系统监控工具则是保障服务器稳定运行的眼睛,下面小编就来和大家详细介绍一下它... 目录引言一、压缩与解压:数据存储与传输的优化核心1. zip/unzip:通用压缩格式的便捷操作2.

Mysql常见的SQL语句格式及实用技巧

《Mysql常见的SQL语句格式及实用技巧》本文系统梳理MySQL常见SQL语句格式,涵盖数据库与表的创建、删除、修改、查询操作,以及记录增删改查和多表关联等高级查询,同时提供索引优化、事务处理、临时... 目录一、常用语法汇总二、示例1.数据库操作2.表操作3.记录操作 4.高级查询三、实用技巧一、常用语

利用Python脚本实现批量将图片转换为WebP格式

《利用Python脚本实现批量将图片转换为WebP格式》Python语言的简洁语法和库支持使其成为图像处理的理想选择,本文将介绍如何利用Python实现批量将图片转换为WebP格式的脚本,WebP作为... 目录简介1. python在图像处理中的应用2. WebP格式的原理和优势2.1 WebP格式与传统

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式

《C#实现将Office文档(Word/Excel/PDF/PPT)转为Markdown格式》Markdown凭借简洁的语法、优良的可读性,以及对版本控制系统的高度兼容性,逐渐成为最受欢迎的文档格式... 目录为什么要将文档转换为 Markdown 格式使用工具将 Word 文档转换为 Markdown(.

Java中JSON格式反序列化为Map且保证存取顺序一致的问题

《Java中JSON格式反序列化为Map且保证存取顺序一致的问题》:本文主要介绍Java中JSON格式反序列化为Map且保证存取顺序一致的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录背景问题解决方法总结背景做项目涉及两个微服务之间传数据时,需要提供方将Map类型的数据序列化为co

SpringBoot实现文件记录日志及日志文件自动归档和压缩

《SpringBoot实现文件记录日志及日志文件自动归档和压缩》Logback是Java日志框架,通过Logger收集日志并经Appender输出至控制台、文件等,SpringBoot配置logbac... 目录1、什么是Logback2、SpringBoot实现文件记录日志,日志文件自动归档和压缩2.1、