Я обнаружил, что запущенный шейдер управления тесселяцией, который содержит вызов barrier()
на моей интегрированной видеокарте Intel, не дает геометрии (????)
Так, например, следующий простой шейдер хорошо работает на моемвыделенная карта 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()