Vulkan Tutorial 09 图像与视图

操作系统:Windows8.1

显卡:Nivida GTX965M

开发工具:Visual Studio 2017



使用任何的VkImage,包括在交换链或者渲染管线中的,我们都需要创建VkImageView对象。从字面上理解它就是一个针对图像的视图或容器,通过它具体的渲染管线才能够读写渲染数据,换句话说VkImage不能与渲染管线进行交互。除此之外,图像视图可以进一步定义具体Image的格式,比如定义为2D贴图,那么本质上就不需要任何级别的mipmapping。

在本章节我们会新增一个createImageViews函数,为每一个交换链中的图像创建基本的视图,这些视图在后面的内容中会被作为颜色目标与渲染管线配合使用。

首先添加一个类成员用于保存图像视图的句柄集:

std::vector<VkImageView> swapChainImageViews;

创建createImagesViews函数,并在创建交换链完成之后调用:

void initVulkan() {
    createInstance();
    setupDebugCallback();
    createSurface();
    pickPhysicalDevice();
    createLogicalDevice();
    createSwapChain();
    createImageViews();
}

void createImageViews() {

}

我们需要做的第一件事情需要定义保存图像视图集合的大小:

void createImageViews() {
    swapChainImageViews.resize(swapChainImages.size());

}

下一步,循环迭代所有的交换链图像。

for (size_t i = 0; i < swapChainImages.size(); i++) {

}

创建图像视图的参数被定义在VkImageViewCreateInfo结构体中。一些参数的填充非常直接。

VkImageViewCreateInfo createInfo = {};
createInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
createInfo.image = swapChainImages[i];

其中viewTypeformat字段用于描述图像数据该被如何编解码。viewType参数允许将图像定义为1D textures, 2D textures, 3D textures 和cube maps。

createInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
createInfo.format = swapChainImageFormat;

components字段允许调整颜色通道的最终的映射逻辑。比如,我们可以将所有颜色通道映射为红色通道,以实现单色纹理。我们也可以将通道映射具体的常量数值01。在章节中我们使用默认的映射策略。

createInfo.components.r = VK_COMPONENT_SWIZZLE_IDENTITY;
createInfo.components.g = VK_COMPONENT_SWIZZLE_IDENTITY;
createInfo.components.b = VK_COMPONENT_SWIZZLE_IDENTITY;
createInfo.components.a = VK_COMPONENT_SWIZZLE_IDENTITY;

subresourceRangle字段在于描述图像可以被访问的有效范围。比如图像将会作为color targets,并支持任何mipmapping levels或是任意arrayLayer counts供渲染管线操作。

createInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
createInfo.subresourceRange.baseMipLevel = 0;
createInfo.subresourceRange.levelCount = 1;
createInfo.subresourceRange.baseArrayLayer = 0;
createInfo.subresourceRange.layerCount = 1;

如果在编写沉浸式的3D应用程序,比如VR,就需要创建支持多层的交换链。并且通过不同的层为每一个图像创建多个视图,以满足不同层的图像在左右眼渲染时对视图的需要。

创建图像视图调用vkCreateImageView函数:

if (vkCreateImageView(device, &createInfo, nullptr, &swapChainImageViews[i]) != VK_SUCCESS) {
    throw std::runtime_error("failed to create image views!");
}

与图像不同的是,图像视图比如明确的手动创建,所以在程序退出的时候,我们需要添加一个循环去销毁他们。

void cleanup() {
    for (size_t i = 0; i < swapChainImageViews.size(); i++) {
        vkDestroyImageView(device, swapChainImageViews[i], nullptr);
    }

    ...
}

对于视图来,使用图像作为贴图已经足够,但是它还没有准备好作为渲染target。它需要更多的步骤去准备,其中一个就是framebuffer,帧缓冲。所以接下来我们深入了解Vulkan中的渲染管线。

时间: 2024-11-08 18:47:10

Vulkan Tutorial 09 图像与视图的相关文章

Vulkan Tutorial 18 重构交换链

操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Introduction 现在我们已经成功的在屏幕上绘制出三角形,但是在某些情况下,它会出现异常情况.窗体surface会发生改变,使得交换链不在于其兼容.可能导致这种情况发生的原因之一是窗体的大小变化.我们必须在这个时机重新创建交换链. Recreating the swap chain 添加新的函数recreateSwapChain并调用createSwapChain及依赖于交

Vulkan Tutorial 05 物理设备与队列簇

操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Selecting a physical device 通过VkInstance初始化Vulkan后,我们需要在系统中查找并选择一个支持我们所需功能的显卡.实际上,我们可以选择任意数量的显卡并同时使用他们,但在本小节中,我们简单的设定选择规则,即将查找到的第一个图形卡作为我们适合的物理设备. 我们添加函数pickPhysicalDevice并在initVulkan函数中调用. vo

Vulkan Tutorial 24 Descriptor pool and sets

操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Introduction 描述符布局描述了前一章节讨论过的可以绑定的描述符的类型.在本章节,我们创建描述符集,它将实际指定一个VkBuffer来绑定到一个uniform buffer描述符. Descriptor pool 描述符集合不能集合创建,它们必须像命令缓冲区一样,从对象池中分配使用.对于描述符集合相当于调用描述符对象池.我们将写一个新的函数createDescriptor

Vulkan Tutorial 15 Framebuffers

操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 我们在前面的章节中已经讨论了很多次framebuffers帧缓冲区,到目前为止我们配置了render pass渲染通道并希望输出一个与交换链图像格式一致的帧缓冲区,但是我们实际上还没有创建. 在render pass创建阶段我们指定了具体的附件,并通过VkFramebuffer对象包装绑定.帧缓冲区对象引用表示为附件的所有的VkImageView对象.在我们的例子中只会使用一个帧缓

Vulkan Tutorial 13 Render passes

操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Setup 在我们完成管线的创建工作,我们接下来需要告诉Vulkan渲染时候使用的framebuffer帧缓冲区附件相关信息.我们需要指定多少个颜色和深度缓冲区将会被使用,指定多少个采样器及如何在整个渲染操作中处理它们.所有的这些信息都被封装在一个叫做render pass的对象中,我们新添加一个createRenderPass函数.在initVulkan函数中确保createGr

Vulkan Tutorial 12 Fixed functions

操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 早起的图形API在图形渲染管线的许多阶段提供了默认的状态.在Vulkan中,从viewport的大小到混色函数,需要凡事做到亲历亲为.在本章节中我们会填充有关固有功能操作的所有结构体. Vertex input VkPipelineVertexInputStateCreateInfo结构体描述了顶点数据的格式,该结构体数据传递到vertex shader中.它以两种方式进行描述:

Vulkan Tutorial 08 交换链

操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 在这一章节,我们了解一下将渲染图像提交到屏幕的基本机制.这种机制成为交换链,并且需要在Vulkan上下文中被明确创建.从屏幕的角度观察,交换链本质上是一个图像队列.应用程序作为生产者会获取图像进行绘制,然后将其返还给交换链图像队列,等待屏幕消费.交换链的具体配置信息决定了应用程序提交绘制图像到队列的条件以及图像队列表现的效果,但交换链的通常使用目的是使绘制图像的最终呈现与屏幕的刷新

Vulkan Tutorial 29 Loading models

操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 Introduction 应用程序现在已经可以渲染纹理3D模型,但是 vertices 顶点和 indices 索引数组中的几何体不是很有趣.在本章节我们扩展程序,从实际的模型文件冲加载顶点和索引数据,并使图形卡实际做一些工作. 许多图形API系列教程中让读者在这样的章节中编写自己的OBJ加载程序.这样做的问题是任何有趣的3D应用程序很快需要某种功能,但是该文件格式不支持,比如骨骼

Vulkan Tutorial 11 Shader modules

操作系统:Windows8.1 显卡:Nivida GTX965M 开发工具:Visual Studio 2017 与之前的图像API不同,Vulkan中的着色器代码必须以二进制字节码的格式使用,而不是像GLSL和HLSL这样具有比较好的可读性的语法.此字节格式成为SPIR-V,它可以与Vulkan和OpenCL一同使用.这是一种可以编写图形和计算着色器的格式,但我们重点介绍本教程中Vulkan图形流水线使用的着色器. 使用二进制字节码格式的优点之一是 使得GPU厂商编写将着色器代码转换为本地代