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


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

lz : (час назад) да не, я не)
Yakim (Watco... : (20 часов назад) Егор, ты говоришь так. будто у тебя они есть, так вот, че по чем?))))
Гость : (вчера) Вот бы сейчас, в 2018, читы на мехов гуглить...
lz : (вчера) Ты просто без читов гоняешь.
Yandersen : (вчера) Ниправда, этот сукасадист должен существовать, его не может не быть! Иначе на кого тяготы жизни сваливать?
Yakim (Watco... : (вчера) Юморист от бога, которого нет)))
Гость : (вчера) Бля, я думал это поиск
Гость : (вчера) Читы
Yakim (Watco... : (6 дней назад) Ну как-бы да, насколько я помню, Дуст и Сплайн основатели =) Кажется идея Дуста, реализация Сплайна.
lz : (6 дней назад) Вон даже свалкер2 будет, а ты говоришь. И P4 будет)
Yandersen : (неделю назад) ессниошибаюсь. Якимка, подтверди?..
Yandersen : (неделю назад) Егор, кто такой Дуст надо знать. Он папа Мехов, основатель Скаев, автор оригинальной идеи и главный разраб.
lz : (неделю назад) Всё будет.
lz : (неделю назад) Я его знать не знаю, и, поэтому, как-то безразлично.
Yandersen : (неделю назад) Не, ну остается ещё пол процента вероятности что старческий маразм, который, судя по всему, уже не за горами, толкнет дедулю на кикстартер и жалкую попытку возродить легенду, но если это и случится, это будет жалкий высер и позор, тут гарантированно.
Yandersen : (неделю назад) Ну так, антипример мотивационный. Тип для подверждения утверждения о последнем Джедае в твоем лице.
Yandersen : (неделю назад) Нам? Да незачем канеш. Прост он Батя Мехов, и после многолетней череды ежегодных грез о М3 такое вот отмачивает.
lz : (неделю назад) Он нам зачем?
lz : (неделю назад) Ни тепло ни холодно.
Yandersen : (неделю назад) Так как тебе новостя, что Дуст из Партизанов в Fearea перешел? От же мотает старика из говна в навоз...
Yandersen : (неделю назад) Еще бы. У меня во времена креативные если проект десяток хидеров включал, так я с наскока в лучшем случае все с нуля тупо переписывал, чем разбирался что там где как было. В худшем - тупо закрывал и забывал нах. Ты-то молодец.
lz : (неделю назад) Я бывает открываю, но с наскока не берётся так пока.
lz : (неделю назад) Так там 3 года назад ещё всё почти готово было. Прогресса особо больше и не было. АИ надо и всё считай.
Yandersen : (неделю назад) Егор, ну позязя, там же на вид не так много осталось? Будет играбельно хоть чутка - получится мотивационно, больше шансов что кто-нить из народа подключится.
lz : (неделю назад) Занят пока просто, терпение)
Гость : (неделю назад) Лол, нет)
Yandersen : (неделю назад) Ну, вялотекущие дела - это по моей части. Ты-то как креативность растерял, а Егорка? На тебя ж одна надежда осталась. Дуст вон в Fearea влился уже. Это ж все, мехам хана, а последний из Джедаев стал вялотекущими делами заниматься, вместо того чтоб мир разумных машин от забвения спасать. Ну Егооооор... :(
lz : (3 недель назад) По гитхабу можно посмотреть.
lz : (3 недель назад) Вялотекущий режим. Время от времени чего-то смотрю.
Yandersen : (3 недель назад) Егорушка, ну а как же ремастеред?.. :(
Yakim (Watco... : (4 недель назад) бугага
lz : (4 недель назад) Вытаскивал из блока.
lz : (4 недель назад) Блэт, мои серваки на амазоне под раздачу попали.
Yakim (Watco... : (05 Апрель 2018 - 20:54) :ph34r:
Гость : (22 Март 2018 - 09:37) Благодарю :) (предпочитаю постоянный стабильный заработок)
Yakim (Watco... : (21 Март 2018 - 19:56) пхахаха
lz : (21 Март 2018 - 16:46) Может быть, хочешь знать, как поднять бабла?
lz : (21 Март 2018 - 16:46) Кстати, а проблем с доступом к джойказино у тебя нет?
lz : (21 Март 2018 - 16:02) Активировал.
Гость : (21 Март 2018 - 15:32) Проблемы с активацией аккаунта на форуме... =)
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) Какие проблемы? Проблемы с другими движками?

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

[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 анонимных