Framebuffer: Начало

Framebuffer: Начало

implicit добавил(а) новый ресурс:

Framebuffer: Начало - Рисование в текстурку

Эта статья посвящена буферам кадра(framebuffers), как их использовать, зачем нужны, и какие в майнкрафте есть средства для удобной работы с ними.

В интернете есть много туториалов на эту тему, но использование буфера кадра в контексте уже написанной игры не так очевидно, как на чистом приложении.


Итак, что же все такие такое фреймбуфер?
Framebuffer object(FBO) - объект opengl, который позволяет рисовать объекты не напрямую на экран, а внутрь себя.
Таким образом мы может рисовать...

Узнать больше об этом ресурсе...
 
Нельзя читать и писать в один и тот же рендер таргет. Пруф.
 
Читаешь из mc-буфера и пишешь в него.
 
Где?
В одноосевом блюре я бинжу майновский буфер и рисую в него текстурку из своего fbo
 
Одноосевой пример:
GL13.glActiveTexture(GL13.GL_TEXTURE3);
// забиндил mc текстуру в 3-ий юнит
GL11.glBindTexture(GL_TEXTURE_2D, mc.getFramebuffer().framebufferTexture);
GL13.glActiveTexture(GL13.GL_TEXTURE0);

ShaderRegister.BLUR.start();
ShaderRegister.BLUR.textureUnits();
ShaderRegister.BLUR.loadDisplaySize();
ShaderRegister.BLUR.horizontal();

// забиндил mc буффер. собираешься писать в mc текстуру
mc.getFramebuffer().bindFramebuffer(false);
GL11.glPushMatrix();
GL11.glBindTexture(GL11.GL_TEXTURE_2D, framebuffer.framebufferTexture);
GL11.glMatrixMode(GL_PROJECTION);
GL11.glLoadIdentity();
GL11.glMatrixMode(GL_MODELVIEW);
GL11.glLoadIdentity();
drawQuad(); // читаешь из mc текстуры ()в шейдере)
GL11.glPopMatrix();

ShaderRegister.BLUR.stop();

В двуосевом тоже самое, но только во втором проходе.
 
А это-то. Да, не мешало бы скопировать текстурку. Хотя и текущий вариант у меня особо проблем не вызывает.
Спасибо
 
На моей видеокарте тоже не вызывает. Но на самом деле тут неопределенное поведение. Если выкатывать в продакшн, то юзеры могут ловить неприятные артефакты.
 
Никто их так и не словил, я уже делал эффекты подобным образом, правда им пользовалось от силы 100 человек.
Но кончено да, исправлю на копирование.
UPD: переделал на копирование
 
Последнее редактирование:
  • Like
Реакции: CMTV
Вызовутся артефакты или нет зависит ещё и от того что, собственно, с текстурой делается. Но, как выше сказали, таких ситуаций в принципе нельзя допускать (когда вызывается drawcall, в котором читаются текстуры забинженных таргетов для отрисовки, даже если в эти таргеты ничего не рисуется в итоге). В таком случае надо просто отключать таргет (убирать аттачмент, например).

Я на собственной машине (и не только) ловил undefined behaviour с чтением из текстуры забинженного на отрисовку буфера глубины.
Визуально было похоже на это, только было ограничено формой отрисовываемой модели:
1565035732899.png
 
Гипотетически, не имеет смысла анбиндить, если можно сразу поставить другой буфер, например, майновский. Но дело в том, что я не знаю, что внутри функции анбиндинга, так что не могу быть уверенным в своих словах
 
Гипотетически, не имеет смысла анбиндить, если можно сразу поставить другой буфер, например, майновский
Да, в финальном коде под спойлерах анбинда нет. Емнип там биндится фбо с id 0
 
Анбинд по факту это бинд нулевого таргета. Конечно, можно просто сменить таргет на тот, текстура которого нигде не читается.
 
Какие там ещё задачи, кроме пост процессинга да заветрывания изображения сцены в текстурку?
Ну так поспроцессинг нужен для решения каких-то задач, про это и стоило бы рассказать
 
Нужен для эффектов, и я рассказал как сделать один из них
 
Постпроцессинг далеко не единственная задача фреймбуферов - есть варианты симуляции частиц на GPU с хранением промежуточного результата в текстуре, есть Hi-Z Occlusion Culling, для которого нужна цепочка буферов глубины, есть deferred lighting, и так далее. Пост-процессингом это не назовёшь, но это я к словам докопался.

Как вводный тутор имхо норм, в следующих туторах можно было бы пояснить за MRT/антиалиасинг (на примере MSAA через фреймбуферы + блит в финальный таргет)/стенсил аттачменты. Это всё не про фреймбуферы как таковые, в целом, но очень пересекается.
 
Вопрос как же перенести картинку с фреймбуфера в майнкрафт?
Через тесселятор?
 
Последнее редактирование:
Просто забиндить ее. И уже с ней рисовать, можно и через тесселятор, да
 
Назад
Сверху