Их несколько. Обычно проверяется, что текущие координаты (gl_FragCoord) равны (0,5, 0,5). Если это так, это означает, что вы находитесь в середине многоугольника: выборка выполняется только один раз.
Если это не так, это, вероятно, один из 4 (для 4xMSAA) повернутых квадратных углов: вы на грани, и openGL обнаружил, что одного образца недостаточно.
См. Также http://www.opengl.org/pipeline/article/vol003_6/
Чтобы иметь эту информацию во втором проходе, вам, однако, придется хранить ее в g-буфере.
РЕДАКТИРОВАТЬ: Вот фрагмент кода, который я только что сделал. Протестировано на gtx 470 с текстурой 424MSAA 1024x1024.
Вершинный шейдер:
#version 400 core
uniform mat4 MVP;
noperspective centroid out vec2 posCentroid;
layout(location = 0) in vec4 Position;
void main(){
gl_Position = MVP * Position;
posCentroid = (gl_Position.xy / gl_Position.w)*512; // there is a factor two compared to 1024 because normalized coordinates have range [-1,1], not [0,1]
}
Фрагмент шейдера:
#version 400 core
out vec4 color;
noperspective centroid in vec2 posCentroid;
void main()
{
if (abs(fract(posCentroid.x) - 0.5) < 0.01 && abs(fract(posCentroid.y) - 0.5) < 0.01){
color = vec4(1,0,0,0);
}else{
color = vec4(0,1,0,0);
}
}
Края зеленые, центр многоугольника красный.
Для вашего оригинального вопроса, я рекомендую вам эту статью: http://www.gamasutra.com/view/feature/3591/resolve_your_resolves.php