Как нарисовать пиксель?

Тема в разделе "WASM.BEGINNERS", создана пользователем themind, 17 окт 2005.

  1. themind

    themind New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2005
    Сообщения:
    9
    Нужно буквально следующее: полноэкранное приложение и возможность рисовать пиксель, желательно без всяких сообщений WM_PAINT, ведь в полноэкранном приложении нет необходимости разделять экран между приложениями. Возможно ли такое? Дайте наводку, где читать, какие апи (или не апи) функции использовать? Спасибо всем, кто ответит.
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Windows GDI, DirectX, OpenGL — выбирай.
     
  3. themind

    themind New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2005
    Сообщения:
    9
    Долго искал в Windows GDI функцию, которая рисует пиксель, но так и не нашёл
     
  4. Maggot

    Maggot New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2005
    Сообщения:
    17
    Используй DirectDraw. Там нет функции, которая рисует пиксел, там можно изменять видеопамять. То есть изображение - это квадратная матрица цветов, где можно менять значения, а соответственно меняется и цвет пиксела на экране. Читать можно MSDN на сайте микрософт.

    Это всё подходит, если хочешь рисовать 2d рисунки, или просчитывать 3d вручную.
     
  5. Maggot

    Maggot New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2005
    Сообщения:
    17
    И ещё. На сайте микрософт было написано что DirectDraw работает быстрее, чем GDI. Наверное сейчас это не так... Почему же тогда в 8 версии FlashPlayer'а не используется DDraw?
     
  6. themind

    themind New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2005
    Сообщения:
    9
    Полез в майкрософтовский MSDN, нашёл там такую вещь:

    Warning: Microsoft® DirectDraw® has been deprecated. Deprecated components of Microsoft DirectX® 9.0 for Managed Code are considered obsolete. While these components are still supported in this release of DirectX 9.0 for Managed Code, they may be removed in the future. When writing new applications, you should avoid using these deprecated components. When modifying existing applications, you are strongly encouraged to remove any dependency on these components.

    Перевод: Не используй DirectDraw, ибо его скоро удалят из DirectX

    Может быть поэтому он там и не используется
     
  7. Maggot

    Maggot New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2005
    Сообщения:
    17
    Да это микрософт говорит, что DDraw устарело и тд. и вообще, теперь они хотят развивать технологию управляемогого кода, то есть исползование скриптовых языков таких как C#, но тогда ты и за секунду все пикселы на экран не выведешь, потому что тормоза нереальные. Вобщем, если обычные приложение перестанут поддерживаться, то на асме програмировать не получится, придется переходить на P-код( асм для виртуальной машины) :))))))))))
     
  8. Maggot

    Maggot New Member

    Публикаций:
    0
    Регистрация:
    31 июл 2005
    Сообщения:
    17
    А какая разница используется или нет, это ведь отдельная библиотека.
     
  9. themind

    themind New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2005
    Сообщения:
    9
    Maggot

    Ты же не будешь тоскать в своём приложении отдельную библиотеку для каждой Винды?
     
  10. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    themind

    В GDI есть два способа: с помощью SetPixel установить какой-то пиксел (один, если вздумаешь картинку выводить через эту функцию, получишь зверские тормоза) либо создать в памяти картинку, нарисовать, что надо (просто работая с памятью) и скопировать в контекст.



    В DirectDraw есть метод для залочивания видеобуфера, в результате получаем указатель на память и с ней работаем.



    Что в OpenGL — не помню, смотри спецификацию.
     
  11. dead_body

    dead_body wasm.ru

    Публикаций:
    0
    Регистрация:
    3 сен 2004
    Сообщения:
    603
    Адрес:
    Украина;г.Харьков;г.Н.Каховка
    так что можно сделать что бы вывести картинку в окно, притом что картинка в памяти уже есть(типа врукопашку наваяли 3д)
     
  12. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.348
    dead_body

    BitBlt или StretchBlt (если нужно растянуть картинку под определенный размер)
     
  13. themind

    themind New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2005
    Сообщения:
    9
    Кстати, а можно ли получить доступ к видеокарте или видеопамяти, вообще не пользуясь сервисами винды типа DirectX и т.п. Например, вывод в порт или доступ к видеопамяти, как в досе?
     
  14. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    themind

    Угу. Только если мне кто скажет в какие порты и что писать... По сути фигня - только свой драйвер видео написать. Одна проблема - не знаю как для Intel'а, на котором строится большинство онбордных видеоадаптеров, но ATI с nVidia зашифровались насмерть. То есть низкоуровневой документации, как то описания портов видюхи, на сих монстров я не нашел, хотя искал очень усердно. Вопрос - но пишут же? На тот же линух например... Им документацию производитель что, продает за деньги?
     
  15. themind

    themind New Member

    Публикаций:
    0
    Регистрация:
    15 окт 2005
    Сообщения:
    9
    Ustus

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

    Ещё я встречал такое понятие, как стандарт VESA, оно здесь никак помочь не может?
     
  16. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    themind

    Драйвера уже успешно выдержали три моих приступа энтузиазма :) Там все непросто, ибо используется инфа, уже определенная системой, привязаная к конкретному железу (ведь драйвера например ATI заточены не под конкретную железяку, а под семейство, скажем евойные Catalyst'ы делаются под всю линейку RADEON) и не перерыв еще кучу всякого дорыться невозможно. И потом - ну подсмотрю я как оно режим устанавливает - увижу множество операций с портами... можно втупую сдирать, но смысл останется непостигнут.



    Что же касается VESA - это на совести производителя. У nVidia таки хватило совести реализовать 3.0, а ATI забили, у них 2.0, а это значит, что управлять частотой развертки никак, что, в свою очередь, означает биосовский рефреш рейт - как правило 60Гц в графических режимах. На 17-ти дюймовке глаза вылазиют :dntknw:



    Единственно что мне так и не понятно - ну блин, ну что за коммерческая тайна! Ну что, трудно доки в сеть выкинуть? Или боятся, что народ устрашится корявости? :) Так меня после CGA/EGA/VGA уже врядли что-то устрашит :)
     
  17. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Использовать OpenGL или DirectX только для того, чтобы нарисовать пиксель в окне - это просто не рационально. Тут банальный SetPixel надо использовать и работать будет хоть на Windows 95 без ускорителя. Если пикселей много - SetDIBits.