# vulkan **Repository Path**: TOPthemaster/vulkan ## Basic Information - **Project Name**: vulkan - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2024-01-05 - **Last Updated**: 2024-03-08 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # vulkan tutorial 学习记录 2024_01_05 统一缓冲区 将之前的顶点缓冲区设置改造 ## 字节对齐 如果在MVP基础上定义一个foo 重新编译后会存在无法显示图像的问题, 重新编译你的着色器和程序并运行它,你会发现你到目前为止工作的彩色方块已经消失了!那是因为我们没有考虑到对齐要求。 ```c++ struct UniformBufferObject { glm::vec2 foo; glm::mat4 model; glm::mat4 view; glm::mat4 proj; }; layout(binding = 0) uniform UniformBufferObject { vec2 foo; mat4 model; mat4 view; mat4 proj; } ubo; ``` Vulkan 希望结构中的数据以特定方式在内存中对齐,例如: 标量必须按 N 对齐(= 4 个字节,给定 32 位浮点数)。 Avec2必须对齐 2N(= 8 字节) A vec3orvec4必须对齐 4N(= 16 字节) 嵌套结构必须按照其成员的基本对齐方式进行对齐,四舍五入到 16 的倍数。 矩阵mat4必须与 具有相同的对齐方式vec4。 您可以在规范中找到对齐要求的完整列表。 我们最初只有三个mat4字段的着色器已经满足了对齐要求。因为每个mat4大小都是 4 x 4 x 4 = 64 字节,model偏移量为0,view偏移量为 64,proj偏移量为 128。所有这些都是 16 的倍数,这就是它工作正常的原因。 新结构以 a 开头vec2,大小只有 8 个字节,因此会丢弃所有偏移量。现在model有一个偏移量8、view一个偏移量72和proj一个偏移量136,它们都不是 16 的倍数。为了解决这个问题,我们可以使用alignasC++11 中引入的说明符: ```c++ struct UniformBufferObject { glm::vec2 foo; glm::mat4 model; glm::mat4 view; glm::mat4 proj; }; layout(binding = 0) uniform UniformBufferObject { vec2 foo;//8字节 alignas(16)mat4 model; 强制model从15字节开始,如果不使用该关键字,其会在8字节后偏移。 mat4 view; mat4 proj; } ubo; ``` 如果不使用嵌套,则可以直接在GLM引入之前定义 `#define GLM_FORCE_RADIANS #define GLM_FORCE_DEFAULT_ALIGNED_GENTYPES `