我的问题类似于这个问题但是(有用的)给定答案的一部分与基于OpenGL ES ESSL 3.10编写基于漏洞的GLSL不兼容.
为了在顶点着色器和片段着色器中使用推送常量存储器的单独部分,建议的解决方案是在推送常量结构的第一个成员之前使用布局(offset =#).
尝试在GLSL ES 310代码中执行此操作会导致错误"'块成员上的偏移':此配置文件不支持: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;
}
Run Code Online (Sandbox Code Playgroud)
然而,这不是:
#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;
}
Run Code Online (Sandbox Code Playgroud)
将我的所有310 ES着色器代码转换为430将解决我的问题,但这不是理想的.GL_ARB_enhanced_layouts不适用于310 ES代码,所以我的问题不是为什么它不起作用,而是我在ES中有任何选项来实现相同的目标吗?
如果您为 Vulkan 编译 SPIR-V,则着色器中会有一个“VULKAN”定义集(请参阅GL_KHR_VULKAN_glsl),因此您可以执行以下操作:
#ifdef VULKAN
layout(push_constant) uniform pushConstants {
vec4 (offset = 12) pos;
} pushConstBlock;
#else
// GLES stuff
#endif
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1226 次 |
最近记录: |