Framebuffer: Начало

Framebuffer: Начало

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

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

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

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


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

Узнать больше об этом ресурсе...
 
2,505
81
397
Нельзя читать и писать в один и тот же рендер таргет. Пруф.
 
2,505
81
397
Читаешь из mc-буфера и пишешь в него.
 
Где?
В одноосевом блюре я бинжу майновский буфер и рисую в него текстурку из своего fbo
 
2,505
81
397
Одноосевой пример:
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();

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

Я на собственной машине (и не только) ловил undefined behaviour с чтением из текстуры забинженного на отрисовку буфера глубины.
Визуально было похоже на это, только было ограничено формой отрисовываемой модели:
1565035732899.png
 

CumingSoon

Местный стендапер
1,634
12
269
Гипотетически, не имеет смысла анбиндить, если можно сразу поставить другой буфер, например, майновский. Но дело в том, что я не знаю, что внутри функции анбиндинга, так что не могу быть уверенным в своих словах
 
Гипотетически, не имеет смысла анбиндить, если можно сразу поставить другой буфер, например, майновский
Да, в финальном коде под спойлерах анбинда нет. Емнип там биндится фбо с id 0
 
1,990
18
105
Анбинд по факту это бинд нулевого таргета. Конечно, можно просто сменить таргет на тот, текстура которого нигде не читается.
 
7,099
324
1,510
Какие там ещё задачи, кроме пост процессинга да заветрывания изображения сцены в текстурку?
Ну так поспроцессинг нужен для решения каких-то задач, про это и стоило бы рассказать
 
Нужен для эффектов, и я рассказал как сделать один из них
 
1,990
18
105
Постпроцессинг далеко не единственная задача фреймбуферов - есть варианты симуляции частиц на GPU с хранением промежуточного результата в текстуре, есть Hi-Z Occlusion Culling, для которого нужна цепочка буферов глубины, есть deferred lighting, и так далее. Пост-процессингом это не назовёшь, но это я к словам докопался.

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