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

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

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

1 Ответ

4 голосов
/ 22 августа 2008

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

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

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

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

  2. Получите исправление для вашей рабочей установки wxWidgets.

Я нашел второй вариант менее громоздким, поскольку я не хочу как можно больше мешать моей рабочей установке. Если вы не знаете, как установить исправления в Windows, см. this .

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

...