WinGDI & OpenGL: так что же всё-таки такое - закадровый буфер?

Тема в разделе "WASM.OpenGL", создана пользователем Crollspase, 16 ноя 2009.

  1. Crollspase

    Crollspase New Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    75
    Здравствуйте все те, кто сейчас читает эти строки. В одном из моих проектов возникла необходимость совмещать вывод OpenGL и Windows GDI, а посему вся растровая информация должна быть готова в закадровом буфере до вызова SwapBuffers. Однако GDI сразу рисует всё в окно, и я понятия не имею как заставить его готовить изображение за кадром. Всвязи с этим возникли следующие вопросы: каким объектом GDI является закадровый буфер, как он стыкуется с контекстом устройства окна и как получить доступ ко всему, что в нём находится не выводя его в окно?
     
  2. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    рисовать вин гди в компатибле битмап дц а потом блитить куда угодно
     
  3. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    а к плоскостям отображения можно получить доступ через директ драв интерфейсы. только вам это лишнее
     
  4. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    qqwe

    Рендерить тогда тоже придется в компатибл битмап дц, иначе будут моргания. И еще х.з. что на это OpenGL скажет :)
     
  5. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    _DEN_
    ничего не понял. после вывода в дц привязанный к совместимой с экраном картинке, вы имеете эту самую картинку со всем, что вы навыводили через вин гди. картинку эту вы можете вывести хоть в виде текстуры на майку вашего 3д огл персонажа. причем тут моргания? или вы както по другому поняли?
    впрочем, если углубиться, то можно получать дц на дир драв теневую плоскость и рендерить вин гди прямо туда. в таком случае ничего блитить не понадобится. но такой способ несколько сложнее и у него есть довольно серьезные ограничения
     
  6. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    qqwe

    Back-buffer OpenGL не имеет отдельного HDC, и есть сделать BitBlt из совместимого HDC, то отрисовка пойдет на Front-buffer. Сделовательно, возможность совместить "в лоб" только одна - SwapBuffers с последующим BitBlt, что приведет к морганию.
     
  7. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    _DEN_
    я плохо знаю тонкости релизации огл на выньде, но в дх3d картинку вывести можно как текстуру, как фон и прямым обращением к буфферу директ драв. и нигде не моргает. даже если прямое обращение к буфферу огл невозможно (хотя, вроде на вынь огл реализовано как надстройка над дх, те юзают те же первичные буфера) то первые два способа (есть еще спрайты, но я ими не пользовался) никто не отменял и под огл

    совместимый дц на картинку нужен только для того, чтоб рисовать не на экране, а на битмапе. считай, на отдельном буфере. ну а способов вывести обычную картинку должно быть
     
  8. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    qqwe

    Это называется установить текстуру как render target. Это понятия D3D API, а BitBlt тут не при чем.

    Спасибо, конечно, за экскурс в GDI, однако ты так и не понял главного - back-buffer не имеет отдельного HDC ни в OpenGL, ни в D3D, поэтому совместить GPU и D3D рендеринг без морганий не получится. Нужно рендерить в compatible dc, после чего уже финальным BitBlt выводить результат на видимый dc. Однако не ясно, можно ли рендерить средствами OpenGL/D3D в compatible dc - вот этот вопрос и нужно выяснить.

    [​IMG]
     
  9. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    _DEN_
    я довольно плохо разбираюсь в тонкостях терминологии и не вижу большой нужды углубляться в нее. терминов много, меня мало. приходится тратить память только на минимально необходимое

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

    прямой доступ к первичным буферам это из области полуофициального изврата. с соответсвующей неудобоваримостью в реализации.

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

    картинки не понял. вы спать хотите? спите, разрешаю
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    facepalm
     
  11. Com[e]r

    Com[e]r Com[e]r

    Публикаций:
    0
    Регистрация:
    20 апр 2007
    Сообщения:
    2.624
    Адрес:
    ого..
    кён-кун советует пользоваться вариантом из никчёмного второго сезона:
    [​IMG]
     
  12. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    qqwe

    Я, кажется понял, что ты предлагаешь. Рисуем на GDI в compatible dc, получаем растр отрисованного изображения, стримаем его в D3D (OpenGL) -текстуру, которую уже рендерим, и таким образом получаем сразу D3D+GDI в back-buffer-е. Ну это слишком искусственный прием, чтобы сказать что это "Совмещение рендера OpenGL и GDI".
     
  13. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Вопрос. Начерта это надо? Подобное однажды использовал для вывода гдишных шрифтов. Рисовал на dc, потом копировал в текстуру. Возможно ещё можно использовать scissors, но это какая-то экзотика.
     
  14. Crollspase

    Crollspase New Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    75
    Прошу извинить меня за долгий неответ в собственной же теме.

    Crollspase:
    Каюсь, что сам того не желая создал дополнительный, совершенно ненужный мне аспект темы для размышления и рассуждения. Я знаю, что OpenGL можно визуализировать на аппаратно-зависимый битмэп (DDB) и то же самое можно сделать для GDI. Но мне хотелось, чтобы вы помогли мне получить доступ к заднему буферу OpenGL, а не искали альтернативный способ решения проблемы.

    qqwe:
    qqwe, сразу видно что ты либо смотрел в своей жизни слишком мало аниме или не смотрел его вообще, либо смотрел, но не внимательно. Объясняю (возможно, я ошибаюсь, но ошибаюсь я вряд ли): этой картинкой _DEN_ хочет сказать, что ты высказал глупость:

    qqwe:
    с чего ты это взял?

    Booster:
    Мне почему-то кажется, что если заставить и OpenGL и GDI рисовать в буфер OpenGL, то SwapBuffers визуализирует изображение в окно с меньшими затратами по быстродействию, чем если вся визуализация пойдёт на специально созданный для этого аппаратно-зависимый битмэп. Если вы абсолютно уверенны, что я не прав – скажите мне об этом.
     
  15. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Crollspase

    Глупость не в этом. Пусть OpenGL хоть 10 раз будет надстройкой над D3D. Смысл в том, что этот факт не имеет абсолютно никакого отношения к вопросу - OpenGL имеет свой интерфейс, который абсолютно никак не зависит от его реализации.
     
  16. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Crollspase
    OpenGL использует аппаратный внеэкранный буфер, рисовать на него GDI очень затратно. GDI блиттинг очень быстр, так как тоже использует аппаратные возможности.
     
  17. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    про то, что мс огл реализовано поверх дх, действительно, пишут не на каждом столбе. уж сильно агрессивно воюют огл-щики д3д-шниками. вот тут со слов "MSOGL" об этом можно прочитать. дальше искать лениво
    кроме того, как истинный низкоуровневик, вы можете озадачиться поисками огл-специфических переходов в ядро

    в выни есть 2 апи отрисовки. совершенно разных и по рождению и по предназначению.
    1) нативный гди, перенесенный еще из вынь 3.11, 3.1
    2) купленный директ драв - директ3д

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

    доступ к самому нижнему уровню дх видеоконвейера предоставляет директ драв. а что там поверх (интерфейс) - не имеет настолько большого значения

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

    Crollspase
    вообще говоря, когда вам отвечают желательно реагировать минимум на порядок вежливее.

    ЗЫ в аниме я абсолютно безграмотен. также как в толкиене, зорро, брюс ли, звездных войнах и прочих увлечениях детей всех времен и народов. посему будет просьба не отвечать непонятными непосвященным выдержками из них.
     
  18. Crollspase

    Crollspase New Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    75
    qqwe:
    Ни за что не поверю! Вместо того чтобы слушать некоего MSOGL давайте обратимся к фактам: OpenGL является кроссплатформенной библиотекой, то есть она не зависит от ОСи и является вполне самодостаточной. Единственное чего ей не хватает – кода для работы с железом на самом низком уровне, который ИМХО вовсе не входит в DDraw, а является дисплейными драйверами.

    qqwe:
    Если всё действительно так, то D3D-шникам факт того, что OpenGL базируется на Direct Draw – на руку: "Вот, мол, OpenGL OpenGL'ем, а без Direct X он в Винде – ничто!"

    qqwe:
    Ну, извини, если мои слова показались тебе грубостью, хотя вообще-то я не пытался тебя чем-то задеть, да и смайлов не использовал…

    qqwe:
    Ну, во-первых, аниме это не увлечение детей, а вид искусства которым увлекаются и взрослые люди, а во-вторых, пусть мне 20 лет, но я не очень не люблю общаться с большинством своих ровесников из-за своей гораздо более сильной моральной зрелости, однако смотреть аниме мне очень нравится.

    ЗЫ: Прошу прощения за оффтоп, но: это у меня одного уведомления о новых сообщениях в теме не приходят на e-mail или щас у всех так?
    И ещё ЗЫ: уважаемые модераторы и администраторы! Убедительная просьба: не перемещайте тему в HEAP только потому, что в конце темы появляется некоторое количество косвенных оффтопов, причиной для написания которых послужило общение в теме.
     
  19. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    Кстати в пользу того, что OpenGL не есть 100% надстройка над D3D говорит тот факт, что на нвидовских картах достаточно поставить дрова и будет доступен весь OpenGL вплоть до 3.2 (DX11), при том, что родной DX на XP это 8.1.
     
  20. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    Зачем делать через надстройку? Зачем создавать себе лишний геморой? Зачем что-то делать через костыли? Ответ - надстройки нет и быть не может. В основном все вызовы OpenGL идут сразу в дров, кстати в этом заключается определённый буст перед DirectX. Известно, что DIP в Openg гораздо менее затратен по сравнению с DirectX.