SwallowJoe的博客

Be a real go-getter,
NEVER SETTLE!

0%

以下分析基于Android R.

简述

上一章我们分析了App是如何通过更改一个小小的WindowManager的LayoutParam的属性,来影响Framework决策帧率变化的。

接来下我们详细看看SurfaceFlinger是如何根据Framework传入的帧率参数选择合适帧率的。

阅读全文 »

简述

回顾上一篇章中的读取图像的步骤:

  1. 首先利用stb-image库读取图片,将其内容存储在临时缓存区VkBuffer中,注意需要开辟GPU可见内存
  2. 通过VkImageCreateInfo结构指明图像格式并通过vkCreateImage创建VkImage对象
  3. 用VkBuffer图像文件中的像素填充创建的VkImage图像对象
    1. 填充图像对象需要使用VkImageMemoryBarrier
    2. 使用vkCmdPipelineBarrier使得图像填充Barrier生效
    3. 通过vkCmdCopyBufferToImage完成图像像素从VkBuffer到VkImage的拷贝(填充)
    4. 再通过VkImageMemoryBarrier指定图像是能够从着色器中的纹理图像开始采样
  4. 创建图像视图和图像采样器
  5. 添加一个组合的图像采样器描述符来从纹理中采样颜色

在图像采样器创建之前,我们首先看看纹理图像视图,这个是在我们创建交换链的时候见过:

阅读全文 »

简述

在之前我们使用顶点着色器以及描述符来实现绘制有颜色的几何体,还实现了旋转动画。接下来我们学习一下纹理贴图,这个将是我们实现加载绘制基本3D模型的基础。

阅读全文 »

简述

我们现在可以为每个顶点传递任意属性到顶点着色器,但是全局变量呢?我们将从本章开始讨论三维图形,这需要一个模型视图投影矩阵。我们可以将其作为顶点数据包含,但这是对内存的浪费,而且每当变换发生变化时,都需要我们更新顶点缓冲区。然而这种转换可能在每一帧都有。

阅读全文 »

简述

虽然现在我们创建的顶点缓冲区工作正常,但是从CPU访问它的内存类型可能不是图形显卡本身读取的最佳内存类型,最理想的内存具有VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT位标志,并且通常不可由专用图形显卡上的CPU访问。而且我们上一篇最后实现的随鼠标移动的功能也没有考虑同步,简单一点,考虑读写分离。

现在创建两个顶点缓冲区:CPU可访问内存中的一个暂存缓冲区用于从顶点数组上传数据,最终顶点缓冲区位于设备本地内存中。然后我们将使用一个缓冲区复制命令将数据从暂存缓冲区移动到实际的顶点缓冲区。简单来说就是暂存缓冲区用于cpu写入,顶点缓冲区用于GPU读取数据。

阅读全文 »

简述

接下来,我们将用内存中的顶点缓冲区替换顶点着色器中的硬编码顶点数据。我们将从创建CPU可见缓冲区的最简单方法开始,并使用memcpy将顶点数据直接复制到其中,然后我们将看到如何使用分段缓冲区将顶点数据复制到高性能内存。

阅读全文 »

简述

在上一篇里,我们已经成功绘制了一个颜色渐变的三角形,并将其显示在窗口上了。但是窗口Surface可能会发生变化,从而使交换链不再与之兼容,比如是窗口大小的变化。所以我们必须捕获这些事件并重新创建交换链。

阅读全文 »

简述

在这一章里,所有的事情都要集中起来。我们将编写drawFrame函数,该函数将在主循环中被调用,以将三角形置于屏幕上。创建函数并从mainLoop调用它.

1
2
3
4
5
6
7
8
9
void mainLoop() {
while (!glfwWindowShouldClose(window)) {
glfwPollEvents();
drawFrame();
}
}
...
void drawFrame() {
}
阅读全文 »

简述

Framebuffers, 帧缓冲区。之前我们在学习’Swap Chain-交换链’时提到Vulkan没有“默认帧缓冲区”的概念,取而代之的是名为 “swap chain” 即交换链,也就是渲染的缓冲区,必须在Vulkan中明确创建。 现在我们已经设置了渲染过程,以期望使用与交换链图像相同格式的单个帧缓冲区,但实际上我们还没有创建任何帧缓冲区。

通过将渲染过程创建期间指定的附件包装到VkFramebuffer对象中来绑定附件。

帧缓冲区对象引用表示附件的所有VkImageView对象。在我们的情况下,这将只是一个单一的:颜色附件。但是,我们必须用于附件的图像取决于在检索用于表示的图像时交换链返回的图像。这意味着我们必须为交换链中的所有图像创建一个帧缓冲区,并使用与绘制时检索到的图像相对应的帧缓冲区。

阅读全文 »

简述

Render passes, 即渲染过程。在完成创建管道之前,我们需要告诉Vulkan渲染时将使用的帧缓冲区附件。

我们需要指定将有多少颜色和深度缓冲区,为每个缓冲区使用多少个样本,以及在整个渲染操作中应如何处理它们的内容。

所有这些信息都包装在一个render pass对象中,为其创建一个新的createRenderPass函数。在createGraphicsPipeline之前从initVulkan调用此函数。

阅读全文 »