Смешивание OpenGL и GDI в Windows - PullRequest
       30

Смешивание OpenGL и GDI в Windows

2 голосов
/ 05 января 2009

Я пытаюсь найти способ смешать рендеринг OpenGL и GDI в Windows. Ранее я рендерил свое содержимое OpenGL в объект framebuffer, извлекал его, а затем помещал в графический контекст Windows GDI, а затем рисовал мой материал GDI поверх. Это действительно наносит вред частоте кадров.

Я хотел бы сделать противоположное тому, что я делаю сейчас, поэтому мой рендеринг OpenGL выполняется непосредственно в окне, а затем я рендерирую GDI-контент в растровое изображение, которое загружается в текстуру, а затем накладывается с помощью четырехугольника. Материал GDI не сильно меняет все, поэтому мне не нужно перерисовывать его каждый кадр, я могу просто кэшировать текстуру.

Я почти могу заставить его работать, проблема в том, что я не могу получить правильные альфа-значения из растрового изображения GDI, поэтому текст и строки получают ужасные неровности.

У кого-нибудь есть полезные ресурсы, как это сделать? Можно ли даже заставить GDI или GDI + записывать в альфа-канал так, как мне нужно?

Ответы [ 3 ]

2 голосов
/ 11 января 2009

Все ли это действительно необходимо? Вы должны иметь возможность просто использовать функции GDI для рисования в том же контексте устройства, что и ваш OpenGL.

2 голосов
/ 11 января 2009

Я думаю, было бы проще, если бы вы использовали сырой OpenGL для рендеринга, а не GDI. Просто создайте некоторые функции-оболочки и вызывайте их вместо GDI.

0 голосов
/ 14 января 2009

Как насчет использования трафарета. Копируйте свою текстуру в буфере трафарета. Используйте GL_NOTEQUAL в качестве тестовой функции со значением ссылки, равным значению фона текстуры. Сначала выполните рендеринг OpenGL, затем включите трафарет, а затем визуализируйте текстурированный прямоугольник.

Вы не указываете, является ли это проблемой 2D или 3D. Зубцы могут быть проблемой глубины в трехмерном мире, где все почти в одной плоскости. Если вы работаете в 3D, убедитесь, что текстурированный прямоугольник находится перед всем остальным, или измените z-буфер.

...