Связывание нескольких буферов в OpenGL ES - PullRequest
3 голосов
/ 25 октября 2011

Возможно ли связать несколько кадровых буферов и буферов визуализации в OpenGL ES? Я рендеринг в закадровый кадровый буфер / рендеринга и предпочел бы просто использовать мой существующий код рендеринга.

Вот что я сейчас делаю:

// create/bind framebuffer and renderbuffer (for screen display)

// render all content

// create/bind framebuffer2 and renderbuffer2 (for off-screen rendering)

// render all content again (would like to skip this)

Вот что я хотел бы сделать:

// create/bind framebuffer and renderbuffer (for screen display)

// create/bind framebuffer2 and renderbuffer2 (for off-screen rendering)

// render all content (only once)

Возможно ли это?

1 Ответ

3 голосов
/ 25 октября 2011

Вы не можете рендерить в несколько кадровых буферов одновременно. Возможно, вы сможете использовать MRT для рендеринга в несколько целей рендеринга (текстуры / рендер-буферы), которые принадлежат одному и тому же FBO, выполняя несколько цветов в фрагментном шейдере, но не в нескольких FBO, например, внеэкранном FBO и буфере кадров по умолчанию. Но если я правильно проинформирован, ES пока не поддерживает MRT.

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

Хотя в OpenGL ES это может иметь значение, если вы используете рендер-буфер или текстуру для хранения данных вне экрана, поскольку у ES нет glGetTexImage. Поэтому, если вам нужно скопировать данные за пределы экрана в ЦП, вы не получите около glReadPixels и, следовательно, вам понадобится рендер-буфер. Но в этом случае вам все равно не нужно визуализировать сцену дважды. Вам просто нужно представить другое FBO с прикрепленной текстурой. Таким образом, вы визуализируете сцену один раз в текстуру, используя это FBO, а затем визуализируете эту текстуру как во внешнем FBO, так и в кадровом буфере экрана. Это может все же быть быстрее, чем рисовать всю сцену дважды, хотя об этом может сказать только оценка.

Но если вам нужно скопировать данные в ЦПУ для обработки, вы также можете просто скопировать их непосредственно из экранного буфера кадров и не нуждаться в внеэкранном FBO. И если вам нужны данные вне экрана только для обработки на основе графического процессора, тогда текстура лучше, чем буфер рендеринга. Поэтому может быть полезно рассуждать, если вам все равно нужен дополнительный внеэкранный буфер, если он содержит только те же данные, что и кадровый буфер. Это может сделать всю проблему устаревшей.

...