我发现在集成的英特尔视频卡上运行包含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()
答案 0 :(得分:0)
对我来说,这似乎是图形驱动程序或硬件错误-从规范的角度来看,您所做的工作没有错。