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


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

Yakim (Watco... : (4 дней назад) :D
Yakim (Watco... : (4 дней назад) nope
Yandersen : (4 дней назад) Айаяй. Поди Якимко заспамил чат стикерами. :)
Yandersen : (4 дней назад) Да лан, тут каждый день кто-нить из админов заглядывает. Как пропустили?
Nextovoy : (5 дней назад) Я писал
Гость : (неделю назад) Сорьки, что так у нас. Чего три года так и не попытался в чат писнуть? :)
Nextovoy : (неделю назад) Спасибо
lz : (неделю назад) Активировал.
Гость : (2 недель назад) Активируйте его.
Гость : (2 недель назад) Мой профиль - Nextovoy
Гость : (2 недель назад) Написать в чат. Профиль в ручную админы активируют.
Гость : (2 недель назад) Ох уж эта дурацкая привычка писать всё раздельно засоряя чат. Это всё классно, конечно, но ребята, одменестраторы, так называемые. Третий год пытаюсь зарегистрироваться (буквально, третий) на этом форуме, но ПИСЬМО С ПОДТВЕРЖДЕНИЕМ НА ПОЧТУ ТАК И НЕ ПРИХОДИТ. Что делать?
Гость : (2 недель назад) Перешёл я всё же по ссылке Redoctor'a...
Гость : (2 недель назад) Пора уже M4
Гость : (2 недель назад) итак м3
lz : (2 недель назад) Мы тебе и тут передадим.
Гость : (2 недель назад) Зачем в телеграмме делать?!Я вот например не могу зайти,написать в чат,подписаться и не только у меня это.
Redoctor : (3 недель назад) https://vk.com/away....0_23001&cc_key=
Redoctor : (3 недель назад) Тогда в телеграмме в поисковике набери Механоиды 3
Гость : (3 недель назад) Не открывается.
Redoctor : (3 недель назад) https://t.me/mechanoids3 Для тех кто в танке.
Yakim (Watco... : (4 недель назад) КРУЗИИИС!!!11

Изображение
lz : (4 недель назад) КРУЗИС!
lz : (4 недель назад) ЗИС
lz : (4 недель назад) КРУ
Yakim (Watco... : (4 недель назад) Крузис и Королева тоже не в моем вкусе, а проигрывать нечего =D
lz : (4 недель назад) Конечно, полюбить - так королеву, проиграть - так миллион, сделать - так крузис.
smt005 : (4 недель назад) И от третьего лица тоже можно сделать простенькую игру. Простая игра это лучше чем ничего.
smt005 : (4 недель назад) А, ты хочеш что-бы хит был, с "Crysis" графоном и контентом на 100500 часов игры?
Yakim (Watco... : (4 недель назад) Ни топдовншутеры, ни стратежки)
Yakim (Watco... : (4 недель назад) Не, спасибо, не в моем вкусе=)
smt005 : (4 недель назад) Помнится за пару недель от скуки сделал. Делал по вечерам.
smt005 : (4 недель назад)
smt005 : (4 недель назад) Или например такое, только с моделями из игры -> https://youtu.be/RFDdN5dcX8s
smt005 : (4 недель назад) Yakim, да сами себя пните... :) Сделайте что-то, хотя бы уровня "Scrolling TopDown Shooter".
Yakim (Watco... : (12 Июнь 2018 - 22:17) так что, думаю завтра с утреца стартану марафон)
Yakim (Watco... : (12 Июнь 2018 - 22:15) хе-хе, не сомневайся, я в чате по уе уже поинтересовался, сказали обалденный сериал)))
Yandersen : (12 Июнь 2018 - 20:56) Оооооо, поди ща залипнет на пару дней, стопудофф. :)
Yakim (Watco... : (12 Июнь 2018 - 18:28) Окей гляну)
Yandersen : (12 Июнь 2018 - 16:23) Сериал Пространство посмотри. Не по части Мехов, просто шикарен, авось ману доставит.
Yakim (Watco... : (11 Июнь 2018 - 18:50) Дуст и ты уже закаленные и пустые, надож где-то ману доставать)))
Yakim (Watco... : (11 Июнь 2018 - 18:49) Думаю, кого быть пнуть, что-бы тот пнул в ответ да по сильнее.
Yakim (Watco... : (11 Июнь 2018 - 18:48) Давненько и не маленько хе-хе, делать нечего, прокрастинирую =)
Yandersen : (11 Июнь 2018 - 17:46) Якимка, ты там шо, упоролсо маленько? Чиво картинами опспамилсо?
Yakim (Watco... : (09 Июнь 2018 - 22:27) Изображение

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

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