2010-09-10 4 views
2

Мне интересно, можно ли рисовать поверх поверхности opengl/direct3D с помощью GDI? и если да, то как это можно сделать?нарисовать opengl/D3D с GDI?

Причина, по которой я прошу, заключается в том, что я пишу простое приложение, чтобы нарисовать несколько вещей в играх. Такие вещи были бы двумерными или текстовыми, такими как информация о частоте кадров, пользовательский перекрестье, часы и т. Д.

Я знаю, что лучший способ - подключить и использовать все, что делает рендер/игра, изначально, будь то opengl или direct3d, но я смотрю на GDI, поскольку AFAIK и opengl и D3D сидят на контекстах устройств, которые, как я надеюсь, можно использовать с GDI.

ответ

3

Обычно вы не можете делать это напрямую. Теоретически вы можете смешивать GDI с OpenGL или DirectX тогда и только тогда, когда OpenGL/DirectX настроен для использования одиночной буферизации, не двойной буферизации. Это, однако, не более чем теоретическая возможность, потому что практически все использование DirectX и OpenGL осуществляется с двойной буферизацией.

Я бы попробовал что-то еще, например, нарисовал ваши данные в безграничном layered window.

+1

Я подтверждаю, что метод многоуровневого окна работает для контекстов open-gl (поскольку я уже использовал его для окна ** верхнего уровня **), но вы можете получить неожиданные результаты, поскольку Windows отвечает за (пере) рисование слоистых окна и повторного рисования окон ниже, если слоированное окно перемещается/обновляется. – dyp

1

Вы можете рисовать с помощью GDI в центральном буфере памяти с помощью CreateCompatibleDC, CreateCompatibleBitmap, SelectObject и GetDIBits. Остерегайтесь: Совместимый DC медленный (без двумерного ускорения). Затем вы должны скопировать (медленную операцию) из центральной памяти в текстуру.

Для текста вы можете копировать все символы ASCII один раз в текстуру, а затем использовать функции текстур D3D для копирования каждого символа. Это должно быть достаточно просто для моноширинных шрифтов US-ASCII.