Как включить мультисэмплинг для программы wxWidgets OpenGL?
-
09-06-2019 - |
Вопрос
Мультисэмплинг это способ применения полноэкранное сглаживание (FSAA) в 3D-приложениях.Мне нужно использовать мультисэмплирование в моей программе OpenGL, которая в настоящее время встроена в wxWidgets Графический интерфейс.Есть ли способ сделать это?Пожалуйста, ответьте, только если вы знаете подробные шаги для достижения этой цели.
Мне известно о включении мультисэмплинга с помощью ВГЛ (Расширения Win32 для OpenGL).Однако, поскольку моя программа OpenGL не написана на MFC (и я хочу, чтобы код был переносимым на несколько платформ), это не вариант для меня.
Решение
Я наконец-то заработал мультисэмплинг с моей программой wxWidgets OpenGL.Сейчас это немного запутанно, но вот как:
wxWidgets не имеет Мультисэмплинг поддержка в их стабильные выпуски прямо сейчас (последняя версия на данный момент 2.8.8).Но он доступен в виде патча, а также через ежедневный снимок.(Последнее радует, поскольку означает, что патч был принят и должен появиться в более поздних стабильных выпусках, если не возникнет проблем.)
Итак, есть 2 варианта:
Скачивайте и собирайте из их ежедневный снимок.
Получить пластырь для вашей рабочей установки wxWidgets.
Я нашел второй вариант менее громоздким, так как я не хочу максимально мешать моей рабочей установке.Если вы не знаете, как установить патч в Windows, см. этот.
По крайней мере, для Windows патч изменит следующие файлы:
$(WX_WIDGETS_ROOT)/include/wx/glcanvas.h
$(WX_WIDGETS_ROOT)/include/wx/msw/glcanvas.h
$(WX_WIDGETS_ROOT)/src/msw/glcanvas.cpp
После исправления, перекомпилировать библиотеки wxWidgets.
Чтобы включить мультисэмплинг в вашей программе wxWidgets OpenGL, необходимо внести незначительные изменения в код.
Список атрибутов необходимо передать в wxGLCanvas конструктор:
int attribList[] = {WX_GL_RGBA,
WX_GL_DOUBLEBUFFER,
WX_GL_SAMPLE_BUFFERS, GL_TRUE, // Multi-sampling
WX_GL_DEPTH_SIZE, 16,
0, 0};
Если вы уже использовали список атрибутов, добавьте строку с GL_SAMPLE_BUFFERS, GL_TRUE
к этому.В противном случае добавьте это определение списка атрибутов в свой код.
Затем измените конструктор wxGLCanvas, чтобы он принимал этот список атрибутов в качестве параметра:
myGLFrame::myGLFrame // Derived from wxGLCanvas
(
wxWindow *parent,
wxWindowID id,
const wxPoint& pos,
const wxSize& size,
long style,
const wxString& name
)
: wxGLCanvas(parent, (wxGLCanvas*) NULL, id, pos, size, style, name, attribList)
{
// ...
}
После создания элемента wxGLCanvas мультисэмплинг включается по умолчанию.Чтобы отключить или включить его по желанию, используйте соответствующие вызовы OpenGL:
glEnable(GL_MULTISAMPLE);
glDisable(GL_MULTISAMPLE);
Мультисэмплинг теперь должен работать с программой wxWidgets OpenGL.Надеемся, что вскоре он будет поддерживаться в стабильной версии wxWidgets, поэтому эта информация станет неактуальной :-)