Перейти к содержимому


Свернуть чат Чат Открыть чат во всплывающем окне

Folgen : (2 дней назад) Спс.
GranMinigun : (2 дней назад) Готово. Добро пожаловать на форум, механоид.
GranMinigun : (2 дней назад) Указать, кого именно активировать, например.
Гость : (2 дней назад) Активируйте акк. Хз, нужно что-либо указывать дополнительно для этого в чате, или админы сами всех подряд активируют, кто в очереди на активацию?
GranMinigun : (неделю назад) https://forums.unrea...sed-on-gis-data
Yakim (Watco... : (неделю назад) Аа да? Ну окей)
GranMinigun : (неделю назад) А это даже не обсуждается!
Yakim (Watco... : (неделю назад) А кто сказал что мы пьянели?)
GranMinigun : (неделю назад) Ну что, товарищи, протрезвели?
Yakim (Watco... : (2 недель назад) сяп)
Гость : (2 недель назад) Егорыч на праздники с каникул вернулся. За это тост! Всем маны!
lz : (3 недель назад) Наоборот.
Гость : (3 недель назад) Позвольте уточнить, для будущего наркомана прошлое это будущее или наоборот?
lz : (3 недель назад) Как ты его поймаешь, когда он знает, где ты его будешь ловить?
GranMinigun : (3 недель назад) Ловите наркомана из будущего!
PA3UJIb : (3 недель назад) С новым 2018 годом! А то старый-то 2018 мы и не видели даже
Yakim (Watco... : (3 недель назад) С наступающим)
Yakim (Watco... : (3 недель назад) гы
lz : (3 недель назад) Посоны, с наступающим всех!
Yakim (Watco... : (3 недель назад) +
lz : (3 недель назад) Много капитанства.
lz : (3 недель назад) +
Yakim (Watco... : (3 недель назад) ну такое
Gaantro : (3 недель назад) Описывает принцип работы.
Gaantro : (3 недель назад) Антиграв*
Gaantro : (3 недель назад) Система Grable в Star Citizen (Антигуа) : https://youtu.be/2VkzHbJiCAo
Yakim (Watco... : (3 недель назад) Ага :lol:
lz : (3 недель назад) Чё там у нас? Пошла жара? Главное, чтобы не такое генерилось https://youtu.be/RvAwB7ogkik
Moh : (3 недель назад) Мне, да привет? Ну привет )
Гость : (3 недель назад) И с Новым годом.
Гость : (3 недель назад) Шучу. От Крогота.
Гость : (3 недель назад) От Гостя.
Гость : (3 недель назад) Увидите моха передайте ему привет.
Yakim (Watco... : (3 недель назад) :lol: :P
lz : (3 недель назад) Лан, чё ты, нормально же общались, это нарицательное)
Yakim (Watco... : (4 недель назад) Еще и "Мехах" с маленькой буквы, бесстыжий :D
GranMinigun : (4 недель назад) Был.
lz : (4 недель назад) В мехах был такой рейтинг? Не помню уже.
lz : (4 недель назад) Опасный Яким)
Yakim (Watco... : (4 недель назад) За "маханойдов" и двор, стреляю в упор :D
GranMinigun : (4 недель назад) Я не это имел в виду!
Yakim (Watco... : (4 недель назад) :lol:
lz : (4 недель назад) За механойдов наверное.
lz : (4 недель назад) Всё, рубанул.
lz : (4 недель назад) Ща мы их.

Фотография
- - - - -

[FBO.hpp] - класс фреймбуффера

OpenGL Framebuffer FBO Texture RTT

  • Авторизуйтесь для ответа в теме
В этой теме нет ответов

#1 OFFLINE   Yandersen

Yandersen

    Диванный теоретик

  • Админ
  • 454 сообщений
  • Откуда:Canada
  • Настоящее имя:Ян

Отправлено 20 Апрель 2015 - 19:09

Класс CFBO для упрощения работы с фреймбуффер-объектами, необходимыми для offscreen-rendering'а (рендер в текстуры или рендербуфферы):

 

FBO.hpp

 

:!: Требует LoadGL.h и GLSL.hpp.

Кидаем FBO.hpp в папку проекта, подключаем:

#include "FBO.hpp"

К фреймбуфферу можно цеплять текстуры или рендербуфферы:

inline void CFBO::AttachRenderbuffer(GLenum AttachmentPoint,
                                     GLuint RenderbufferName);

inline void CFBO::AttachTexture(GLenum AttachmentPoint,
                                GLuint TextureName, GLint MipmapLevel);

inline void CFBO::AttachTextureLayer(GLenum AttachmentPoint,
                                     GLuint TextureName, GLint MipmapLevel,
                                     GLint Layer);

Здесь параметр AttachmentPoint - это одна из OpenGL констант:

GL_COLOR_ATTACHMENTi

GL_DEPTH_ATTACHMENT

GL_STENCIL_ATTACHMENT

GL_DEPTH_STENCIL_ATTACHMENT

Параметр RenderbufferName или TextureName - это имя рендербуффера или текстуры, который будет прикреплён; для текстур ещё нужно указать номер мипмапы - MipmapLevel. Если текстура имеет тип *_ARRAY или GL_TEXTURE_3D, то требуется юзать AttachTextureLayer и указать там номер слоя - Layer.

Вообще говоря, все три функции - это просто обёртки ОпенГЛевских:

CFBO::AttachRenderbuffer - glNamedFramebufferRenderbuffer;

CFBO::AttachTexture - glNamedFramebufferTexture;

CFBO::AttachTextureLayer - glNamedFramebufferTextureLayer.

В случае "цветных" аттачментов (AttachmentPoint = GL_COLOR_ATTACHMENTi) рикреплённый объект сразу добавляется в список буфферов рендеринга и номер буффера будет соответствовать номеру i.

Чтобы открепить объект от требуемого AttachmentPoint, просто используйте нулевое имя объекта и любую из трёх вышеописанных функций.

 

:!: Деструктор класса CFBO удаляет лишь свой объект фреймбуффера, но НЕ удаляет аттачменты; при замещении одного аттачмента другим также НЕ происходит удаления старого аттачмента. Другими словами, CFBO не заботится о своих аттачментах, а лишь помнит, к какому поинту кто в данный момент присоединён.

 

Если прикреплённый ранее объект был изменён (удалён или изменил размеры), вызовите функцию

GLenum CFBO::Evaluate();

Она сканирует все аттачменты, автоматом удаляет неработоспособные, обновляет эффективные размеры FBO и распределяет цветовые буфферы (glDrawBuffers). Функция Evaluate вызывается автоматически после прикрепления рендербуфферов и текстур. Возвращаемое значение - результат вызова glCheckNamedFramebufferStatus и в случае работоспособной конфигурации фреймбуффера будет равно GL_FRAMEBUFFER_COMPLETE.

Узнать размеры (ширину и высоту) конкретного аттачмента можно функцией

ivec2 CFBO::EvaluateAttachment(GLenum Attachment);

:!: Если возвращённое значение {-1,-1}, то указанного аттачмента нет; если {0,0}, то аттачмент был автоматически откреплён (обнаружен неинициализированный/удалённый объект).

 

Узнать эффективные размеры всего фреймбуффера:

inline ivec2 CFBO::GetSize()const;

Отношение ширины к высоте (Width/Height):

inline float GetAspectRatio()const; //Returns Width/min(Height,1)

:!: Это значение будет равно 0, если у фреймбуффера нет ни одного аттачмента.

 

Чтобы рендер шёл в нужный FBO, вызываем Bind:

CFBO MyFBO;
... //Configure MyFBO
MyFBO.Bind(); //Target MyFBO for rendering operations
... //Render some...

:!: Функция glViewport будет вызвана автоматически.

 

Чтобы "слить" картинку на экран, юзаем ShowImage:

void ShowImage()const;
void ShowImage(unsigned ColorBufferID)const;
void ShowImage(unsigned ColorBufferID, GLint ScreenWidth, GLint ScreenHeight)const;

Если ничего не указывать в аргументах, то картинка будет взята из объекта, прикреплённого к GL_COLOR_ATTACHMENT0. Однако можно выбрать любой другой цветовой аттачмент, указав его индекс (т.е. i) как ColorBufferID. Если указать размеры экрана, то картинка будет растянута/сжата под указанное разрешение; в противном случае будет выведена в оригинальном виде и размере (если размеры FBO и экранного буффера не совпадают, картинка будет обрезана или не замостит весь экран).

 

Функции очистки буфферов:

//Clear one of the color buffers (it's index is specified as BufferID)
inline void CFBO::ClearColor(unsigned int BufferID, const vec4& ClearColorRGBA);
inline void CFBO::ClearColor(unsigned int BufferID, const ivec4& ClearColorRGBA);
inline void CFBO::ClearColor(unsigned int BufferID, const uvec4& ClearColorRGBA);
//Clear all of the color buffers simultaneously with the same value
inline void CFBO::ClearColor(const vec4& ColorRGBA);
//Clear the depth buffer
inline void CFBO::ClearDepth(GLfloat Value);
//Clear the stencil buffer
inline void CFBO::ClearStencil(GLint Value);
//Clear the depth and stencil buffer
inline void CFBO::ClearDepthStencil(GLfloat Depth, GLint Stencil); 
//Clear all of the color buffers and the depth buffer
inline void CFBO::ClearColorDepth(const vec4& ColorRGBA, float Depth);
//Clear all of the color buffers and the stencil buffer
inline void CFBO::ClearColorStencil(const vec4& ColorRGBA, int Stencil);
//Clear all of the color, depth and stencil buffers
inline void Clear(const vec4& ColorRGBA, float Depth, int Stencil);

Ну и парочка вспомогательных функций:

//Set property
inline void CFBO::SetParameter(GLenum pname, GLint param);

//Return the value of the requested FBO's parameter
inline GLint CFBO::GetParameter(GLenum pname)const;

//Return the value of the requested attachment's parameter
inline GLint CFBO::GetParameter(GLenum attachment, GLenum pname)const;

Эти функции - обёртки ОпенГЛевских:

CFBO::SetParameter - glNamedFramebufferParameteri;

CFBO::GetParameter(pname) - glGetNamedFramebufferParameteriv;

CFBO::GetParameter(attachment, pname) - glGetNamedFramebufferAttachmentParameteriv.

 

Выбрать цветовой буффер, используемый для операций чтения (glReadPixels, glCopyTexImage):

inline void CFBO::SetReadBuffer(unsigned ColorBufferID);

:!: Указать нужно индекс цветового буффера (т.е. i).

 

Класс CFBO может использоваться напрямую как аргумент gl*-функций, требующих GLuint-имя фреймбуффер-объекта:

CFBO MyFBO;
...
glBindFramebuffer(GL_FRAMEBUFFER,MyFBO);






Темы с аналогичным тегами OpenGL, Framebuffer, FBO, Texture, RTT

Количество пользователей, читающих эту тему: 1

0 пользователей, 1 гостей, 0 анонимных