Вне экрана несколько целей рендеринга с использованием объекта кадрового буфера (FBO) или?

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

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

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

Вопросы:

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

person Rudi    schedule 27.05.2011    source источник


Ответы (2)


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

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

При написании «цвета» и «краев» вы эффективно пишете в своих текстурах.

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

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

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

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

person Calvin1602    schedule 27.05.2011
comment
@Кальвин- Спасибо. 2 - это «около» 50 * 50, т. Е. Будет варьироваться, потому что иногда оно может быть больше или меньше, а также из-за эффекта z-преобразования перспективной проекции. так и не смог этого сделать. Единственная уловка, которую мы могли бы сделать здесь, это читать, я думаю. - person Rudi; 28.05.2011
comment
@Calvin, пожалуйста, учтите, что я никогда не использовал шейдер. Не могу использовать: layout(location = 0) out vec3 color; край = iif ( (цвет[i, j-1] != цвет[i,j+1] || (цвет[i-1, j] != цвет[i+1,j] ) 1:0; макет (местоположение = 1) вне ребер vec3; - person Rudi; 28.05.2011
comment
@Calvin- то есть, если бы я мог сделать, как сказано в комментарии выше (присоединиться к соседу), то забыл бы вопрос (2) на данный момент, я мог бы использовать ОДИН FBO, ДВА текстурных буфера с ФРАГМЕНТНЫМ ШЕЙДЕРОМ для достижения моей первой цели? Правильно? - person Rudi; 28.05.2011
comment
@Rudi, вы не можете получить доступ к соседям в текстуре, ЕСЛИ вы визуализируете (через FBO) ту же текстуру (что кажется логичным). Итак: визуализируйте сцену в одном FBO с 1 цветовой текстурой и 1 буфером глубины, а затем визуализируйте сгенерированную текстуру (в простом квадрате) в другом FBO с фрагментным шейдером Sobel. дополнительная информация: opengl-tutorial.org/intermediate- учебники/ - person Calvin1602; 29.05.2011
comment
@Кэлвин, спасибо! Я понял! теперь последний вопрос, я думаю :D. Что лучше использовать 2 FBO ИЛИ 1 FBO и 2 текстуры: сначала отрисовать одну текстуру, а затем использовать ее как текстуру для отрисовки второй текстуры? Я имею в виду изменение цели отрисовки с помощью glWritePixels? Потому что я читал во многих местах, что изменение FBO по-прежнему обходится дороже, чем изменение буферов текстуры/рендеринга? - person Rudi; 30.05.2011
comment
Отличный вопрос. Без понятия. Не могли бы вы попробовать оба и написать номера? Интуитивно я бы сказал, что в обоих случаях вам придется изменить шейдер и переназначить FBO, поэтому большой разницы не будет, но это чистое предположение. - person Calvin1602; 30.05.2011
comment
Эй, Кэлвин... прости, приятель, не называй меня ленивым! используя одиночный FBO, полностью заполните мою цель при движении. Давайте верить официальному документу - изменение цели рендеринга происходит быстрее, чем изменение FBO! Спасибо Кальвин!!! - person Rudi; 17.06.2011

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

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

person Christian Rau    schedule 28.05.2011
comment
@Christian- Разве использование одного FBO с двумя текстурными буферами и применение фрагментного шейдера не могло бы наилучшим образом решить первую задачу? как предложил Кальвин вместо смены FBO? то есть один textrue будет иметь вывод цвета формы, а другой будет иметь край с использованием фрагментного шейдера? - person Rudi; 28.05.2011
comment
@Rudi Да, но, как сказал Кальвин, вы не можете рисовать фигуры и вычислять края за один и тот же проход, поскольку детектору краев требуется доступ к соседним пикселям. - person Christian Rau; 28.05.2011
comment
Ага. Отсюда мой новый комментарий. Между прочим, это имеет смысл: вы не можете получить доступ к своему соседу, вы даже не знаете, вычислено оно уже или нет! - person Calvin1602; 29.05.2011