Vulkan中的抽奖活动之间的同步.据我了解,
Synchronization between drawcalls in Vulkan
,如果我有一个吸引人的呼吸呼叫,以某种方式使用任何以前的抽奖活动的结果或写入同一渲染目标(framebuffer(,那么我需要确保后来的抽奖活动看到了所有以前的抽奖活动的内存效果。
但是,当我呈现一个带有一堆对象的场景时,每个这样的对象都是一个绘图,所有这些绘图词都会写入同一framebuffer。
每次抽奖后我需要发出内存屏障吗?
例如,Sascha Willem的PBRBASIC示例具有此代码(有点简化(,我在那里看不到任何管道障碍:
VK_CHECK_RESULT(vkBeginCommandBuffer(drawCmdBuffers[i], &cmdBufInfo));
vkCmdBeginRenderPass(drawCmdBuffers[i], &renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
VkViewport viewport = vks::initializers::viewport((float)width, (float)height, 0.0f, 1.0f);
vkCmdSetViewport(drawCmdBuffers[i], 0, 1, &viewport);
VkRect2D scissor = vks::initializers::rect2D(width, height, 0, 0);
vkCmdSetScissor(drawCmdBuffers[i], 0, 1, &scissor);
VkDeviceSize offsets[1] = { 0 };
vkCmdBindPipeline(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
vkCmdBindDescriptorSets(drawCmdBuffers[i], VK_PIPELINE_BIND_POINT_GRAPHICS, pipelineLayout, 0, 1, &descriptorSet, 0, NULL);
vkCmdBindVertexBuffers(drawCmdBuffers[i], VERTEX_BUFFER_BIND_ID, 1, &models.objects[models.objectIndex].vertices.buffer, offsets);
vkCmdBindIndexBuffer(drawCmdBuffers[i], models.objects[models.objectIndex].indices.buffer, 0, VK_INDEX_TYPE_UINT32);
Material mat = materials[materialIndex];
for (uint32_t y = 0; y < GRID_DIM; y++) {
for (uint32_t x = 0; x < GRID_DIM; x++) {
glm::vec3 pos = glm::vec3(float(x - (GRID_DIM / 2.0f)) * 2.5f, 0.0f, float(y - (GRID_DIM / 2.0f)) * 2.5f);
vkCmdPushConstants(drawCmdBuffers[i], pipelineLayout, VK_SHADER_STAGE_VERTEX_BIT, 0, sizeof(glm::vec3), &pos);
mat.params.metallic = glm::clamp((float)x / (float)(GRID_DIM - 1), 0.1f, 1.0f);
mat.params.roughness = glm::clamp((float)y / (float)(GRID_DIM - 1), 0.05f, 1.0f);
vkCmdPushConstants(drawCmdBuffers[i], pipelineLayout, VK_SHADER_STAGE_FRAGMENT_BIT, sizeof(glm::vec3), sizeof(Material::PushBlock), &mat);
vkCmdDrawIndexed(drawCmdBuffers[i], models.objects[models.objectIndex].indexCount, 1, 0, 0, 0);
}
}
drawUI(drawCmdBuffers[i]);
vkCmdEndRenderPass(drawCmdBuffers[i]);
VK_CHECK_RESULT(vkEndCommandBuffer(drawCmdBuffers[i]));
是否有任何保证在逻辑上以逻辑上的吸引值会在逻辑上看到逻辑上的记忆效果?
所以问题是,我何时需要在不同的抽奖中同步?
使用任何先前的抽奖活动的结果或写入同一渲染目标
那是不是同一件事。就同步而言,渲染操作的副作用(您通过图像加载/商店或SSBO修改的东西(和写入Framebuffer的东西具有非常不同的需求。
固定功能操作导致为FrameBuffer编写值(剪刀测试,深度测试,混合等(的固定功能由栅格化顺序支配:它们必须在给定的原始且在给定的原始范围内,并以该特定的顺序进行,并且对于特定的样本,可能会写入框架缓冲区。而且,执行此类操作还必须尊重原始顺序:绘制命令生成的原始序列,以及 的绘制命令的顺序。
因此,就渲染而言,Draw呼叫将尊重同一子通道内的先前呼叫的结果(在子通道之间受到显式子通道依赖关系的约束(。您无需做任何特别的事情就可以使混合工作。如果您有两个重叠的三角形,而一个由原始顺序进行,则第二个抽奖的混合将使用第一个抽奖的结果。它只是有效的。
您的着色器的任何其他写作都需要明确同步。
相关文章:
- 正在尝试了解输入验证循环
- 了解 GLM- openGL 中的相机转换
- C++我需要了解在哪里使用指针和双指针
- 如何深入了解明显的腐败
- 松弛原子与无同步情况下的记忆连贯性
- 了解嵌套循环打印星号图案
- 使用QQuickFramebufferObject时同步数据的最佳方式是什么
- 在C++中同步线程
- 与 stdio 同步是否使程序 I/O 非交互式?
- 了解每月第一天函数的代码
- 了解C++标准::shared_ptr
- 如何在qt中同步应用程序和显示器的刷新率?
- 尝试了解在导入的静态方法上使用删除方法时的错误
- C++:需要帮助了解运算符重载错误
- Windows 进程间同步类似事件?
- 在学习数据结构之前对STL有一个了解是好的吗?
- 了解算法的性能差异(如果以不同的编程语言实现)
- 了解删除C++
- 了解内存序列和标准::memory_order_relaxed
- Vulkan中的抽奖活动之间的同步.据我了解,