Как включить мультисэмплинг для программы wxWidgets OpenGL?

Мультисэмплинг - это способ применения полноэкранного сглаживания (FSAA) в 3D-приложениях. Мне нужно использовать мультисэмплинг в моей программе OpenGL, которая в настоящее время встроена вграфический интерфейс wxWidgets . Есть ли способ сделать это? Пожалуйста, отвечайте, только если вы знаете подробные шаги для достижения этой цели.

Мне известно о включении мультисэмплинга с использованием WGL (расширения Win32 для OpenGL). Однако, поскольку моя программа OpenGL не написана на MFC (и я хочу, чтобы код был мультиплатформенным переносимым), это не вариант для меня.

22.08.2008 01:16:26
1 ОТВЕТ
РЕШЕНИЕ

Наконец-то я запустил Multisampling с моей программой wxWidgets OpenGL. Сейчас это немного грязно, но вот как:

В своих стабильных выпусках wxWidgets не поддерживает Multisampling (последняя версия на данный момент - 2.8.8 ). Но это доступно как патч, а также через их ежедневный снимок. (Последнее отрадно, так как это означает, что патч был принят и должен появиться в более поздних стабильных выпусках, если проблем нет.)

Итак, есть 2 варианта:

  1. Загрузите и соберите их ежедневный снимок .

  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, что сделает эту информацию неактуальной :-)

4
23.05.2017 12:24:29
На wxWidgets 3.0.2 это работает без исправлений. Спасибо, это решило мою проблему.
kshepherd 5.12.2016 19:11:02