Самостоятельные рендер-буферы в OpenGL - PullRequest
0 голосов
/ 06 марта 2009

У меня есть некоторый код OpenGL, который ведет себя непоследовательно в разных аппаратное обеспечение. У меня есть код, который:

  1. Создает буфер рендеринга и привязывает текстуру к своему цветному буферу (текстура A)
  2. Устанавливает этот буфер рендеринга как активный и настраивает область просмотра и т. Д.
  3. Активирует пиксельный шейдер (в данном случае размытие по Гауссу).
  4. Рисует квадроцикл на весь экран с текстурой А.
  5. Отсоединяет буфер рендеринга и т. Д.

На моей машине для разработки это работает нормально и имеет эффект размытия текстуры "на месте", однако на другом оборудовании это не похоже на работу.

У меня есть две возможности.

A) Создание рендеринга буфера для рендеринга само по себе не должно работать, и работает только на моей машине из-за какой-то случайности.

Или

B) Этот подход должен работать, но что-то еще идет не так.

Есть идеи? Честно говоря, мне было трудно найти подробности об этой проблеме.

Ответы [ 2 ]

2 голосов
/ 06 марта 2009

А) правильный ответ. Рендеринг в тот же буфер во время чтения из него не определен. Это может сработать, а может и нет - именно это и происходит.

В случае OpenGL, расширение framebuffer_object имеет раздел «4.4.3 Рендеринг, когда изображение связанного объекта текстуры также присоединено к кадровому буферу», в котором говорится о том, что происходит (в основном, не определено). В Direct3D9 среда выполнения отладки громко жалуется, если вы используете эту настройку (но она может работать в зависимости от оборудования / драйвера). В D3D10 среда выполнения всегда связывает цель, которая используется в качестве пункта назначения, я думаю.

Почему это не определено? Одна из причин, по которой графические процессоры так быстры, заключается в том, что они могут делать множество предположений. Например, они могут предположить, что единицам, которые выбирают пиксели, не нужно связываться с единицами, которые пишут пиксели. Таким образом, поверхность может быть прочитана, N циклов позже, чтение завершено, N циклов позже, пиксельный шейдер завершает свое выполнение, затем он помещает его в несколько выходных буферов слияния на GPU и, наконец, в какой-то момент он записывается в память. Кроме того, графические процессоры растеризуются в «неопределенном» порядке (один графический процессор может растеризоваться в строках, другой - в некотором порядке, удобном для кэширования, другой - в совершенно другом порядке), поэтому вы не знаете, какие части поверхности будут записаны к первому.

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

0 голосов
/ 06 марта 2009

В некоторых особых случаях может быть достаточно даже резервного буфера. Вы просто не делаете glClear, и то, что вы нарисовали ранее, все еще там. Предостережение, конечно, в том, что вы не можете действительно читать из буфера. Но для таких эффектов, как появление и исчезновение, это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...