На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Модераторы: Romtek, volvo877
  
    > Графика в различных режимах, для Borland Pascal
      Программирование графики в различных режимах.

      Часто люди задаются вопросом, как написать графическую программу, которая использует больше, чем 16 цветов (egavga.bgi) или даже 320x200x256. В свое время я тоже над этим долго мучался, и хочу выложить то, что у меня получилось. Это модуль для работы с графикой в различных режимах: стандартные и нестандартные.
      Пожалуй, единственный стандартный режим, который пока доступен - это 320 на 200. Тут все достаточно просто: кусок памяти начиная с адреса $A000:0000 размером в 64000 байт, на каждый байт по одной точке.
      Нестандартные режимы отличаются несколькими вещами:
      • организацией памяти
      • можно поставить почти любое разрешение экрана
      Это (второй пункт), конечно, сделать несколько сложно, т.к. все значения, которые надо записать в определенном порядке в определенные порты VGA чаще всего подбираются методом проб и ошибок. Но добрые люди это уже сделали за нас, и, поэтому, будем пользоваться готовым кодом.
      Пару слов о том, как устроена видеопамять в нестандартных режимах. Опять же, она лежит по адресу $A000:0000, но на каждый байт приходится по 4 (!) точки. Это достигается наличием так называемых "битовых плоскостей". Т.е. в зависимости от того, какую плоскость мы выбрали, определяется, где будет находится очередной пиксель. Например, составим небольшую табличку для объяснения этой схемы:
      ExpandedWrap disabled
        Nr пикселя     Nr плоскости   Адрес памяти
        0             0            $A000:0000
        1             1            $A000:0000
        2             2            $A000:0000
        3             3            $A000:0000
        4             0            $A000:0001
        5             1            $A000:0001
        ...

      Одновременно можно ставить пиксели во все 4 плоскости, что при разумном использовании дает выигрыш по скорости в 4 раза.
      Переключение плоскостей - достаточно медленный процесс. Поэтому, есть смысл создавать изображение в памяти (не видео), а потом переносить его на экран по плоскостям. Так можно убить сразу же двух зайцев: увеличит скорость (fps) и обеспечить возможность для анимации без мерцания.

      Поддерживаемые разрешения.
      256x256 (256 цветов)
      320x100 (256 цветов)
      320x200 (256 цветов)
      320x240 (256 цветов) - режим X
      320x400 (256 цветов)
      360x240 (256 цветов)
      360x256 (256 цветов)
      360x480 (256 цветов)
      376x282 (256 цветов)
      320x480 (256 цветов)
      360x360 (256 цветов)
      376x308 (256 цветов)
      376x564 (256 цветов)
      400x300 (256 цветов)
      512x384 (256 цветов)
      640x400 (256 цветов)
      640x480 (256 цветов)
      800x600 (256 цветов)
      1024x768 (256 цветов)
      1280x1024 (256 цветов)
      320x200 (16 бит цветов)
      320x240 (16 бит цветов)
      400x300 (16 бит цветов)
      512x384 (16 бит цветов)
      640x400 (16 бит цветов)
      640x480 (16 бит цветов)
      800x600 (16 бит цветов)
      1024x768 (16 бит цветов)
      1280x1024 (16 бит цветов)
      Все видеорежимы, которые не используют возможности VESA (вплоть до 376x564) гарантировано работают на всех видеокартах!

      В данном модуле содержатся примеры использования. Есть поддержка графических файлов BMP (8 и 24 бит цвета, несжатые), а также PCX (8 бит). Несколько модифицированных функций для работы с памятью позволяют увеличить скорость вывода на экран. Копирование осуществляется отдельно по битовым плоскостям. Средняя скорость работы - около 60 кадров в секунду.
      Для работы некоторых режимов может потребоваться компиляция в защищенном режиме!
      Также есть встроенные функции для работы с мышкой и таймером.

      Скачать модуль uvga2 можно здесь.
      Р. Беллманн: "Если вы смогли решить задачу, значит это было упражнение; иначе - это научная проблема."
        Как использовать 256 цветов в графике?
        Стандартный драйвер egavga.bgi позволяет работать только с 16-ю цветами.

        С помощью этого модуля вы сможете выводить графику с 256 цветами в режимах
        320x200
        640x480
        800x600
        1024x768

        Внимание: SVGA режим может не работать на некоторых компьютерах!

        Для этих графических режимов надо подключить модуль SVGA_ в разделе Uses
        и использовать SetVideoMode вместо InitGraph

        ExpandedWrap disabled
          Unit SVGA_;
           
          Interface
          Uses Graph;
           
          const
               { 256 colors }
               v320x200   : byte = 0;
               v640x480   : byte = 2;
               v800x600   : byte = 3;
               v1024x768  : byte = 4;
               v1280x1024 : byte = 5;
           
          Procedure SetVideoMode(Mode: byte);
           
          Implementation
           
          procedure SVGA_DRV; external; { подключаем внешний объектный файл с драйвером SVGA }
          {$L svgadrv.obj}
           
          Procedure SetVideoMode;
          Var Gd,Gm: integer;
          Begin
               Gd:= InstallUserDriver('SVGA256',nil);
               if Gd= grError { Table full? } then
               begin
                    writeln('Error of installing driver.');
                    Halt(1);
               end;
               if RegisterBGIdriver(@SVGA_DRV) < 0 then
               begin
                    Writeln(GraphErrorMsg(GraphResult));
                    halt(2);
               end;
               Gm:=Mode;
               InitGraph(Gd,Gm,'');
          End;
           
          END.


        Пример
        ExpandedWrap disabled
          uses Graph,SVGA_;
           
          var MX,MY: integer;
           
          function I2S(i: integer): string;
          var s: string[6];
          begin
               str(i,s);
               i2s:=s
          end;
           
          BEGIN
               writeln('Press Enter.');
               readln;
               SetVideoMode(v800x600);
               SetColor(GetMaxColor div 3);
               MX:=GetMaxX;
               MY:=GetMaxY;
               line(0,0,MX,MY);
               OutTextXY(MX div 3,MY div 2,i2s(MX)+','+i2s(MY));
               readln;
               CloseGraph;
          END.

        Прикреплённый файлПрикреплённый файлsvga_tst.zip (10.87 Кбайт, скачиваний: 472)
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script Execution time: 0,9155 ]   [ 17 queries used ]   [ Generated: 23.09.19, 20:33 GMT ]