Как обнаружить в glsl, если фрагмент является мультисэмплированным? - PullRequest
2 голосов
/ 07 сентября 2010

Есть ли какой-нибудь быстрый (для производительности) способ обнаружить в glsl, если фрагмент был подвергнут мультисэмплингу, но во втором (легком) проходе с использованием текстур, где визуализирован 1-й проход.Или как opengl хранит информацию о мультисэмплинге?

Ответы [ 2 ]

2 голосов
/ 08 сентября 2010

Их несколько. Обычно проверяется, что текущие координаты (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

0 голосов
/ 07 сентября 2010

Мультисэмплинг активируется при создании контекста при выборе формата пикселя. После этого вы не можете его выключить или включить. Но когда вы рендеритесь в текстуру, OpenGL не будет использовать мультисэмплинг, независимо от настроек контекста.

http://www.opengl.org/wiki/Multisampling

...