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


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

Yakim (Watco... : (3 дней назад) КРУЗИИИС!!!11

Изображение
lz : (3 дней назад) КРУЗИС!
lz : (3 дней назад) ЗИС
lz : (3 дней назад) КРУ
Yakim (Watco... : (3 дней назад) Крузис и Королева тоже не в моем вкусе, а проигрывать нечего =D
lz : (3 дней назад) Конечно, полюбить - так королеву, проиграть - так миллион, сделать - так крузис.
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... : (5 дней назад) так что, думаю завтра с утреца стартану марафон)
Yakim (Watco... : (5 дней назад) хе-хе, не сомневайся, я в чате по уе уже поинтересовался, сказали обалденный сериал)))
Yandersen : (5 дней назад) Оооооо, поди ща залипнет на пару дней, стопудофф. :)
Yakim (Watco... : (5 дней назад) Окей гляну)
Yandersen : (5 дней назад) Сериал Пространство посмотри. Не по части Мехов, просто шикарен, авось ману доставит.
Yakim (Watco... : (6 дней назад) Дуст и ты уже закаленные и пустые, надож где-то ману доставать)))
Yakim (Watco... : (6 дней назад) Думаю, кого быть пнуть, что-бы тот пнул в ответ да по сильнее.
Yakim (Watco... : (6 дней назад) Давненько и не маленько хе-хе, делать нечего, прокрастинирую =)
Yandersen : (6 дней назад) Якимка, ты там шо, упоролсо маленько? Чиво картинами опспамилсо?
Yakim (Watco... : (неделю назад) Изображение
Yakim (Watco... : (неделю назад) no, you are blind
Гость : (неделю назад) Изображение
lz : (неделю назад) Изображение
Yakim (Watco... : (2 недель назад) Изображение
Гость : (2 недель назад) Подкорректирую: скорее всего, Механоидов в названии уже не будет, кхм.
Гость : (2 недель назад) Не будет М3!.. :(
Yakim (Watco... : (2 недель назад) Нихуяшечки от нас не зависит)
Yandersen : (3 недель назад) Зависит от нас самих. От Скаев - надежды нет.
Гость : (3 недель назад) народ я тут хотел узнать есть шанс на меха 3 ?
Yakim (Watco... : (3 недель назад) точно? :huh: а если найду? :lol:
lz : (3 недель назад) да не, я не)
Yakim (Watco... : (3 недель назад) Егор, ты говоришь так. будто у тебя они есть, так вот, че по чем?))))
Гость : (3 недель назад) Вот бы сейчас, в 2018, читы на мехов гуглить...
lz : (3 недель назад) Ты просто без читов гоняешь.
Yandersen : (3 недель назад) Ниправда, этот сукасадист должен существовать, его не может не быть! Иначе на кого тяготы жизни сваливать?
Yakim (Watco... : (3 недель назад) Юморист от бога, которого нет)))
Гость : (3 недель назад) Бля, я думал это поиск
Гость : (3 недель назад) Читы
Yakim (Watco... : (4 недель назад) Ну как-бы да, насколько я помню, Дуст и Сплайн основатели =) Кажется идея Дуста, реализация Сплайна.
lz : (4 недель назад) Вон даже свалкер2 будет, а ты говоришь. И P4 будет)
Yandersen : (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 анонимных