Попытка понять OpenGL

Я читаю руководство по Open GL ES, предоставленное Apple, но я не понимаю его во всех деталях и у меня есть вопрос. Я очень благодарен, если вы поможете мне понять. На странице 28, в главе о рисовании, говорится следующее:

Чтобы правильно создать фреймбуфер:

  1. Создайте объект фреймбуфера.
  2. Создайте одну или несколько целей (рендербуферов или текстур), выделите для них память и прикрепите каждую к точке присоединения на объекте фреймбуфера.
  3. Проверьте кадровый буфер на полноту.

Мой вопрос: в пункте 2 не должно быть сказано «создать один или несколько источников...»? Как я сейчас понимаю, буфер кадра — это то, что будет отображаться на экране в моем методе рисования. Поэтому для меня было бы разумно, если бы мы указывали, какие изображения мы хотим визуализировать, присоединяя их к буферу кадра. Ясно, что я неправильно понимаю что-то фундаментальное, поскольку в том, что я описываю, цель — это экран, а все остальное — источник.


person Matt N.    schedule 13.02.2013    source источник


Ответы (5)


Ваша программа выполняет рендеринг в фреймбуфер, выполняя действия, которые заставляют OpenGL растрировать фрагменты в фреймбуфер.

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

Это немного похоже на это (очень грубо и не в моей голове):

+----------+   +--------+   +---------------------+   +----------------------+
|draw calls|---|pipeline|---|pixels in framebuffer|---|pixels in renderbuffer|
+----------+   +--------+   +---------------------+   +----------------------+
person unwind    schedule 13.02.2013

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

person Nikolai Ruhe    schedule 13.02.2013

Вложение кадрового буфера сначала является целью записи, а затем источником чтения. Обратите внимание, что когда в спецификации указано «цель», обычно это активный объект, который обрабатывается или изменяется, независимо от фактической операции.

person Bartek Banachewicz    schedule 13.02.2013

Ясно, что я неправильно понимаю что-то фундаментальное, поскольку в том, что я описываю, цель — это экран, а все остальное — источник.

Да вы что-то в корне не поняли. Объект Framebuffer используется, когда вы хотите визуализировать вещи не на экране, а в какое-то изображение за пределами экрана. Например, texutre или какое-то изображение, которое позже подвергается постобработке. Если вы хотите отображать только на экране, вам не нужен FBO.

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

Нет. Объект фреймбуфера — это не источник содержимого изображения, а «холст», приемник, на котором вы можете рисовать. Или, точнее, «рамка» для фактического холста, где цель — это холст для рисования.

person datenwolf    schedule 13.02.2013

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

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

person Felix K.    schedule 13.02.2013