我正在关注在线教程:vulkan-tutorial,其中作者添加了描述符池和描述符集的功能。
我使用的是Vulkan v1.2.135.0,而我的着色器设置为#version 450
我几乎完成了教程的这一部分,我能够渲染一个旋转的正方形,当我在Debug模式下编译和运行时,我从Vulkan层中没有得到任何错误。
我在上面的链接提供的页面底部附近,他在UniformBufferOjbect结构中引入了一个glm::vec2,在shader.vert中的相同对应结构中引入了一个vec2。
他改变了这些:
// 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;设置为以下内容:
// 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更改为以下内容:
// 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修改为:
// Defined in C++ file
struct UniformBufferObject {
glm::vec2 foo;
alignas(16) glm::mat4 model;
alignas(16) glm::mat4 view;
alignas(16) glm::mat4 proj;
};尽管如此,还是没有任何东西被渲染。我不知道为什么这不能像教程中建议的那样工作。
发布于 2020-08-21 03:13:36
从个人经验来看,UBO结构应该是向量4对齐的。结构的第一个字段打破了这种对齐方式。
最快的(最)修复方法是
struct UniformBufferObject {
glm::vec4 foo;
glm::mat4 model;
glm::mat4 view;
glm::mat4 proj;
};在着色器中,只需使用ubo.foo.xy swizzle获取vec2即可。
当然,着色器代码也应该修改为
layout(binding = 0) uniform UniformBufferObject {
vec4 foo;
mat4 model;
mat4 view;
mat4 proj;
} ubo;发布于 2020-09-08 01:31:36
vec2的对齐方式必须为8
你必须像这样纠正:
struct UniformBufferObject {
alignas(8) glm::vec2 foo;
alignas(16) glm::mat4 model;
alignas(16) glm::mat4 view;
alignas(16) glm::mat4 proj;
};UBO使用规则std140,您可以检查此规则以了解如何处理它:)
https://stackoverflow.com/questions/63412818
复制相似问题