gpt4 book ai didi

vulkan - 为 Vulkan 编译为 OpenGL ES 版本编写的 GLSL

转载 作者:行者123 更新时间:2023-12-04 15:19:50 31 4
gpt4 key购买 nike

我的问题类似于 this one但部分(有用的)给定答案与基于 OpenGL ES ESSL 3.10 为 vulkan 编译 GLSL 不兼容。

为了在顶点着色器和片段着色器中使用单独的推送常量内存部分,建议的解决方案是在推送常量结构的第一个成员之前使用 layout(offset = #)。

尝试在 GLSL ES 310 代码中执行此操作会导致错误“' block 成员偏移':此配置文件不支持:es”。

是否有支持的方式来声明与 es 兼容的这种偏移量?

我发现的唯一解决方法是在片段着色器中声明一堆虚拟变量。当我这样做时,如果我没有在 VkPipelineLayoutCreateInfo 中声明片段着色器的推送常量缓冲区的全部范围,我会收到验证层错误。修复该问题后,我收到有关“vkCreatePipelineLayout() 调用具有具有重叠范围的推送常量”的验证层警告。

显然我可以忽略警告,但如果有一个更整洁的解决方案,那会更可取。

简单示例,使用 VulkanSDK\1.0.13.0\Bin\glslangValidator.exe 编译成功:

#version 430
#extension GL_ARB_enhanced_layouts: enable

layout(std140, push_constant) uniform PushConstants
{
layout(offset=64) mat4 matWorldViewProj;
} ubuf;

layout(location = 0) in vec4 i_Position;

void main() {
gl_Position = ubuf.matWorldViewProj * i_Position;
}

而这不是:
#version 310 es
#extension GL_ARB_enhanced_layouts: enable

layout(std140, push_constant) uniform PushConstants
{
layout(offset=64) mat4 matWorldViewProj;
} ubuf;

layout(location = 0) in vec4 i_Position;

void main() {
gl_Position = ubuf.matWorldViewProj * i_Position;
}

将我所有的 310 ES 着色器代码转换为 430 可以解决我的问题,但这并不理想。 GL_ARB_enhanced_layouts 不适用于 310 ES 代码,所以我的问题不是为什么它不起作用,而是我在 ES 中是否有任何选项可以实现相同的目标?

最佳答案

我认为这是 GLSL 编译器中的错误。

正在发生的事情是这样的。为 Vulkan 编译 GLSL 会增加语言中的一些内容,如 defined by KHR_vulkan_glsl . push_constant例如,布局被显式添加到 GLSL 语法中。

但是,有些东西并没有添加到语言中。对您的用例来说重要的是能够将偏移量应用于统一 block 的成员。哦,是的,KHR_vulkan_glsl 在构建着色器的 block 布局时使用该信息。但是允许你说layout(offset=#)的语法由 GLSL 定义,而不是由 KHR_vulkan_glsl 定义。

并且该语法不是任何版本的 GLSL-ES 的一部分。我知道的任何 ES 扩展也没有提供它。所以你不能使用它。

我想说的是,在为 Vulkan 编译着色器时,引用编译器应该无法编译任何基于 GLSL-ES 的版本,或者默默地忽略任何版本和扩展声明,并假设桌面 GLSL 4.50。

至于你能做些什么……没什么。除非您自己将该解决方案破解到编译器中,否则您的主要解决方案是针对桌面 OpenGL 版本编写代码。像4.50。

关于vulkan - 为 Vulkan 编译为 OpenGL ES 版本编写的 GLSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37885164/

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