У меня есть сцена, которая визуализируется в текстуру с помощью 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
трюк устанавливает правильные значения, но выборка немного не работает. Это довольно странно ... Видите красные фрагменты? Когда объекты находятся в движении, они очень немного мерцают. Это означает, что установленные мной альфа-значения не совпадают идеально на этих пикселях.
Для меня не критично добиться идеальной точности пикселей для этой проверки альфа-индекса для моего реального приложения, но такое поведение просто не то, что я ожидал.