Skip to content

Commit

Permalink
dev merge to main
Browse files Browse the repository at this point in the history
  • Loading branch information
FuXiii committed Apr 6, 2024
2 parents ab82efe + 2b87a34 commit 00140f8
Show file tree
Hide file tree
Showing 6 changed files with 243 additions and 1 deletion.
8 changes: 8 additions & 0 deletions source/Changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,14 @@
此更新日志为纵览更新,对于具体文章的更新位于每个文章的开头的 `更新记录` 中。
```

## 2024/4/6

>* 更新`资源`文档
## 2024/4/2

>* 更新`资源`文档
## 2024/3/31

>* 更新`资源`文档
Expand Down
236 changes: 235 additions & 1 deletion source/Resource.rst
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,13 @@
* 2024/3/31 增加 ``VkImageCreateInfo`` 章节。
* 2024/3/31 增加 ``VkImageType`` 章节。
* 2024/3/31 增加 ``VkExtent3D`` 章节。
* 2024/4/2 增加 ``VkFormat`` 章节。
* 2024/4/2 增加 ``格式布局`` 章节。
* 2024/4/2 增加 ``数据类型`` 章节。
* 2024/4/6 更新 ``格式布局`` 章节。
* 2024/4/6 增加 ``VkSampleCountFlagBits`` 章节。
* 2024/4/6 增加 ``图片资源逻辑模型`` 章节。
* 2024/4/6 增加 ``VkImageTiling`` 章节。

在 ``Vulkan`` 中只有 ``2`` 种资源 :

Expand All @@ -36,6 +43,8 @@

在 ``Vulkan`` 中创建的所有资源都是 :bdg-warning:`` 资源,换句话说就是,创建的资源仅仅是一个资源句柄,并没有对应存储资源数据的内存。资源需要绑定到合适的设备内存中才具有 :bdg-warning:`完整的一生` (图桓宇给出了一个赞许的大拇指 (๑•̀ㅂ•́)و✧ )。

.. _Buffer:

缓存资源
###########

Expand Down Expand Up @@ -495,4 +504,229 @@ VkExtent3D

* 维度大小使用 ``VkExtent3D::width`` 、 ``VkExtent3D::height`` 和 ``VkExtent3D::depth`` 表示

.. note:: 无论是几维图片,在 ``Vulkan`` 看来全部都是 ``三维`` 图片。只不过一维和二维会在固定维度上会坍缩到 ``1`` 。( ``智子`` 表示:来看看我坍缩了几个维度?╭(●`∀´●)╯)
.. note:: 无论是几维图片,在 ``Vulkan`` 看来全部都是 ``三维`` 图片。只不过一维和二维会在固定维度上会坍缩到 ``1`` 。( ``智子`` 表示:来看看我坍缩了几个维度?╭(●`∀´●)╯)

其中 ``VkImageCreateInfo::format`` 对应的 ``VkFormat`` 枚举类型中有非常多的枚举值,我们这里拿几个经典的进行讲解:

VkFormat
^^^^^^^^^^^^^^^^^^^^^^^^

.. code:: c++

// 由 VK_VERSION_1_0 提供
typedef enum VkFormat {
VK_FORMAT_UNDEFINED = 0,
...
VK_FORMAT_R8_UNORM = 9,
VK_FORMAT_R8_SNORM = 10,
VK_FORMAT_R8_USCALED = 11,
VK_FORMAT_R8_SSCALED = 12,
VK_FORMAT_R8_UINT = 13,
VK_FORMAT_R8_SINT = 14,
VK_FORMAT_R8_SRGB = 15,
VK_FORMAT_R8G8_UNORM = 16,
...
VK_FORMAT_R8G8B8_UNORM = 23,
...
VK_FORMAT_R8G8B8A8_UNORM = 37,
...
VK_FORMAT_B8G8R8A8_SRGB = 50,
...
VK_FORMAT_R16_SFLOAT = 76,
...
VK_FORMAT_B10G11R11_UFLOAT_PACK32 = 122,
...
VK_FORMAT_D16_UNORM = 124,
...
VK_FORMAT_D32_SFLOAT = 126,
VK_FORMAT_S8_UINT = 127,
...
VK_FORMAT_D16_UNORM_S8_UINT = 128,
VK_FORMAT_D24_UNORM_S8_UINT = 129,
VK_FORMAT_D32_SFLOAT_S8_UINT = 130,
VK_FORMAT_BC1_RGB_UNORM_BLOCK = 131,
...
VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK = 147,
...
VK_FORMAT_EAC_R11_UNORM_BLOCK = 153,
...
VK_FORMAT_ASTC_4x4_UNORM_BLOCK = 157,
...
} VkFormat;

其实 ``VK_FORMAT_UNDEFINED`` 表示未定义格式,这个没什么好说的,我们现在来说明其他的。可以发现每个枚举值声明基本规则如下:

.. math::
\{VK\_FORMAT\}+\{\_\{格式布局\}\_+\_\{数据类型\}\_\} \times m
其中 ``VK_FORMAT`` 为枚举声明前缀,我们主要是关心 ``格式布局`` 和 ``数据类型`` 。

其中 ``格式布局`` 如下:

格式布局
"""""""""""""""""""""

格式布局主要是用于明确该格式下 :bdg-warning:`纹素` 的 :bdg-warning:`内部结构` 。

* :bdg-secondary:`R8` 拥有 :bdg-danger:`红色通道` 数据,占 ``8`` 个比特。
* :bdg-secondary:`R11` 拥有 :bdg-danger:`红色通道` 数据,占 ``11`` 个比特。
* :bdg-secondary:`R16` 拥有 :bdg-danger:`红色通道` 数据,占 ``16`` 个比特。
* :bdg-secondary:`R8G8` 拥有 :bdg-danger:`红色通道` 和 :bdg-success:`绿色通道` 数据,每个通道占 ``8`` 个比特。
* :bdg-secondary:`R8G8B8` 拥有 :bdg-danger:`红色通道` 、 :bdg-success:`绿色通道` 和 :bdg-primary:`蓝色通道` 数据,每个通道占 ``8`` 个比特。
* :bdg-secondary:`R8G8B8A8` 拥有 :bdg-danger:`红色通道` 、 :bdg-success:`绿色通道` 、 :bdg-primary:`蓝色通道` 数据和 :bdg-light:`透明度通道` 数据,每个通道占 ``8`` 个比特。
* :bdg-secondary:`B8G8R8A8` 拥有 :bdg-primary:`蓝色通道` 、 :bdg-success:`绿色通道` 、 :bdg-danger:`红色通道` 数据和 :bdg-light:`透明度通道` 数据,每个通道占 ``8`` 个比特。
* :bdg-secondary:`D16` 拥有 ``深度`` 数据,占 ``16`` 个比特。
* :bdg-secondary:`D24` 拥有 ``深度`` 数据,占 ``24`` 个比特。
* :bdg-secondary:`D32` 拥有 ``深度`` 数据,占 ``32`` 个比特。
* :bdg-secondary:`S8` 拥有 ``模板`` 数据,占 ``8`` 个比特。
* :bdg-secondary:`BC` :bdg-secondary:`ETC` :bdg-secondary:`EAC` :bdg-secondary:`ASTC` 表示数据为压缩形式。

.. admonition:: 压缩
:class: note

使用压缩可以在相似的视觉效果下可以占用更小的存储空间。此时我们先略过压缩格式,主要关注非压缩格式。

.. admonition:: 深度
:class: note

深度数据一般都是一个浮点数,其值一般用于表示图形表面到某一平面的距离信息。

.. figure:: ./_static/depth.png
:scale: 50%

如上图,深度数据存储着如图红线所示的距离。

.. admonition:: 模板
:class: note

模板数据一般都是一个整数,与深度类似,其值一般用于表示图形表面是否(覆盖)映射到对应像素。

其中 ``数据类型`` 如下:

数据类型
"""""""""""""""""""""

数据类型主要是用于明确 :bdg-warning:`纹素` :bdg-warning:`内部结构` 的 :bdg-warning:`数据类型` 。

* :bdg-secondary:`UNORM` 无符号归一化数据。类型为 ``float`` 。数据有效范围为 :math:`[0, 1]` 。
* :bdg-secondary:`SNORM` 有符号归一化数据。类型为 ``float`` 。数据有效范围为 :math:`[-1, 1]` 。
* :bdg-secondary:`USCALED` 无符号整数。数据将会转成 ``float`` 。数据有效范围为 :math:`[0, {2^n}-1]` 。( ``n`` 为 ``格式布局`` 中各数据所占比特位数)。
* :bdg-secondary:`SSCALED` 有符号整数。数据将会转成 ``float`` 。数据有效范围为 :math:`[{-2^{n-1}}, {2^{n-1}}-1]` 。( ``n`` 为 ``格式布局`` 中各数据所占比特位数)。
* :bdg-secondary:`UINT` 有符号整数。数据将会转成 ``无符号整形`` 。数据有效范围为 :math:`[0, {2^n}-1]` 。( ``n`` 为 ``格式布局`` 中各数据所占比特位数)。
* :bdg-secondary:`SINT` 有符号整数。数据将会转成 ``无符号整形`` 。数据有效范围为 :math:`[{-2^{n-1}}, {2^{n-1}}-1]` 。( ``n`` 为 ``格式布局`` 中各数据所占比特位数)。
* :bdg-secondary:`UFLOAT` 无符号浮点数。用于数据包和一些压缩格式中。
* :bdg-secondary:`SFLOAT` 有符号浮点数。
* :bdg-secondary:`SRGB` 标准颜色空间 :bdg-danger:`R` :bdg-success:`G` :bdg-primary:`B` 通道为无符号归一化数据(同 ``UNORM`` )。但其数据使用 `sRGB <https://learn.microsoft.com/zh-cn/windows/win32/wcs/srgb--a-standard-color-space>`_ 的非线性编码标准解析,如果 :bdg-light:`A` 通道存在则同样为无符号归一化数据。

.. admonition:: sRGB
:class: note

``sRGB`` 标准一般用于屏幕显示。现在市面上几乎所有的设备都能够支持显示 ``sRGB`` 格式的图像数据。

其中 ``VkImageCreateInfo::samples`` 的 ``VkSampleCountFlagBits`` 枚举类型定义如下:

VkSampleCountFlagBits
^^^^^^^^^^^^^^^^^^^^^^^^

.. code:: c++

// 由 VK_VERSION_1_0 提供
typedef enum VkSampleCountFlagBits {
VK_SAMPLE_COUNT_1_BIT = 0x00000001,
VK_SAMPLE_COUNT_2_BIT = 0x00000002,
VK_SAMPLE_COUNT_4_BIT = 0x00000004,
VK_SAMPLE_COUNT_8_BIT = 0x00000008,
VK_SAMPLE_COUNT_16_BIT = 0x00000010,
VK_SAMPLE_COUNT_32_BIT = 0x00000020,
VK_SAMPLE_COUNT_64_BIT = 0x00000040,
} VkSampleCountFlagBits;

* :bdg-secondary:`VK_SAMPLE_COUNT_1_BIT` 有 ``1`` 个采样点。即,纹素自身(将分出 ``1`` 个子纹素)。
* :bdg-secondary:`VK_SAMPLE_COUNT_2_BIT` 有 ``2`` 个采样点。即,纹素自身将分出 ``2`` 个子纹素。
* :bdg-secondary:`VK_SAMPLE_COUNT_4_BIT` 有 ``4`` 个采样点。即,纹素自身将分出 ``4`` 个子纹素。
* :bdg-secondary:`VK_SAMPLE_COUNT_8_BIT` 有 ``8`` 个采样点。即,纹素自身将分出 ``8`` 个子纹素。
* :bdg-secondary:`VK_SAMPLE_COUNT_16_BIT` 有 ``16`` 个采样点。即,纹素自身将分出 ``16`` 个子纹素。
* :bdg-secondary:`VK_SAMPLE_COUNT_32_BIT` 有 ``32`` 个采样点。即,纹素自身将分出 ``32`` 个子纹素。
* :bdg-secondary:`VK_SAMPLE_COUNT_64_BIT` 有 ``64`` 个采样点。即,纹素自身将分出 ``64`` 个子纹素。

由于像素都是一块块的,并不能像一条线那样丝滑连续,当将连续的数据存入像像素这样的离散数据时,需要对连续数据进行采样,进而确定离散的像素值。像这样将连续数据转成离散数据必定会导致部分原始信息的丢失。在图像上就会产生锯齿。

.. figure:: ./_static/samples.png

``1`` 个纹素仅进行 ``1`` 次采样

如上图中每个格子为一个纹素(像素),其中心的点为采样点。当黄色部分完全覆盖了对应的 :bdg-danger:`采样点` 后,对应的纹素才会存储相应的数据,而部分覆盖纹素,但没有覆盖 :bdg-warning:`采样点` 的地方将不会存储(采样)任何值。进而导致锯齿。

为了减少锯齿,我们可以将一个纹素分割成多个子纹素来增加采样点,这样之前采样不到的纹素也会随着采样点的增多得到覆盖,进而得到采样,以此来达到抗锯齿的目的。

但越多的采样次数意味着更多的计算量,过多的计算量可能会延长运行时间。

.. admonition:: 子纹素
:class: note

纹素会将各子纹素的采样结果根据权重进行汇总,并将汇总结果作为该(顶级)纹素的结果。

.. figure:: ./_static/multi_samples.png
:scale: 65%

``1`` 个纹素进行 ``16`` 次采样( ``VkSampleCountFlagBits::VK_SAMPLE_COUNT_16_BIT`` )

如下为 ``VK_SAMPLE_COUNT_1_BIT`` 和 ``VK_SAMPLE_COUNT_8_BIT`` 的成像对比:

.. figure:: ./_static/sample.jpg

单次采样与 ``8`` 次采样对比示意图

其中 ``VkImageCreateInfo::tiling`` 的 ``VkImageTiling`` 类型定义如下:

图片资源逻辑模型
^^^^^^^^^^^^^^^^^^^^^^^^

现在我们来讲解一下如何理解 ``VkImageCreateInfo`` 中的各参数,并将他们从逻辑上关联起来,并建立一个易于理解的模型。

其中 ``VkImageCreateInfo`` 中与之有关的核心参数如下:

.. code:: c++

typedef struct VkImageCreateInfo {
...
VkImageType imageType;
VkFormat format;
VkExtent3D extent;
...
uint32_t arrayLayers;
VkSampleCountFlagBits samples;
...
} VkImageCreateInfo;

.. note:: 未完待续

VkImageTiling
^^^^^^^^^^^^^^^^^^^^^^^^

.. code:: c++

// 由 VK_VERSION_1_0 提供
typedef enum VkImageTiling {
VK_IMAGE_TILING_OPTIMAL = 0,
VK_IMAGE_TILING_LINEAR = 1,
} VkImageTiling;

* :bdg-secondary:`VK_IMAGE_TILING_OPTIMAL` 优化排布。
* :bdg-secondary:`VK_IMAGE_TILING_LINEAR` 线性排布。

:ref:`Buffer` 章节我们已经知道缓存资源在 ``Host端`` 和 ``Device端`` 其为了更高的效率,内部的结构是不同的,图片资源也是如此。

当使用 ``VkImageTiling::VK_IMAGE_TILING_OPTIMAL`` 时,用于指示该图片资源将会使用 ``Device端`` 内部偏爱的结构(驱动内部结构)进行创建。

当使用 ``VkImageTiling::VK_IMAGE_TILING_LINEAR`` 时,用于指示该图片资源将会使用 ``Host端`` 偏爱的线性结构进行创建。这一般用于 ``CPU`` 读写图片资源数据时使用。

..
VK_IMAGE_TILING_LINEAR限制
imageType is VK_IMAGE_TYPE_2D
format is not a depth/stencil format
mipLevels is 1
arrayLayers is 1
samples is VK_SAMPLE_COUNT_1_BIT
usage only includes VK_IMAGE_USAGE_TRANSFER_SRC_BIT and/or VK_IMAGE_USAGE_TRANSFER_DST_BIT
Binary file added source/_static/depth.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added source/_static/multi_samples.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added source/_static/sample.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added source/_static/samples.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 00140f8

Please sign in to comment.