Сглаживание в OpenGL - PullRequest
       12

Сглаживание в OpenGL

8 голосов
/ 06 ноября 2010

Я только начал с программирования на OpenGL и создаю приложение для часов. Я хочу, чтобы это выглядело так просто: http://i.stack.imgur.com/E73ap.jpg

Однако мое приложение выглядит очень "без сглаживания": http://i.stack.imgur.com/LUx2v.png

Я попробовал метод GL_SMOOTH_POLYGON, упомянутый в Красной книге. Однако, похоже, это ничего не делает.

Я работаю на ноутбуке с интегрированной графикой Intel. Карта не поддерживает такие вещи, как GL_ARB_multisample.

Какие у меня есть варианты, чтобы мое приложение выглядело сглаженным?

Ответы [ 2 ]

28 голосов
/ 06 ноября 2010

Интегрированные видеокарты Intel славятся отсутствием поддержки сглаживания OpenGL. Однако вы можете обойти это.

Первый вариант: суперсэмплинг вручную
Сделайте текстуру в 2 раза больше экрана. Рендеринг вашей сцены в текстуру через FBO, затем рендеринг текстуры в половину размера, чтобы он заполнил экран с билинейной интерполяцией. Может быть очень медленным (в сложных сценах) из-за 4-кратного увеличения пикселей для рисования.

приведет к слабому сглаживанию (поэтому я не рекомендую его для настольных программ, таких как ваши часы). Убедитесь сами:
antialiasing vs supersampling

Второй вариант: (расширенный)
Используйте шейдер для выполнения морфологического сглаживания . Это новая техника, и я не знаю, насколько это легко реализовать. Он используется в некоторых продвинутых играх.

Третий вариант:
Используйте текстуры и билинейную интерполяцию в ваших интересах, эмулируя примитивы OpenGL через текстуры. Техника описана здесь .

Четвертый вариант: Используйте отдельную текстуру для каждого элемента ваших часов.

Например, для часовой стрелки не используйте черный черный GL_POLYGON в форме стрелки. Вместо этого используйте повернутый GL_QUAD, текстурированный изображением стрелки часа, нарисованным в графической программе. Затем билинейная интерполяция позаботится о сглаживании его во время его вращения.

Этот вариант потребует минимум усилий и выглядит очень хорошо.

Пятый вариант:
Используйте библиотеку, которая поддерживает программный рендеринг -

  • Qt
  • Windows GDI +
  • WPF
  • XRender
  • и т.д.

Такие библиотеки содержат свои собственные алгоритмы сглаживания, поэтому они не зависят от вашей видеокарты для сглаживания. Преимущества:

  • Будет визуализировать то же самое на каждой платформе. (это не гарантируется OpenGL в различных случаях - например, толстые диагональные «галочки» на скриншоте отображаются в виде параллелограммов, а не прямоугольников)
  • Имеет большой набор удобных функций рисования ("drawArc", "drawText", "drawConcavePolygon", и они будут поддерживать градиенты и границы. Также вы получаете такие вещи, как класс Image.)
  • Некоторые, такие как Qt, предоставят гораздо больше функциональных возможностей типа настольных приложений. Это может быть очень полезно даже для приложения с часами. Например:
    • в приложении OpenGL вы, вероятно, будете повторять цикл каждые 20 мсек и пересчитывать часы, даже не задумываясь. Это потребует ненужных циклов работы процессора и приведет к его разгрузке на ноутбуке, что приведет к разрядке аккумулятора. В отличие от этого, Qt очень хорошо разбирается в том, когда он должен перерисовывать части ваших часов (например, когда правая половина часов перестает закрываться окном или когда ваши часы перемещают стрелку минуты на один шаг).
    • как только вы приступите к реализации, например, иконка в трее или диалог настроек для ваших часов, библиотека вроде Qt может сделать это проще простого. Хорошо использовать одну и ту же библиотеку для всего.

Недостатком является гораздо худшая производительность, но это не имеет никакого значения для приложения с часами, и оно меняется, если принять во внимание интеллектуальные функции перерисовки, о которых я упоминал.

Для чего-то вроде приложения с часами очень рекомендуется пятый вариант. OpenGL в основном полезен для игр, программ для 3D и графических приложений, таких как музыкальные визуализаторы. Для настольных приложений он слишком низкоуровневый, и реализации слишком сильно отличаются.

0 голосов
/ 06 ноября 2010

Нарисуйте его в объект кадрового буфера с двойным (или более) окончательным разрешением, а затем используйте это изображение в качестве текстуры для одного квада, нарисованного в реальном окне.

...