Есть ли какой-либо быстрый (для производительности) способ обнаружения в glsl, если фрагмент был мультисэмплирован, а во втором (световом) проходе, используя текстуры, где был обработан 1-й проход. Или как opengl хранит информацию о мультисэмплинге?Как обнаружить в glsl, если фрагмент мультисэмплирован?
ответ
Они несколько. Обычным является проверка координат тока (gl_FragCoord): (0,5, 0,5). Если это так, это означает, что вы находитесь в середине полигона: он отбирается только один раз.
Это не так, это, вероятно, один из 4-х (4xMSAA) поворотных квадратов-углов: вы находитесь на грани, и openGL обнаружил, что одного образца недостаточно.
Смотрите также http://www.opengl.org/pipeline/article/vol003_6/
Для того, чтобы иметь эту информацию во втором проходе, вы должны хранить его в г-буфере, хотя.
EDIT: Вот фрагмент кода, который я только что сделал. Протестировано на gtx 470 с текстурой 4xMSAA 1024x1024.
Vertex шейдеров:
#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
gl_FragCoord - позиция [0, screen_size]. Я пытался обнаружить относительное положение этого кода (vec2 а = gl_FragCoord.xy - пол (gl_FragCoord.xy);! \t если (ах = 0,5 && ау = 0,5) \t \t gl_FragColor = vec4 (1,0 , 0,1); \t еще { \t \t gl_FragColor = vec4 (0,1,0,1); \t}), но это не работает – kravemir
это нормально. Вы должны использовать переменную центра тяжести (gl_FragCoord не является центроидом). Я должен проверить это, я вернусь к вам, когда я знаю, как это сделать. – Calvin1602
@Miro http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=277450 Так что-то вроде: VS -> out centroid fragcoord; main() {fragcoord = MVP * in_Position; fragcoord.xy/= fragcoord.w;} и FS -> что вы сделали, но с fragcoord – Calvin1602
Мультисэмплинг активируется при создании contex при выборе формата пикселей. После этого вы не можете отключить его или включить. Но когда вы визуализируете текстуру, OpenGL не будет использовать мультисэмплинг, независимо от того, какая настройка для контекса.
Почему вы хотите, чтобы обнаружить, что в вашем GLSL фрагмент программы? Будет проще иметь два разных шейдера: один, когда мультисэмплинс включен, а другой - когда он выключен, поэтому нет необходимости проверять его во время рендеринга и никаких накладных расходов на тестирование. – tibur
Для более низкого использования памяти в отложенном рендеринге. Когда фрагмент мультисэмплирован, тогда выполняйте подсветку для всех выборочных, если не тогда, только для одного образца. – kravemir