集成视频卡上的Vulkan细分控制着色器中的barrier()函数问题

时间:2019-06-15 00:16:40

标签: glsl vulkan tessellation

我发现在集成的英特尔视频卡上运行包含barrier()调用的镶嵌控制着色器不会产生几何图形(????)

例如,下面的简单着色器可以在我专用的Nvidia卡上很好地工作,但不适用于Intel:

#version 450 core

layout (vertices = 4) out;

void main() {
    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
    gl_TessLevelInner[0] = 1;
    gl_TessLevelInner[1] = 1;
    gl_TessLevelOuter[0] = 1;
    gl_TessLevelOuter[1] = 1;
    gl_TessLevelOuter[2] = 1;
    gl_TessLevelOuter[3] = 1;
    barrier();
}

但是,没有barrier()调用的相同代码也可以在Intel卡上工作。

如果有人能猜出在哪里寻找问题的原因,将不胜感激

更新

发现在barrier()之前调用gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;时,一切正常,所以我只需要将此语句移到末尾即可。

#version 450 core

layout (vertices = 4) out;

void main() {
    gl_TessLevelInner[0] = 1;
    gl_TessLevelInner[1] = 1;
    gl_TessLevelOuter[0] = 1;
    gl_TessLevelOuter[1] = 1;
    gl_TessLevelOuter[2] = 1;
    gl_TessLevelOuter[3] = 1;
    barrier();
    gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position;
}

这种行为对我来说仍然不清楚,所以如果有人可以向我解释它,那太酷了,为什么我不应该在gl_out之前写信给barrier()

1 个答案:

答案 0 :(得分:0)

对我来说,这似乎是图形驱动程序或硬件错误-从规范的角度来看,您所做的工作没有错。