Chybné načtení BMP – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Chybné načtení BMP – C / C++ – Fórum – Programujte.comChybné načtení BMP – C / C++ – Fórum – Programujte.com

 

Lokutus7323
~ Anonymní uživatel
11 příspěvků
15. 2. 2011   #1
-
0
-

Dobrý večer,
tak jsem zas tu. Po celém dni, kdy jsem se opět zkoušel prokousat OpenGL a načítáním BMP textur jsem došel až do bodu. Kdy texturu načtu z externího BMP souboru, ale:

1)místo aby se pak zobrazila jako standardní RGB. Se zobrazují barvy červená a modrá prohozené, resp.: podle modelu BRG.

2) v levém dolním rohu textury chybí cca 20 pixelů v jedom řádku (textura má být zcela jistě v techto místech pouze červená). Zkoušel jsem alokovat více místa, bez reakce, myslím si tedy, že nedostatkem místa v proměnné chyba nevzniká.

Přikládám tedy celý projekt. Včetkě BMP, zdrojových kódu,atd.

Jedná se o tuto část kódu:

    

int width_t, height_t;
width_t=256;
height_t=256;
FILE *fin;
char *prom;
fin=fopen("zk.bmp", "r");
prom=(char*)malloc(width_t*height_t*3);
cout << fread(prom, width_t*height_t*3,sizeof(unsigned char), fin) << endl;
cout << pes << endl;

glPixelStorei(GL_UNPACK_ALIGNMENT, 1); // zpusob ulozeni bytu v texture
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); // opakovani textury
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); // volba filtru
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, // nahrani rastrovych dat do textury
height_t, height_t,
0, GL_RGB, GL_UNSIGNED_BYTE, prom);
glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);// vylepseni zobrazovani
glEnable(GL_TEXTURE_2D);


K prvnímu problému: Četl jsem, že by se problém RGB a BGR dal vyřešit přepsáním:
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB,

height_t, height_t,
0, GL_BGR, GL_UNSIGNED_BYTE, prom);

POložky GL_RGB na GL_BRG. Dokonce i v dokumentaci k této funkci je tato možnost i tyto hodnoty přípustné. Když je to ovšem udělám, kompilátor vyhodí chybu [quote] 75 C:\Users\Lokutus7323\Documents\Projekty v C++\OpenGL\main.cpp `GL_BGR' was not declared in this scope[/quote]


Děkuji

Nahlásit jako SPAM
IP: 94.112.250.–
nervak0
Věrný člen
15. 2. 2011   #2
-
0
-

Jestli si tu definici neumíš dohledat, nebo data přeházet, tak se na OpenGL vykašli.
V MinGW je GL_BGR v souboru GL/glext.h.

Nahlásit jako SPAM
IP: 213.211.51.–
Lokutus7323
~ Anonymní uživatel
11 příspěvků
16. 2. 2011   #3
-
0
-

Včera večer jsem si definici dohledal a našel, že řádkem #define GL_BGR 0x80E0 je přiřazena hodnota 0x80E0. Tudíš jsem na dané místo ve funkci glTexImage2d() dosadil přímo tuto hodnotu. A ejhle, všechno šlape jak má. Ale jak to, že to předtím nefungovalo, když je to v hlavičkové souboru dle mě korektně definováno?

Stále mi bohužel přetrvává problém se ztrátou cca 20px v posledním řádku souboru, viz příspěvek nahoře :-/.

Nahlásit jako SPAM
IP: 94.112.250.–
nervak0
Věrný člen
16. 2. 2011   #4
-
0
-

Když se podíváš o kus výš, tak ta definice je v podmíněném bloku (ifdef) a pro Windows jsou zpřístupněny jen definice pro OpenGL 1.1 a GL_BGR/GL_BGR_EXT jako rozšíření z OGL 1.2 je v glext.h. Microsoftí includy (jestli se nepletu) se taky hlásí k OGL 1.1 a definují jen GL_BGR_EXT, ale přímo v gl.h. Jinde zase musíš sám předem definovat, jakou verzi OGL chceš. Prostě musíš vědět jakou knihovnu používáš (nebo to nějak detekovat). Psát tu konstantu natvrdo není dobrý nápad.

BMP má svoji strukturu, nejsou to jen surová data. V předchozím kódu jsi měl zpracování hlavičky, proč ho nemáš i tady.

Nahlásit jako SPAM
IP: 213.211.51.–
Lokutus7323
~ Anonymní uživatel
11 příspěvků
16. 2. 2011   #5
-
0
-

ok,děkuju ti za vysvětlení. Hned se na to kouknu :)

Ten kód pro zpracování BMP hlaviček mám samozřejmě dán stranou. Podle toho co jsem pochopil, tak tahal z hlaviček stejně "jen" šířku a výšku obrázku (jestli se pletu, opravte me). Což je sice důležité, ale v případě, že mi kód nefunguje,výšku a šířku u testovací textury znám, nechtěl jsem si zbytečně udělat chybu právě ještě třeba v hlavičkách.

Výhoda PHP byla v tom, že když jsem něčemu nerozuměl, nechal jsem si obsah proměnné prostě vypsat pomocí ECHO();. a nastudoval problém kousek po kousku. U C to alespoň s mými znalostmi neumím a tak pro mě objevování některých chyb je docela složité. Kdyby se mi tenhle problém stal v PHP, zřejmě bych si nechal vypsat veškerý obsah proměnné z funkce fread() a kouknul se, kde se co děje špatně, či na co jsem zapoměl, že mi kód takhle "vynechá pár pixelů", bohužel se mi to stalo v C a chvílemi nechápu, co vůbec u počítače dělám a že bych se měl radši vzdálit.

Nahlásit jako SPAM
IP: 94.112.250.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 105 hostů

Podobná vlákna

Load BMP — založil bart

Změna štětce bmp — založil bird

Načítání BMP - barvičky — založil Zelenáč

Načítání BMP přes C++ — založil Lokutus7323

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý