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


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

Yakim (Watco... : (2 дней назад) бугага
lz : (5 дней назад) Вытаскивал из блока.
lz : (5 дней назад) Блэт, мои серваки на амазоне под раздачу попали.
Yakim (Watco... : (2 недель назад) :ph34r:
Гость : (4 недель назад) Благодарю :) (предпочитаю постоянный стабильный заработок)
Yakim (Watco... : (4 недель назад) пхахаха
lz : (4 недель назад) Может быть, хочешь знать, как поднять бабла?
lz : (4 недель назад) Кстати, а проблем с доступом к джойказино у тебя нет?
lz : (4 недель назад) Активировал.
Гость : (4 недель назад) Проблемы с активацией аккаунта на форуме... =)
Yakim (Watco... : (19 Март 2018 - 21:37) :ph34r:
Yakim (Watco... : (01 Февраль 2018 - 21:44) ?
Yandersen : (01 Февраль 2018 - 19:04) Проблемы?..
Yakim (Watco... : (31 Январь 2018 - 13:18) Какие проблемы?
lz : (30 Январь 2018 - 16:17) Какие проблемы? Проблемы с другими движками?
GranMinigun : (30 Январь 2018 - 12:45) Где я предлагал заняться рефакторингом? Я спрашивал, в чём именно проблемы.
Гость : (30 Январь 2018 - 07:55) пускай они там как нибудь сами, без меня)
GranMinigun : (29 Январь 2018 - 21:19) Анрил с видимым исходным кодом таки. Но да, у СруДвижка только сырцы самого движка и свободны. А что конкретно за проблемы в коде СруДвижка? Я видел, что у них в планах провести рефакторинг в ближайший апдейт или два. С точки зрения инструментария, к слову, СруДвижок серьёзно подтянулся в последних версиях, я даже решил таки поближе ознакомиться. (А вообще, мне он понравился графическими технологиями, особенно подходом к освещению.)
Yakim (Watco... : (29 Январь 2018 - 18:01) люто плюсую Егор)
lz : (29 Январь 2018 - 14:29) Движок большой, функционала много, код качественный (не как у крузис енгине) и всё такое.
lz : (29 Январь 2018 - 14:28) Анреал открытый, взрослый, на С++. Пока проект некоммерческий денег заносить никому не надо.
lz : (29 Январь 2018 - 14:27) Да не, на самом деле у меня даже где-то описано, что графический движок можно заменить при необходимости.
lz : (29 Январь 2018 - 14:27) Потому что анреал - офигенная тема.
GranMinigun : (29 Январь 2018 - 01:03) Кстати, Егор. А почему выбор движка пал именно на UE4? Какие-то предпосылки к этому были?
lz : (27 Январь 2018 - 18:39) Я подумал на карту механоидов побольше добавить для фана, а надо ж запаковывать ещё.
lz : (27 Январь 2018 - 18:39) Спс, это я и писал)
GranMinigun : (27 Январь 2018 - 18:20) Только распаковщик. Сторонний. Точнее, его создал lz.
Гость : (27 Январь 2018 - 03:45) а интересно, есть ли где упаковщик для м1? в сдк или может где встроен в саму игру или редактор
Folgen : (19 Январь 2018 - 08:31) Спс.
GranMinigun : (19 Январь 2018 - 05:43) Готово. Добро пожаловать на форум, механоид.
GranMinigun : (19 Январь 2018 - 05:42) Указать, кого именно активировать, например.
Гость : (19 Январь 2018 - 00:49) Активируйте акк. Хз, нужно что-либо указывать дополнительно для этого в чате, или админы сами всех подряд активируют, кто в очереди на активацию?
GranMinigun : (13 Январь 2018 - 05:42) https://forums.unrea...sed-on-gis-data
Yakim (Watco... : (09 Январь 2018 - 00:24) Аа да? Ну окей)
GranMinigun : (08 Январь 2018 - 20:06) А это даже не обсуждается!
Yakim (Watco... : (08 Январь 2018 - 19:55) А кто сказал что мы пьянели?)
GranMinigun : (08 Январь 2018 - 19:48) Ну что, товарищи, протрезвели?
Yakim (Watco... : (02 Январь 2018 - 20:56) сяп)
Гость : (01 Январь 2018 - 23:57) Егорыч на праздники с каникул вернулся. За это тост! Всем маны!
lz : (30 Декабрь 2017 - 23:52) Наоборот.
Гость : (30 Декабрь 2017 - 23:16) Позвольте уточнить, для будущего наркомана прошлое это будущее или наоборот?
lz : (30 Декабрь 2017 - 22:08) Как ты его поймаешь, когда он знает, где ты его будешь ловить?
GranMinigun : (30 Декабрь 2017 - 09:12) Ловите наркомана из будущего!
PA3UJIb : (30 Декабрь 2017 - 06:37) С новым 2018 годом! А то старый-то 2018 мы и не видели даже
Yakim (Watco... : (29 Декабрь 2017 - 19:46) С наступающим)

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

[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

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

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