Вне экрана несколько целей рендеринга с использованием Frame Buffer Object (FBO) или? - PullRequest
1 голос
/ 28 мая 2011

Ситуация: Генерирование N выборок формы и соответствующих ребер (используя фильтр Собеля или мой собственный) с различными преобразованиями и поворотами, при этом область просмотра (размер = 600 * 600) и камера остаются постоянными. т.е. будет N отсчетов + N соответствующих ребер.

Я думаю сделать так,

Использовать один FBO с 2 буферами рендеринга [т.е. размер каждого буфера будет = (N * 600) * 600] - 1-й для N фигур и 2-й для ребер соответствующих форм

Вопросы:

  1. Какой лучший способ достичь выше всего?
  2. Хотя размер области просмотра составляет 600 * 600 пикселей, но форма будет занимать только около 50 * 50 пикселей. Так есть ли эффективный способ применить обнаружение края на ограничительной области / области AABB только на 2-м буфере? Также только чтение 2N ограничивающего прямоугольника (N выборка + N соответствующих ребер) эффективным способом?

Ответы [ 2 ]

2 голосов
/ 28 мая 2011

1: я не уверен, что вы называете "лучшим способом" Используйте несколько целей рендеринга: вы создаете две 600 * N текстуры, привязываете их к FBO с помощью glDrawArrays и в своем фрагментном шейдере, вот так:

layout(location = 0) out vec3 color;
layout(location = 1) out vec3 edges;

При записи в "color" и "edge" вы будете эффективно писать в своих текстурах.

2: Вы не должны этого делать. Вычислите свои ограничивающие блоки на CPU и спроецируйте их (то есть умножьте каждый угол на вашу матрицу ModelViewProjection), чтобы получить ограничивающие рамки в 2D

Кстати: сначала вычислите свои ограничивающие рамки, чтобы вам не понадобилось 600 * 600 текстур, но 50 * 50 ...

EDIT: Вы обычно ограничиваете нарисованную зону с помощью glViewPort. Но есть только одна область просмотра, а вам нужно несколько. Вы можете попробовать расширение массива Viewport и жить на переднем крае, или передать AABB в текстуре, или не беспокоиться об этом, пока производительность не имеет значения ...

О, и вы не можете использовать Sobel просто так ... Sobel требует, чтобы вы могли читать все тексели вокруг, что не соответствует действительности, так как в настоящее время вы воспроизводите упомянутые тексели. Либо создайте двухпроходный алгоритм без MRT (сначала цвет, затем ребра), либо не используйте Sobel и угадывайте ваши ребра в шейдере (я не очень понимаю, как)

1 голос
/ 28 мая 2011

Как сказал Кальвин, вы должны сначала визуализировать свой объект в первый кадровый буфер, а затем связать его как текстуру (используйте текстурное вложение, а не визуальный буфер) для второго прохода, чтобы найти края, так как для обнаружения края обычно требуется доступ к пикселям, окружающим пиксели.

Что касается вашего второго вопроса, вы, вероятно, можете использовать буфер трафарета. Просто нарисуйте фигуры в первом проходе и позвольте им записать эталонное значение в буфер трафарета. Затем выполните обнаружение ребер (обычно путем рендеринга квадрата размером с экран с помощью шейдерного фрагмента с ответом) и настройте тест трафарета так, чтобы он проходил только в том случае, если буфер трафарета содержит эталонное значение. Таким образом (при условии, что на ранних этапах использовалось аппаратное обеспечение раннего z, что довольно часто встречается), фрагментный шейдер будет выполняться только на тех пикселях, на которые была нарисована фигура.

...