Поиск текстуры в визуализированном FBO отключен на половину пикселя

У меня есть сцена, которая визуализируется в текстуру с помощью FBO, и я отбираю ее из фрагментного шейдера, рисуя ее области с помощью примитивов, а не рисую полноэкранный четырехугольник: Я экономлю ресурсы, создавая только те фрагменты, которые мне нужны.

Чтобы проверить это, я создаю ту же геометрию, что и моя текстура-рендеринг, что означает, что созданный шаблон растеризации должен быть точно таким же: когда мой фрагментный шейдер просматривает свою текстуру с переменными координатами, которые ему были заданы, он должен идеально совпадают с другими значениями, которые ему были даны.

Вот как я задаю своему фрагментному шейдеру координаты для автоматического текстурирования геометрии с моей полноэкранной текстурой:

// Vertex shader
uniform mat4 proj_modelview_mat;
out vec2 f_sceneCoord;
void main(void) {
    gl_Position = proj_modelview_mat * vec4(in_pos,0.0,1.0);
    f_sceneCoord = (gl_Position.xy + vec2(1,1)) * 0.5;
}

Я работаю в 2D, поэтому я не беспокоился о разделении перспективы здесь. Я просто установил значение sceneCoord, используя положение в пространстве клипа, уменьшенное с [-1,1] до [0,1].

uniform sampler2D scene;
in vec2 f_sceneCoord;
//in vec4 gl_FragCoord;
in float f_alpha;   
out vec4 out_fragColor;
void main (void) {
    //vec4 color = texelFetch(scene,ivec2(gl_FragCoord.xy - vec2(0.5,0.5)),0);
    vec4 color = texture(scene,f_sceneCoord);
    if (color.a == f_alpha) {
        out_fragColor = vec4(color.rgb,1);
    } else
        out_fragColor = vec4(1,0,0,1);
}

Обратите внимание, я выплевываю красный фрагмент, если мой альфа не совпадает. Визуализация текстуры устанавливает альфа-канал для каждого визуализированного объекта на определенный индекс, поэтому я знаю, что с чем совпадает.

Извините, у меня нет изображения, чтобы показать, но очень ясно, что мои пиксели смещены на (0.5,0.5) : я получаю тонкую красную рамку в один пиксель вокруг моих объектов, на их нижняя и левая стороны, которые выскакивают и выскакивают. Это довольно «преходящий» вид.Плюс в том, что он отображается только на нижней и левой сторонах объектов.

Обратите внимание, у меня есть закомментированная строка, в которой используется texelFetch : Этот метод работает, и мои красные фрагменты больше не отображаются. Однако я бы хотел, чтобы это работало правильно с текстурой и нормализованными координатами текстуры, потому что я думаю, что большее оборудование будет поддерживать это. Возможно, реальный вопрос заключается в том, можно ли сделать это правильно, не отправляя разрешение моего окна просмотра через униформу? Должен быть способ избежать этого!

Обновление: я попытался сместить доступ к текстуре на полпикселя, четверть пикселя, одну сотую пикселя, все стало еще хуже и произвело сплошную границу с неправильными значениями по краям: похоже, мой gl_Position.xy + vec2 (1,1)) * 0.5 трюк устанавливает правильные значения, но выборка немного не работает. Это довольно странно ... Видите красные фрагменты? Когда объекты находятся в движении, они очень немного мерцают. Это означает, что установленные мной альфа-значения не совпадают идеально на этих пикселях.

transient red fragments indicate a texture sampling mis-match

Для меня не критично добиться идеальной точности пикселей для этой проверки альфа-индекса для моего реального приложения, но такое поведение просто не то, что я ожидал.

5
задан Steven Lu 16 January 2012 в 17:48
поделиться