Можно ли рисовать с помощью opengl в прямом dc / буфере?

Вероятно, это глупый вопрос, но я не могу найти хороших примеров того, как это сделать, или если это вообще возможно. Я только что закончил с проектом, в котором я использовал gdi для переноса материала в буфер DIB, а затем переставлял его на экран hdc, в основном создавая свою собственную цепочку подкачки и рисовал с помощью opengl.

Тогда я подумал, могу ли я сделать то же самое с помощью directx11? Но я не могу найти, где DIB / буфер, который мне нужно изменить, даже.

Я вообще правильно об этом думаю? Есть идеи, как с этим справиться?


person Charlie    schedule 27.09.2015    source источник


Ответы (2)


Да, ты можешь. Nvidia предоставляет расширения для конкретных поставщиков, называемые NV_DX_interop и NV_DX_Interop2. С помощью этих расширений вы можете напрямую обращаться к поверхности DirectX (когда она находится на графическом процессоре) и выполнять рендеринг на нее из контекста OpenGL. Для этой операции должны быть минимальные (только драйверы) накладные расходы, и ЦП почти никогда не будет задействован.

Обратите внимание: хотя это расширение зависит от производителя, Графические процессоры Intel также поддерживают его.

Однако не делайте этого просто для удовольствия или если вы контролируете весь исходный код своего приложения. Этот тип сценария взаимодействия предназначен для случаев, когда у вас есть две устаревшие / сложные кодовые базы, и взаимодействие является более дешевым / лучшим вариантом, чем перенос всей логики на другой API.

person Ani    schedule 27.09.2015

Да, вы можете это сделать, и OpenGL, и D3D поддерживают как записываемые текстуры, так и блокировку их для доступа к данным пикселей.

Просто визуализируйте свою сцену в OpenGL в текстуру, заблокируйте ее, прочитайте пиксельные данные и передайте их непосредственно в данные пикселов заблокированной текстуры D3D, разблокируйте ее, а затем делайте с текстурой все, что захотите.

Производительность, конечно, была бы ужасной, вы несколько раз останавливаете GPU за одну «операцию» и заставляете его синхронизироваться с CPU (который передает данные) и шиной (для доступа к памяти). Плюс абсолютно никакой пользы не было бы. Но если вы действительно хотите попробовать, вы можете это сделать.

person Blindy    schedule 27.09.2015
comment
Значит, это плохая идея? Я надеялся рисовать прямо в буфере цепочки подкачки directx, как бы используя dx только для вывода материала на экран. - person Charlie; 27.09.2015
comment
так что я должен сосредоточиться на opengl при попытке сделать графику, или DirectX более мощный? у тебя есть идеи? Я склоняюсь к opengl, но я беспокоюсь, что потеряю контроль над самим окном - person Charlie; 27.09.2015
comment
Они одинаково сильны - person Blindy; 27.09.2015
comment
что, если я хочу сохранить контроль над самим окном? похоже, что вызовы opengl (glew) используют стандартное окно - person Charlie; 27.09.2015
comment
Нет, это неправда. Существует способ рендеринга с использованием OpenGL на поверхность DirectX, резидентную в памяти графического процессора, без передачи данных. - person Ani; 27.09.2015
comment
Это то, что я подозревал, но где найти информацию об этом? - person Charlie; 27.09.2015
comment
Оглядываясь назад, можно сказать, что поиск в Google взаимодействия с OpenGL DirectX дает некоторые результаты, но я знал об этом расширении, исследовав это для моего предыдущего проекта. - person Ani; 27.09.2015