[译]Vulkan教程(17)帧缓存
[译]Vulkan教程(17)帧缓存
Framebuffers 帧缓存
We've talked a lot about framebuffers in the past few chapters and we've set up the render pass to expect a single framebuffer with the same format as the swap chain images, but we haven't actually created any yet.
我们在过去的章节谈论过很多次帧缓存了,我们已经设置了render pass,希望有一个帧缓存with与交换链image相同的格式,但是我们还没有创建帧缓存。
The attachments specified during render pass creation are bound by wrapping them into a VkFramebuffer
object. A framebuffer object references all of the VkImageView
objects that represent the attachments. In our case that will be only a single one: the color attachment. However, the image that we have to use for the attachment depends on which image the swap chain returns when we retrieve one for presentation. That means that we have to create a framebuffer for all of the images in the swap chain and use the one that corresponds to the retrieved image at drawing time.
在创建render pass时指定的附件,通过一个VkFramebuffer
对象关联起来。帧缓存对象引用所有的VkImageView
对象that代表附件。在我们的案例中只有1个,即颜色附件。但是,用作附件的image依赖于交换链返回哪个image when我们检索一个for呈现。这意味着,我们必须创建一个帧缓存for交换链的每个image,在绘制时使用与检索到的image对应的那个帧缓存。
To that end, create another std::vector
class member to hold the framebuffers:
为此,创建另一个类成员std::vector
to记录这些帧缓存。
std::vector<VkFramebuffer> swapChainFramebuffers;
We'll create the objects for this array in a new function createFramebuffers
that is called from initVulkan
right after creating the graphics pipeline:
我们将为此数组创建对象在新函数createFramebuffers
that被initVulkan
调用after创建图形管道:
void initVulkan() {
createInstance();
setupDebugCallback();
createSurface();
pickPhysicalDevice();
createLogicalDevice();
createSwapChain();
createImageViews();
createRenderPass();
createGraphicsPipeline();
createFramebuffers();
} ... void createFramebuffers() { }
Start by resizing the container to hold all of the framebuffers:
开始,调整容器大小to记录所有的帧缓存:
void createFramebuffers() {
swapChainFramebuffers.resize(swapChainImageViews.size());
}
We'll then iterate through the image views and create framebuffers from them:
然后我们遍历image视图,为它们创建帧缓存:
for (size_t i = ; i < swapChainImageViews.size(); i++) {
VkImageView attachments[] = {
swapChainImageViews[i]
}; VkFramebufferCreateInfo framebufferInfo = {};
framebufferInfo.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
framebufferInfo.renderPass = renderPass;
framebufferInfo.attachmentCount = ;
framebufferInfo.pAttachments = attachments;
framebufferInfo.width = swapChainExtent.width;
framebufferInfo.height = swapChainExtent.height;
framebufferInfo.layers = ; if (vkCreateFramebuffer(device, &framebufferInfo, nullptr, &swapChainFramebuffers[i]) != VK_SUCCESS) {
throw std::runtime_error("failed to create framebuffer!");
}
}
As you can see, creation of framebuffers is quite straightforward. We first need to specify with which renderPass
the framebuffer needs to be compatible. You can only use a framebuffer with the render passes that it is compatible with, which roughly means that they use the same number and type of attachments.
如你所见,帧缓存的创建过程是十分直观的。我们首先要指定帧缓存需要与哪个renderPass
兼容。你只能用与render pass兼容的帧缓存,基本上意思是它们的附件的数量和类型相同。
The attachmentCount
and pAttachments
parameters specify the VkImageView
objects that should be bound to the respective attachment descriptions in the render pass pAttachment
array.
attachmentCount
和pAttachments
参数指定VkImageView
对象that应当被绑定到相应的附件描述信息in render pass pAttachment
数组。
The width
and height
parameters are self-explanatory and layers
refers to the number of layers in image arrays. Our swap chain images are single images, so the number of layers is 1
.
width
和height
参数是不言自明的,layers
指image数组中的layer的数量。我们的交换链image是单image,所以layer数量为1
。
We should delete the framebuffers before the image views and render pass that they are based on, but only after we've finished rendering:
我们应当在删除image视图和render pass之前删除帧缓存,但是要在完成渲染之后:
void cleanup() {
for (auto framebuffer : swapChainFramebuffers) {
vkDestroyFramebuffer(device, framebuffer, nullptr);
} ...
}
We've now reached the milestone where we have all of the objects that are required for rendering. In the next chapter we're going to write the first actual drawing commands.
我们现在到达了一个里程碑where我们有了所有的对象that被要求用于渲染。下一章我们要写第一个实际的绘制命令。
C++ code / Vertex shader / Fragment shader
[译]Vulkan教程(17)帧缓存的更多相关文章
- [译]Vulkan教程(33)多重采样
[译]Vulkan教程(33)多重采样 Multisampling 多重采样 Introduction 入门 Our program can now load multiple levels of d ...
- [译]Vulkan教程(30)深度缓存
[译]Vulkan教程(30)深度缓存 Depth buffering 深度缓存 Introduction 入门 The geometry we've worked with so far is pr ...
- [译]Vulkan教程(29)组合的Image采样器
[译]Vulkan教程(29)组合的Image采样器 Combined image sampler 组合的image采样器 Introduction 入门 We looked at descripto ...
- [译]Vulkan教程(28)Image视图和采样器
[译]Vulkan教程(28)Image视图和采样器 Image view and sampler - Image视图和采样器 In this chapter we're going to creat ...
- [译]Vulkan教程(25)描述符布局和buffer
[译]Vulkan教程(25)描述符布局和buffer Descriptor layout and buffer 描述符布局和buffer Introduction 入门 We're now able ...
- [译]Vulkan教程(20)重建交换链
[译]Vulkan教程(20)重建交换链 Swap chain recreation 重建交换链 Introduction 入门 The application we have now success ...
- [译]Vulkan教程(19)渲染和呈现
[译]Vulkan教程(19)渲染和呈现 Rendering and presentation 渲染和呈现 Setup 设置 This is the chapter where everything ...
- [译]Vulkan教程(18)命令buffers
[译]Vulkan教程(18)命令buffers Command buffers 命令buffer Commands in Vulkan, like drawing operations and me ...
- [译]Vulkan教程(16)图形管道基础之总结
[译]Vulkan教程(16)图形管道基础之总结 Conclusion 总结 We can now combine all of the structures and objects from the ...
随机推荐
- docker-网络管理-桥接网络
一.配置桥接网络 需求:为了使本地网络中的机器和Docker容器更方便的通信,我们经常会有将Docker容器配置到和主机同一网段的需求.这个需求其实很容易实现,我们只要将Docker容器和宿主机的 ...
- 自动化运维之SaltStack实践
自动化运维之SaltStack实践 1.1.环境 linux-node1(master服务端) 192.168.0.15 linux-node2(minion客户端) 192.168.0.16 1.2 ...
- 【Maven】聚合
[Maven]聚合 转载: 使用聚合一次能为多个 maven 项目执行命令,而不用到每一个项目下去执行命令. 聚合 pom 的特殊之处 1.packaging 配置 pom <packaging ...
- 搞清楚Spring Cloud架构原理的这4个点,轻松应对面试
前言 现在分布式系统基本上都是标配了,如果你现在还在玩儿单机,没有接触过这些东西的话,权当是为你打开一扇新的大门吧. 大的单体项目 以前我们做单机系统的时候,所有的代码都在一个项目里面,只是不同的模块 ...
- poj 2823 Sliding Windows (单调队列+输入输出挂)
Sliding Window Time Limit: 12000MS Memory Limit: 65536K Total Submissions: 73426 Accepted: 20849 ...
- EF Core 基础知识
数据库连接字符串 在 ASP.NET Core 添加配置片段: { "ConnectionStrings": { "BloggingDatabase": &qu ...
- Java 匿名类和lambda表达式
一.匿名内部类 一个匿名内部类是一个没有名字的内部类.它将进一步定义一个内部类以及创建一个内部类的实例. 内部类处理器可以使用匿名内部类进行代码简化. 匿名内部类的语法如下所示: new SuperC ...
- 如何入侵SF服务器/充当GM刷元宝
首要作者本人要声明一下,写下此文章技术不是教你去黑传奇SF,只是想以本文引起4F拥有者的留意方案,哈哈. 如何入侵传奇SF刷元宝,首先要温故下自己的专业技术水平. 我也非常喜欢玩游戏,但却玩得特别菜, ...
- vue解惑之slot(插槽)
一.插槽是个什么玩意,能吃吗 在vue中[插槽],从字面意思来看,插槽意味着[内容的增加],回到vue的使用场景,插槽就是[父组件调用子组件时,额外增加的内容]. 插槽显不显示.显示的内容是由父组件来 ...
- spring boot 2 + shiro 实现简单的身份验证例子
Shiro是一个功能强大且易于使用的Java安全框架,官网:https://shiro.apache.org/. 主要功能有身份验证.授权.加密和会话管理.其它特性有Web支持.缓存.测试支持.允许一 ...