Задача рисовать прямоугольник выделения без ререндера сцены.
Рисую с glBlendFunc( GL_ONE_MINUS_DST_COLOR, GL_ZERO );
Потом swap_buffers; И даже рисуется
Но только на winXP, т.к. там почему-то в GL_BACK автоматически оказывается содержимое GL_FRONT.
Зависит от места, в котором ты вызываешь отрисовку.
Ну вот так например попробуй (если после свапбуфферс основного рисования):
glDrawBuffer( GL_FRONT );
// рисуем
glDrawBuffer( GL_BACK );
Долго я радовался этому хаку (хотя на opengl.org указан как легит путь), но таки обнаружилась небольшая проблема: на некоторых системах ничего из нарисованного во фронт буффер не отображается при включённом MSAA.
Было примерно так:
C++ Source Code:
1
wglMakeCurrent
2
glDrawBuffer( GL_FRONT );
3
//рисуем гуи;
4
glDrawBuffer( GL_BACK );
5
wglMakeCurrent //<-без этого следующие нормальные отрисовки со свопбуфферс визуально отстают на фрейм
Поэтому решил попробовать схоронять статичный отрендеренный кусок в текстуру и потом поверх рисовать всякие гуёвые динамические штуки (ну и чтоб цветами можно было рисовать):
С этим вариантом две незадачи:
1. С MSAA сохранённая текстура выглядит как сумма семплов (линии жирные)
2. Другие огл окна в приложении заметно теряют фпс
Например движение в камере = обновление лениво нарисованной иконки камеры на сетке; камера становится явно менее плавной из-за SwapBuffers в ленивой отрисовке
Если рисовать текстуру во фронт без свопа - плавность возвращается (и баг с неотрисовкой при MSAA, разумеется, тоже-)
Возможно есть более совершенные способы ленивой отрисовки без названных проблем?
Удалось завести FBO (хвала Аллаху!)
Непонятное с блит с ресолвингом: во фронт, похоже, нельзя, в бэк можно, но тогда нужен свопбуферс (и, что характерно, при таком способе ресолвится)
Сделал блит из мультисэмплового FBO в простой с приколоченной текстурой и нарисовал её на кваде - получаются жирные линии хоть со свопбуферс, хоть без.
Пока идеи заканчиваются на возможно разных форматах colour attachment, то таки ж написано, что обои GL_RGB
Что во фронт нельзя? Нарисовать квад с текстурой заресолвленного фреймбуфера нельзя? С какого перепугу?
Один FBO с GL_COLOR_ATTACHMENT0 Multisample Renderbuffer, другой с glFramebufferTexture2D
Из первого во второй блитится, но без ресолвинга, фиг знает почему
Это для самой сцены, в ней получаются жирные линии; У контекста MSAA выкл (можно и вкл, на картинку не влияет)
Цитата:
Он всегда нужен, если у тебя дабл-буферинг включен у контекста. Не вижу проблемы.
Да, я тупанул, основную сцену можно бы и со своп нарисовать; Так надёжнее будет, а то, зафорсив MSAA в настройках драйвера, можно получить шанс не увидеть весёлых картинок вовсе.
Рисование во фронт нужно для ленивого гуи, чтоб плавность не убить
Я бы скорее поставил на поверхностное понимание api
На другой системе у человека тоже не ресолвится
Сделал через промежуточный FBO вместо текстуры, т.к. блит в главбуфер опасный (если через драйвер включён несовпадающий с моим MSAA, то блита не будет)
Так же не ресовится, моя не пони май
Код целиком такой: