
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[35.172.111.47] |
![]() |
|
Сообщ.
#1
,
|
|
|
Программирование графики в различных режимах.
Часто люди задаются вопросом, как написать графическую программу, которая использует больше, чем 16 цветов (egavga.bgi) или даже 320x200x256. В свое время я тоже над этим долго мучался, и хочу выложить то, что у меня получилось. Это модуль для работы с графикой в различных режимах: стандартные и нестандартные. Пожалуй, единственный стандартный режим, который пока доступен - это 320 на 200. Тут все достаточно просто: кусок памяти начиная с адреса $A000:0000 размером в 64000 байт, на каждый байт по одной точке. Нестандартные режимы отличаются несколькими вещами: Это (второй пункт), конечно, сделать несколько сложно, т.к. все значения, которые надо записать в определенном порядке в определенные порты VGA чаще всего подбираются методом проб и ошибок. Но добрые люди это уже сделали за нас, и, поэтому, будем пользоваться готовым кодом. Пару слов о том, как устроена видеопамять в нестандартных режимах. Опять же, она лежит по адресу $A000:0000, но на каждый байт приходится по 4 (!) точки. Это достигается наличием так называемых "битовых плоскостей". Т.е. в зависимости от того, какую плоскость мы выбрали, определяется, где будет находится очередной пиксель. Например, составим небольшую табличку для объяснения этой схемы: ![]() ![]() 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 можно здесь. |
![]() |
Сообщ.
#2
,
|
|
Как использовать 256 цветов в графике?
Стандартный драйвер egavga.bgi позволяет работать только с 16-ю цветами. С помощью этого модуля вы сможете выводить графику с 256 цветами в режимах 320x200 640x480 800x600 1024x768 Внимание: SVGA режим может не работать на некоторых компьютерах! Для этих графических режимов надо подключить модуль SVGA_ в разделе Uses и использовать SetVideoMode вместо InitGraph ![]() ![]() 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. Пример ![]() ![]() 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. Прикреплённый файл ![]() |