gpt4 book ai didi

c++ - 如何将一组统一缓冲区对象加载到着色器中?

转载 作者:行者123 更新时间:2023-11-30 03:30:56 26 4
gpt4 key购买 nike

着色器代码:

// UBO for MVP matrices   
layout (binding = 0) uniform UniformBufferObject {
mat4 model;
mat4 view;
mat4 proj;
} ubo;

这很好用,因为它只有一个结构,我可以将 VkWriteDescriptorSet.descriptorCount 设置为 1。但是我如何创建这些结构的数组?

// Want to do something like this
// for lighting calculations
layout (binding = 2) uniform Light {
vec3 position;
vec3 color;
} lights[4];

我将所有四盏灯的数据存储在一个缓冲区中。当我将 VkWriteDescriptorSet.descriptorCount 设置为四时,我必须创建四个 VkDescriptorBufferInfo 吗?如果是这样,我不知道将什么放入偏移量和范围。

最佳答案

统一缓冲区数组中的所有 block 都位于相同的描述符中。但是,它们仍然是不同的 block ;他们得到一个不同的 VkDescriptorBufferInfo 信息对象。因此,这些 block 不必来自连续的存储区域。

注意:KHR_vulkan_glsl 扩展 gets this wrong ,如果你仔细看的话。它指出,不透明类型的数组应该放入单个描述符中,但接口(interface) block 的数组则不需要。实际的 glslangValidator 编译器(以及 SPIR-V 和 Vulkan)确实按照我的描述处理它。

但是,除了动态统一表达式之外,您不能使用任何其他方式访问接口(interface) block 数组的元素。甚至 that 也需要有特定的可用功能;如果没有该功能,您只能使用常量 表达式访问数组。

您可能想要的是 block 中的数组,而不是 block 的数组:

struct Light
{
vec4 position; //(NEVER use `vec3` in blocks)
vec4 color;
};

layout (set = 0, binding = 2, std140) uniform Lights {
Light lights[4];
};

这意味着您在绑定(bind)插槽 2 中有一个描述符(descriptorCount 为 1)。缓冲区的数据应该是 4 个顺序结构。

关于c++ - 如何将一组统一缓冲区对象加载到着色器中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44635221/

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