gpt4 book ai didi

c++ - 从 `binding` 到 `VkVertexInputBindingDescription` 的目的是什么?

转载 作者:可可西里 更新时间:2023-11-01 18:36:41 28 4
gpt4 key购买 nike

https://www.khronos.org/registry/vulkan/specs/1.0/man/html/VkVertexInputBindingDescription.html

  • binding is the binding number that this structure describes.

我不确定这意味着什么,例如 https://github.com/SaschaWillems/Vulkan/blob/master/triangle/triangle.cpp

    #define VERTEX_BUFFER_BIND_ID 0
....
vertices.inputAttributes[0].binding = VERTEX_BUFFER_BIND_ID;
vertices.inputAttributes[0].location = 0;
vertices.inputAttributes[0].format = VK_FORMAT_R32G32B32_SFLOAT;
vertices.inputAttributes[0].offset = offsetof(Vertex, position);
// Attribute location 1: Color
vertices.inputAttributes[1].binding = VERTEX_BUFFER_BIND_ID;
vertices.inputAttributes[1].location = 1;
vertices.inputAttributes[1].format = VK_FORMAT_R32G32B32_SFLOAT;
vertices.inputAttributes[1].offset = offsetof(Vertex, color);

顶点着色器看起来像这样

#version 450

#extension GL_ARB_separate_shader_objects : enable
#extension GL_ARB_shading_language_420pack : enable

layout (location = 0) in vec3 inPos;
layout (location = 1) in vec3 inColor;

layout (binding = 0) uniform UBO
{
mat4 projectionMatrix;
mat4 modelMatrix;
mat4 viewMatrix;
} ubo;

layout (location = 0) out vec3 outColor;

out gl_PerVertex
{
vec4 gl_Position;
};


void main()
{
outColor = inColor;
gl_Position = ubo.projectionMatrix * ubo.viewMatrix * ubo.modelMatrix * vec4(inPos.xyz, 1.0);
}

为什么 binding 为 0?什么时候它的值会不同于 0? 绑定(bind)的目的是什么?

我的第一个想法是它可能是 glsl 中的特殊限定符 https://www.opengl.org/wiki/Layout_Qualifier_(GLSL)#Binding_points .

但这似乎不适用于顶点输入限定符。

更新:

我想我已经弄明白绑定(bind)的目的是什么了

void vkCmdBindVertexBuffers(
VkCommandBuffer commandBuffer,
uint32_t firstBinding,
uint32_t bindingCount,
const VkBuffer* pBuffers,
const VkDeviceSize* pOffsets);

我假设您可以拥有一个具有某些支持状态的管道,但它仍然可以更改顶点输入布局,以便您可以在每个管道中使用不同的着色器。

然后 binding 只是一个唯一标识符,用于“动态”更改顶点布局。

最佳答案

I think I have figured out what the purpose of binding is

不,你还没有,但你已经接近了。

缓冲区绑定(bind)与使用 separate attribute formats 时的含义相同在 OpenGL 中。有属性位置和缓冲区绑定(bind)索引。每个属性位置都有定义如何解释其数据的格式和偏移量。但它还必须有一种方法来说明它使用哪个缓冲区。

在 Vulkan 中,对于特定管道,属性及其格式不可变。管道的属性格式是在创建时建立的,不能更改。但是,从中提取这些属性的缓冲区 是可变状态。它们在管道创建时不固定。

bindingvkCmdBindVertexBuffers 绑定(bind)的 pBuffers 数组的索引。每个顶点属性都有一个 binding 说明该属性从哪个缓冲区绑定(bind)索引获取数据。但是缓冲区本身 在创建时并未指定。您可以使用 vkCmdBindVertexBuffers 动态设置它。

所以属性的绑定(bind)值为equivalent to the binding value you provide to glVertexAttribBinding.

关于c++ - 从 `binding` 到 `VkVertexInputBindingDescription` 的目的是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40450342/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com