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

StackOverflow https://stackoverflow.com/questions/21560

  •  09-06-2019
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

wxWidgets не имеет Мультисэмплинг поддержка в их стабильные выпуски прямо сейчас (последняя версия на данный момент 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, поэтому эта информация станет неактуальной :-)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top