目标

在《图形API学习工程(11):使用纹理》中我学习了如何创建纹理,在创建时都指定了其格式:


对于DirectX,是DXGI_FORMAT。
对于Vulkan,是VkFormat。
(OpenGL也有类似的东西,随后讨论)

本篇的目标是——查阅资料并结合自己的思考,对纹理格式的相关内容进行学习与讨论,具体包括:

  • 讨论为何要使用和指定不同的纹理格式
  • 纹理格式中常见关键字的学习

讨论为何要指定纹理格式

在一开始,我并不理解为何要有不同的纹理格式,因为我知道显示器可以显示红绿蓝三种颜色的光分别有0~255级别,即8位二进制。那这样的话纹理中每个像素不就是最多用24位吗?如果加上alpha通道那不就是32位吗?为何还需要那么多纹理格式呢?

后来,我发现这种想法是很局限的。

导致格式不同的原因

在渲染时使用的纹理,并非都是所谓的 红、绿、蓝、Alpha四通道各8位 。还有其他格式的纹理被需要,原因有很多,至少在我的理解中有以下方面:

  • 并非所有的纹理都需要 红、绿、蓝、Alpha 这四个通道,比如有些纹理只需要其中一个通道即可完成它自己的任务。
  • 有些纹理需要存储的光的强度并不是8位能表示的。比如HDR(high-dynamic range)。
  • 有些纹理使用压缩来减少自己的内存开销,压缩方式例如 block-compression、ASTC
不同格式对应的位数

不同的纹理格式导致数据的大小不同。比如:

  • 如果一个通道使用8位的BYTE保存,那么对于每个像素:红、绿、蓝、Alpha四通道就是4x8=32位。
  • 如果一个通道使用32位的float保存,那么对于每个像素:红、绿、蓝、Alpha四通道就是4x32=128位。
  • 如果使用了压缩技术,则情况更复杂一些,总体数据的大小一定比压缩前更小。

而同样数据大小可能有多种格式与之对应。例如:

  • 对于每像素32位的大小。它既可能是“红、绿、蓝、Alpha四通道的BYTE”,也可能是“只有一个红通道的float

因此创建纹理时指定格式是必要的,否则GPU就不知道如何对纹理数据进行解读。

常见关键字

这些纹理格式的命名都使用了缩写,在DXGI_FORMATVkFormat之间也有相似的共用词语。
为了能更快明白一个纹理格式名字的含义,我想对其中常见的关键词进行总结。
(对于更权威与全面的解释还需要看DXGI_FORMAT和VkFormat官方文档)

RGBA

Red、Green、Blue、Alpha。红、绿、蓝再加上一般表示不透明度的Alpha通道。
例如:

  • R8G8B8A8表示红通道8位、绿通道8位、蓝通道8位、Alpha通道8位。
  • R8G8相比上者只有红通道和绿通道
_UNORM

Unsigned-Normalized-Integer。无符号型归一化的整数。
所谓“无符号”指的是没有负数,即全是正值。
所谓的“归一化”指的是,最终表示的值是0.0~1.0。例如假设这个整数是8位的即0~255,那么255对应1.0128大约对应0.5;假设这个整数是16位的,即0~65535,那么65535对应1.032768大约对应0.5

举例格式:

  • R8G8B8A8_UNORM表示红通道8位、绿通道8位、蓝通道8位、Alpha通道8位,且8位代表的是一个无符号型归一化的整数。
_FLOAT

浮点数。对于DirectX来说是 _FLOAT,对于Vulakn来说是 _SFLOAT,不过含义相同,后者的S意思是 “signed”,即有符号的,而DirectX中同样是有符号的。

在DXGI_FORMAT文档中的说明:

  • 32位的浮点数使用 IEEE 754 单精度 的标准:1位符号、8位指数偏移、23位数值部分。
  • 16位的浮点数使用半精度(s10e5)的格式:1位符号、5位指数偏移、10位数值部分。

不过似乎在DXGI_FORMAT中也有既不是32位也不是16位的浮点数:

只是似乎比较少见。

_SNORM

Signed Normalized Integer。带符号的归一化的整数。

_UINT

Unsigned integer。无符号型的整数

_SINT

Signed Integer。带符号型的整数。

BC

block-compressed 型纹理压缩格式,详见:
Texture Block Compression in Direct3D 11 - Win32 apps | Microsoft Docs

ASTC

ASTC型纹理压缩格式,详见:
Using ASTC Texture Compression for Game Assets | NVIDIA Developer

OpenGL

而OpenGL在这方面似乎稍微繁琐一些,因为它指定纹理格式方面不是由一个东西决定的:

对于glTexImage2D这个函数,在《OpenGL红书》中有对相关参数较为权威的解释:

它指出:

  • internalformat指定了OpenGL应该怎样存储纹理中的数据。
  • formattype共同指定了初始数据的格式。随后OpenGL将根据这个格式来对数据进行解析并转换为internalformat

在《OpenGL红书》的【TextureFormats】章节可以看到对所有格式的说明

(在这篇文章中也有讨论:《OpenGL ES 3.0 纹理格式介绍及有效的内部格式、格式、类型组合_阿飞的博客-CSDN博客》值得学习)

未来问题

  • _SRGB 这个关键字似乎很频繁出现,具体的意义是什么?

  • DXGI_FORMAT中的 _TYPELESS 的含义。

  • OpenGL纹理格式更深入的学习

学习纹理格式(DXGI_FORMAT 和 VkFormat)相关推荐

  1. mkfs.ext3 快速格式化_学习使用格式化工厂,合并视频,转为MP4等

    学习使用格式化工厂,合并视频,转为MP4等 这个找不到官网,很多下载一堆垃圾,视频时代,小视频等各种视频编辑软件,比如快影,快剪辑,专业的有pr,会声会影 这个是最新版,我经常使用,现在视频时代都在编 ...

  2. 手游中的文件格式和纹理格式

    手游中的文件格式和纹理格式 原文地址:http://78soft.com/article/7446.html 我们看到png.jpg.bmp 然后又看到RGBA-4444.RGBA-5551.RGB- ...

  3. 手机游戏开发中如何选择适合的纹理格式

    手机游戏开发中如何选择适合的纹理格式 为毛要写这个 本来觉得像这样的问题,是无法归类的,因为不同的项目有不同的需求,但今天因为quick论坛中的一个技术疑问贴,钩起了我整理这篇文章的兴趣 http:/ ...

  4. Unity3d 批量修改纹理格式

    决定纹理资源大小的因素主要有三种:分辨率.格式和Mipmap是否开启. 对于纹理资源的加载建议如下: 1.严格控制RGBA32和ARGB32纹理的使用,在保证视觉效果的前提下,尽可能采用"够 ...

  5. ETC1压缩纹理格式详解

    本来以为,ETC1作为Android 设备的OpenGL标准,开源且最常用的的一种压缩纹理格式,总会有人去翻译一下khronos的文档,读一下代码,给大家作个普及的,不料就是搜不到.没办法,尽管英文不 ...

  6. 利用二维数据学习纹理三维网格生成(CVPR 2020)

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨paopaoslam 来源丨泡泡机器人SLAM 标题:Leveraging 2D Data to ...

  7. 前端学习——JSON格式详解

    0.前言 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于JavaScript Programmin ...

  8. 游戏进度:关于DirectX3D的压缩纹理格式DXT1/CB1

    2022-11-17 前几天刚弄完将FBX文件内的模型骨骼动画实现到自己的游戏,但是看着那只有线条的正方体模型在那走来走去总觉得缺少一点美感,于是乎觉得应该开始研究纹理了 这几天就一直在研究纹理,以将 ...

  9. 前端学习01-04格式标签

    格式标签 <p></p>标签是段落标签 <p align=right>这是第一段</p> <P>这是第二段</p> <br ...

  10. word学习-清除格式+清除链接

    文章目录 清除文档格式 清除文档链接 清除文档格式 清除文档链接

最新文章

  1. Android建造者模式初探(Toast工具类的进一步封装)
  2. STM32 SPI的使用
  3. ios开发返回按钮消失_iOS开发之自定义导航栏返回按钮右滑返回手势失效的解决...
  4. tomcat的日志文件权限与启动用户的权限不一致
  5. 配置Hyper-V Server 资源计量
  6. Windows Terminal 新手入门
  7. 佳能2525i扫描驱动_您需要扫描仪整合工具吗?来试试ExactScan Pro for mac
  8. nginx 各种配置
  9. pdfpcell输出换行_poi导出Excel(cell单元格里的一串文字,换行显示,设置字体)...
  10. Linux下Oracle新建一个数据库、启动多实例数据库
  11. 文后参考文献著录规则 自动生成器 HTML
  12. The Hacker Way
  13. 2020牛客暑期多校训练营(第九场)I .The Crime-solving Plan of Groundhog
  14. 数论读书笔记——线性丢番图方程——解不定方程
  15. Java 静态static
  16. (openCV 十)ML_SVM
  17. 小白如何上手几款微信小程序UI组件库
  18. FlexRay概述 -FlexRay的基本组件及状态机图
  19. 怎样自己定制标签(Custom Tag)
  20. Java Script 秒表计时器 ( 源码 + 分析 )

热门文章

  1. SL会员商城系统后台管理模板
  2. Ubuntu 18.04截屏
  3. 黑马Java学科资料
  4. C盘清理工具帮你迅速找到大文件
  5. delphi 剪切板变量_delphi实时监控剪贴板
  6. “十四五”融合地表水国控断面监测数据(约3641个点位,含水质等级、水温,pH,溶解氧,电导率,浊度,高猛酸盐指数,化学需氧量,五日生化需氧量,氨氮,总磷,总氮,铜,锌,氟化物,硒,砷,汞,镉,等)
  7. 5G NR Type II CSI Codebook简介
  8. 数字类型转换以及函数全介绍
  9. 智能配送与货物跟踪图
  10. Access入门简单教程