Вне экрана несколько целей рендеринга с использованием Frame Buffer Object (FBO) или?

Ситуация: Генерация 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 ответа

Решение

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

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

При записи в "цвет" и "края", вы будете эффективно писать в ваших текстурах.

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

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

РЕДАКТИРОВАТЬ: Вы обычно ограничиваете нарисованную зону с glViewPort. Но есть только одна область просмотра, а вам нужно несколько. Вы можете попробовать расширение массива Viewport и жить на переднем крае, или передать AABB в текстуру, или не беспокоиться об этом, пока производительность не имеет значения...

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

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

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

Другие вопросы по тегам