首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于均匀缓冲区的Vulkan内存对齐

用于均匀缓冲区的Vulkan内存对齐
EN

Stack Overflow用户
提问于 2020-08-14 20:31:28
回答 2查看 573关注 0票数 1

我正在关注在线教程:vulkan-tutorial,其中作者添加了描述符池和描述符集的功能。

我使用的是Vulkan v1.2.135.0,而我的着色器设置为#version 450

我几乎完成了教程的这一部分,我能够渲染一个旋转的正方形,当我在Debug模式下编译和运行时,我从Vulkan层中没有得到任何错误。

我在上面的链接提供的页面底部附近,他在UniformBufferOjbect结构中引入了一个glm::vec2,在shader.vert中的相同对应结构中引入了一个vec2

他改变了这些:

代码语言:javascript
复制
// Defined in C++ file
struct UniformBufferObject {
    glm::mat4 model;
    glm::mat4 view;
    glm::mat4 proj;
};

// Defined in shader.vert
layout(binding = 0) uniform UniformBufferObject {
    mat4 model;
    mat4 view;
    mat4 proj;
} ubo;

设置为以下内容:

代码语言:javascript
复制
// Defined in C++ file
struct UniformBufferObject {
    glm::vec2 foo;
    glm::mat4 model;
    glm::mat4 view;
    glm::mat4 proj;
};

// Defined in shader.vert
layout(binding = 0) uniform UniformBufferObject {
    vec2 foo;
    mat4 model;
    mat4 view;
    mat4 proj;
} ubo;

我遵循了示例,并使用提供的工具重新编译着色器,将其转换为SPV二进制文件。正如他建议的那样,屏幕上没有任何渲染,因为这与Vulkan需要的memory-alignment有关……

他通过说明如何解决此问题来简要说明内存对齐问题。他建议做两件事。第一种是使用C++11或更大的alignas(16)修饰符。

然后他指出,如果我们要将UniformBufferObject更改为以下内容:

代码语言:javascript
复制
// Defined in C++ file
struct UniformBufferObject {
    glm::vec2 foo;
    alignas(16) glm::mat4 model;
    glm::mat4 view;
    glm::mat4 proj;
};

然后编译并再次运行程序,使其能够正确呈现,但是,我仍然得到一个黑屏。

他还建议在包含它的头文件之前使用glm#define GLM_FORCE_DEFAULT_ALIGNED_GENTYPES指令,它仍然没有渲染任何东西到屏幕上……

我甚至将UniformBufferObject修改为:

代码语言:javascript
复制
// Defined in C++ file
struct UniformBufferObject {
    glm::vec2 foo;
    alignas(16) glm::mat4 model;
    alignas(16) glm::mat4 view;
    alignas(16) glm::mat4 proj;
};

尽管如此,还是没有任何东西被渲染。我不知道为什么这不能像教程中建议的那样工作。

EN

回答 2

Stack Overflow用户

发布于 2020-08-21 03:13:36

从个人经验来看,UBO结构应该是向量4对齐的。结构的第一个字段打破了这种对齐方式。

最快的(最)修复方法是

代码语言:javascript
复制
struct UniformBufferObject {
    glm::vec4 foo;
    glm::mat4 model;
    glm::mat4 view;
    glm::mat4 proj;
};

在着色器中,只需使用ubo.foo.xy swizzle获取vec2即可。

当然,着色器代码也应该修改为

代码语言:javascript
复制
layout(binding = 0) uniform UniformBufferObject {
    vec4 foo;
    mat4 model;
    mat4 view;
    mat4 proj;
} ubo;
票数 0
EN

Stack Overflow用户

发布于 2020-09-08 01:31:36

vec2的对齐方式必须为8

  • a a of 4
    • a vec2 a alignement of 8
    • a vec3,vec4,mat4 an alignement of 16

你必须像这样纠正:

代码语言:javascript
复制
struct UniformBufferObject {
    alignas(8) glm::vec2 foo;
    alignas(16) glm::mat4 model;
    alignas(16) glm::mat4 view;
    alignas(16) glm::mat4 proj;
};

UBO使用规则std140,您可以检查此规则以了解如何处理它:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63412818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档