Как нарисовать Renderbuffer как Texturebuffer в FBO?

Мне удалось рендерить текстуру с помощью Texturebuffer, используя VAO и шейдеры.

Но у FBO есть и другие варианты цветового буфера, это Renderbuffer. Я много искал в интернете, но не смог найти ни одного примера, связанного с рисованием Renderbuffer как Texturebuffer с шейдерами

Если я не ошибаюсь, Renderbuffer выпущен в OpenGL 3.30 и работает быстрее, чем Texturebuffer.

Могу ли я использовать Renderbuffer в качестве Texturebuffer? (глупый вопрос, да? Я думаю, что это должно быть абсолютно, не так ли?)

Если да, пожалуйста, приведите меня или приведите любой пример для рисования буфера рендеринга в качестве буфера текстур.

Моя цель только для изучения, но я хотел бы знать, что это лучший способ рисовать текстуры? Должны ли мы использовать это часто?

2 ответа

Решение

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

Если я не ошибаюсь, Renderbuffer выпущен в OpenGL 3.30 и работает быстрее, чем Texturebuffer.

Нет. Renderbuffers были там, когда FBO были впервые изобретены. Одно из них быстрее другого, как правило, тоже не так, но это детали реализации. Но это тоже не имеет значения.

Могу ли я использовать Renderbuffer в качестве Texturebuffer? (глупый вопрос, да? Я думаю, что это должно быть абсолютно, не так ли?)

Нету. Вы не можете использовать содержимое рендеринга непосредственно в качестве источника для наложения текстур. Renderbuffesr - это просто абстрактные области памяти, которые визуализирует графический процессор, и они не имеют формат, необходимый для текстурирования. Вы можете прочитать результаты в ЦП, используя glReadPixelsМы можем скопировать данные в объект текстуры, например, с помощью glCopyTexSubImage - но это будет намного медленнее, чем прямой рендеринг в текстуры.

Таким образом, renderbuffers хороши для другого набора вариантов использования:

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

Похоже, что ваша терминология перепутана.

Вы прикрепляете изображения к объектам Framebuffer. Эти изображения могут быть либо объектом Renderbuffer (это внеэкранная поверхность, которая имеет очень мало применений, кроме прикрепления и блитинга), либо они могут быть частью объекта текстуры.

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

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

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