Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > многоцветовая графика (256 цветов и более)


Автор: shara 29.6.2004, 03:09
Привет всем кто это читает.
я достаточно хорошо програмирую на с++, увлекаюсь 3D. но но с 16-тью цветами особо непорисуеш. короче, кто знает как работать с HI COLOR или с VESA или напрямую с видеокартой или ещё с чемнибуть, для того, чобы получить картинку с блоьшым количеством цветов. буду рад любому совету. :)

Автор: AndreyVN 29.6.2004, 07:48
Не понятно, что именно надо.

Если в Win, работу с видеокартой берет на себя OC.

Если в ДОС, управлять картой довольно муторно, за исключением режима 320x200x256. Я генерил изображения (прораммировал трассировку луча) в *.bmp любых форматов (Hi-, true- Color). Отображение картинок будет головной болью вьювера.

Если надо, описание *.bmp могу поискать.

Андрей.

Автор: Конструктор 29.6.2004, 08:14
Для 256 цветного режима необходимо найти библиотечку svga256.bgi. Она поддерживает разрешения от 320х200 до 1024х768. При инициализации графики просто использешь этот драйвер.

Код

d = installuserdriver("svga256",NULL);
m = 2;
initgraph(&d , &m , "");


А вообще вот:
http://forum.vingrad.ru/index.php?showtopic=24270

smile.gif

Автор: oleg1973 29.6.2004, 09:49
а вообще 256 цветов не есть hi-color
и если даже в досе работать то никакого гемороя нет
краткая схема для доса:
1) ставим флат режим (дабы получить доступ к памяти за пределом 1 мега)
2) через int 10h и функ vesa 4F02 ставим нужный нам режим, незабыв включить 14 бит в номере режима (4101h к примеру)
3) после установки режима нада получить vesa информатион блок, в нем со смещением 27h лежит адрес LFB
ну и все
если режим мы выбрали 24 битный то соответствено для установки 1 пиксела будем писать 3 байта RGB

Автор: Конструктор 29.6.2004, 10:08
Цитата
1) ставим флат режим (дабы получить доступ к памяти за пределом 1 мега)


В VESA можно и нес ставить flat режим, а получать доступ к памяти с помощью окон по 64 кб. А как после установки flat-режима, т.е. насколько я понял перевода проца в защищенный режим, работать в нём из 16-битной по сути прграммы?

Автор: oleg1973 29.6.2004, 11:43
неставив флат режим до LFB не долезеш
а с окнами это тормозно работать
кстати флат не является защищеным режимом, это реальный режим с 32 адресацией
так что можеш и 32 битные команды использовать smile.gif
типа mov eax,0ffffffffh

Автор: shara 29.6.2004, 12:54
народ, проблема в том, что я умею работать с 16-тью цветами при разрешении 640*480, а это маловато будет. мне надобы научится работать с большым количеством цветов при разрешении от 640*480. вот ношёл тут на форуме как bmp-шки рисовать, правда что-то каряво получается но всёравно хоть что-то.

где можно найти библиотеку svga256.bgi?
что такое flat режим и как им пользоваться? adv/jump.gif

Автор: oleg1973 29.6.2004, 13:02
shara
дак ты под что пишеш? виндос? дос?
в виндосе через директдрав рисуй
в досе напрямую лучше без всяких библиотек

Автор: shara 29.6.2004, 13:32
я работаю в основном работаю в dos
но могу и в windowse порисовать директдравом если подскажешь как. лижбы картинка была многоцветовая и с нормальным разрешаловом.
я нашел библиотечку svga256.bgi можно ли поподробнее расказать как её пользоваться?
и от описания bmp файлов тоже не откажусь. biggrin.gif

Автор: Maxim Sabalyauskas 1.7.2004, 03:48
Привет всем!

Shara, если тебя интересует прямой доступ к видеопамяти/видеокарте могу выслать кое-какую инфу: про VESA, EGA, VGA, SVGA и всё такое.

Сразу предупреждаю: проги, работающие с VESA (int 10h), под NT пахать не будут - это так, для информации. Так что если хочешь строить крутые графические приложения под Windows берись за DirectDraw и не парься. exclamation.gif

В своё время лучший графический режим, готорого я добился в Dos'е - это "1024x768 256 цветов", но опять-таки через страницы (окна), а вот 32-битного режима не пробовал! smile.gif

PS. А я тоже не откажусь от описания .bmp-файлов!

Автор: Конструктор 1.7.2004, 08:47
Пользоваться svga256.bgi очень просто.

Код

int d , m;
d = installuserdriver("svga256" , NULL);//Загружаем наш драйвер (вместь обычного egavga.bgi)
// другие режимы
// 0 - 320х240
// 1 - какой-то не стандарнтый, не помню точно может 640х400
// 2 - 640х480
// 3 - 800х600
// 4 - 1024х768
m = 0; //Установим режим

intigraph(&d , &m , "");

//далее используются ф-ции из graphics.h
//svga256.bgi, должна быть там же, где и ехешник.


Автор: shara 1.7.2004, 11:24
вобщем эта библиотечка svga256.bgi неплохая штука, но она медленно работает. но для некоторых простенькижх програм подойдёт. так-что, наверное, пошёл я учить DirexcDraw и всё такое (я и книгу нашёл). он то и быстрее (НАМНОГО!!! - сам видел), и в ДОСе не надо морочится, ато меня это все порядком достало.
но описалово для VESA если кому не лень всёже пришлите smile.gif.

Автор: Гость_Andy 15.7.2004, 22:41
ХЭЛПП!!!!!!!!

Пытаюсь загрузить SVGA.BGI
А С меня выкидывает. Пишет:


16-разрядная подсистема MS-DOS
________
Turbo C++ IDE
Процессор NTVDM обнаружил недопустимую инструкцию.
CS:d002 IP:0000 OP:ff 3f ff 1f ff
Для завершения раб. приложения нажмите "Закрыть".

Выкидывает когда пишу
d = installuserdriver("svga256" , NULL);
m=2;
intigraph(&d , &m , "");

Что интересно, при m=0 всё работает.
А в других режимах нет! sad.gif

!!!!!!!!!!!!!!!!!ПОМОГИТЕ ПОЖАЛУЙСТА!!!!!!!!!!!!!!!!!!!!!!!!

Автор: dima_mak 16.7.2004, 11:50
Цитата(Maxim @ 1.7.2004, 03:48)
Привет всем!

Shara, если тебя интересует прямой доступ к видеопамяти/видеокарте могу выслать кое-какую инфу: про VESA, EGA, VGA, SVGA и всё такое.

Сразу предупреждаю: проги, работающие с VESA (int 10h), под NT пахать не будут - это так, для информации. Так что если хочешь строить крутые графические приложения под Windows берись за DirectDraw и не парься. exclamation.gif

В своё время лучший графический режим, готорого я добился в Dos'е - это "1024x768 256 цветов", но опять-таки через страницы (окна), а вот 32-битного режима не пробовал! smile.gif

PS. А я тоже не откажусь от описания .bmp-файлов!

Вышли пожалуста мне свою инфу на мыло: [email protected]

Автор: dima_mak 16.7.2004, 12:50
А у меня при попытке инициализации:
Код

int driver,mode,errorcode,xmax,ymax;
driver=installuserdriver("svga256",0);
mode=3;

initgraph(&driver,&mode,"");
/* read result of initialization */
errorcode = graphresult();

if (errorcode != grOk)  /* an error occurred */
{
  printf("Graphics error: %s\n", grapherrormsg(errorcode));
  printf("Press any key to halt:");

}
xmax = getmaxx();
ymax = getmaxy();

outtext((char *)xmax);
line(0,0,799,599);
getch();

ошибок не говорит, но и линию не рисует и лампочка на мониторе начинает мигать(как в спящем режиме)

Автор: dima_mak 16.7.2004, 13:21
А при модэ=0 при попытке нарисовать линию выдаёт
Цитата

16-разрядная подсистема MS-DOS
________
Turbo C++ IDE
Процессор NTVDM обнаружил недопустимую инструкцию.
CS:d002 IP:0000 OP:ff 3f ff 1f ff
Для завершения раб. приложения нажмите "Закрыть".

Автор: shara 17.7.2004, 03:17
dima_mak
лампочка мигает потому-что или библиотека не понимает твою видеокарту или комп не поддерживает такое разришение(покрайней мере заданное таким образом) или ещё что-то в этом роде.
вобщем, народ, не партесь. мой вам совет, пишите под Win ато будет такая куча проблем со скоростью работы с графикой и совместимостью програм с другими компами что мне даже представить страшно. если вам надо работать с графикой - то купите себе книгу по DirectX вчастности по DirectDraw и учите её, мне этото вариант больше нравится, хотя кто его знает.
и еще одно эта библиотека SVGA256.bgi так медленно работает что её можно нормально использовать только на самом маленьком разрешании. (сам видел) sad.gif

Автор: Конструктор 19.7.2004, 13:57
Цитата
еще одно эта библиотека SVGA256.bgi так медленно работает что её можно нормально использовать только на самом маленьком разрешании. (сам видел) sad.gif


Не знаю, у меня на 486 33МГц все нормально работает (в смысле работало) если использовать вместе с MTX библиотечкой. Вполне шустро, только мерцает иногда зараза при перерисовке.

Автор: Graf Zeppelin 1.8.2004, 13:23
У меня тоже выбрасывает сообщение об ошибке sad.gif

Автор: Mysterio 3.8.2004, 09:27
Hi all.
Чего-то меня достала эта SVGA256.bgi. С ней куча проблем(типа MODE NOT SUPPORTED ON THIS CARD {хотя вроде и GeForce440, и на другом компе тоже самое пишет {TsengLabsPCI(2M)} и просто не хочет переходить в графику(мигает курсор доса вверху,ошибок не выдаёт,а само типа рисует{//задержка})});
SVGA режим пашет только через прямой доступ к видеопамяти, а от этой .bgi я добился только 320x200 256цв.(это стандартн.VGA режим). Если кому интересно, то вот инициализация через VESA в 640x480x256(было на каком-то сайте)
Код
#include <conio.h>
#include <stdio.h>
#include <dos.h>
void setsvga ( int );
void display256( );
void set_pixel64 ( int, int, unsigned char );
main( )
{
     clrscr();
     display256();
     return (0);
}
void display256( )
{
     setsvga ( 0x101 );
          for(int x1=0;x1<300;x1++)
              for(int y1=0;y1<480;y1++)
                set_pixel64(x1*2+1,y1,y1);
  for(x1=256*2.3;x1>0;x1-=2)//тут можно помутить
         for(int y1=0;y1<480;y1++)
             set_pixel64(x1,y1,x1/2);
     getch( );
     setsvga ( 0x003 );//нормальный TEXT MODE
}
void setsvga ( int m )
{
     union REGS i, o;
     i.x.ax = 0x4f02;
     i.x.bx = m;
     int86 ( 16, &i, &o );
}
void set_vesa_seg ( int bank_number )
{
     union REGS i, o;
     i.x.ax = 0x4F05;
     i.x.bx = 0;
     i.x.dx = bank_number;
     int86 ( 16, &i, &o );
}
void set_pixel64 ( int x, int y, unsigned char color )
{
     unsigned short curr_vesa_seg = 0xffff;
     unsigned short vesa_seg,vesa_offset;
     unsigned long seg_size = (0xffff) + 1L;
     unsigned long offset;
     offset = ( ( unsigned long ) y * ( unsigned long ) 640 + ( unsigned long ) x );
     vesa_seg = offset / seg_size;
     vesa_offset = offset % seg_size;
     if ( vesa_seg != curr_vesa_seg )
     {
    set_vesa_seg ( vesa_seg );
    curr_vesa_seg = vesa_seg;
     }
     pokeb ( 0xA000, ( unsigned ) vesa_offset, color );
}
.И кучка режимов для setsvga [/quote]
100H - 640x400x256
101H - 640x480x256 //16 цветов не привожу
103H - 800x600x256
105H - 1024x768x256
107H - 1280x1024x256//дальше текстовые до
10DH - 320x200x32768... и т.д.(можно эксперементировать до 11AH)[quote]
Мне хотелось бы иметь 112H(640x480x64k цвет),но мозги уже сворачиваюстя в трубочку.Можть кто подскажет? sample.gif

Автор: oleg1973 3.8.2004, 14:10
ddraw поможет

Автор: Mysterio 3.8.2004, 18:51
Лично я ненавижу DIRECTы всякие и винDOS в том числе. Я вообще пытаю свою систему.

Автор: Guest 3.10.2004, 16:12
это потому что у тебя либо манитор либо видюха не поддерживает такой режим или не поддерживает такой режим при такой попытке его активировать. у меня на 800*600 тоже лампочка мигает, помняй разрешалово.
и вообще народ, даю вам ХОРОШИЙ совет: не работайте на прямую с видео, это медленно, неудобно и не всегда выходит sad.gif я убедился на собственном опыте. если надо работать с графой пользуйтесь например DirectX ом результаты меня ВПОЛНЕ УСТРАИВАЮТ.

Автор: Maxim Sabalyauskas 12.10.2004, 03:02
Цитата
Лично я ненавижу DIRECTы всякие и винDOS в том числе. Я вообще пытаю свою систему.

Ненавидите DIRECTы - попробуйте OPENы (в смысле ГээЛы).

Вот что! Как насчёт того, чтобы написать свою библиотеку графики?

Всем, кто хочет написать (или уже пишет) свои дрова, тулкиты и т.п., давайте дружить по имэйлу - поделимся опытом!
adv/party.gif


Автор: Mysterio 28.12.2004, 09:05
Ну уж нет,люди. Мне нужен либо DOS либо сразу прерываниями. Насчет мыла идея заманчивая smile
И еще вопрос. У меня в VESA режиме(любом) получается всего одна страница.Надо хотя-бы 2.
Или это делается по-другому? smile

Автор: Michey 20.3.2005, 05:10
Помогите пожалуйста.
В проге, если открыть забитые строки, то всё перестаёт работать.

Цель: мне необходимо выводить одиночные символы графическом режиме DOS, но всё время прога выдаёт весь массив или если это одна переменная, то символ и букву "я". Почему????? smile Уже полторы недели мучаюсь. smile
Через указатель - весь массив.
Через посредника - весь массив.
С массива [1] через посредника в массив [10] вываливается массив [10].

// Прога

#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <iostream.h>
#include <ctype.h>

int main()
{
int graphdriver=DETECT, gmode, errorcode;
int c;
char str[10];
char ch[1];
char cx;

initgraph(&graphdriver, &gmode, "");
errorcode = graphresult();

if(errorcode != grOk)
{
printf("ЋиЁЎЄ  Ё­ЁжЁ «Ё§ жЁЁ ¤а ©ўҐа  %i \n", errorcode=graphresult());
printf("\n? ¦¬Ё Є« ўЁиг!\n");
getch();
exit(1);
}
outtext ("Insert text: ");
for (c=0; c<10; c++)
{
ch[0]=getch();
// cx=ch[0];
// str[c]=cx;
if (*ch==' ' || *ch==27) break;
outtext (ch);
gotoxy(40,15);
printf("%c", *ch);
}

closegraph();
return 0;
}

Автор: Michey 20.3.2005, 05:24
Да, теперь я зарегестрировался smile

Автор: Guest 21.10.2005, 20:45
спасибо

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)