Elikkä olen tekemässä korttipeliä opengllä ja tarvitsisi laittaa tekstuuriksi kortin kuva.
Kun lataan kortin .dll tiedostosta se on HBITMAP -muotoa. ja tekstuuri tarvitsisi sen ilmeisesti jossakin raakadata muodos?, miten saisin sen muodon muutettua?
KIELI = C++
Avuksi mainittakoon GetDIBits-funktio. Sillä saa datan, joka helposti muuttuu juuri minne tarvitsee. Suosittelen tarkempien tietojen hankkimiseen kokeilemista ja konsoliohjelmia, joissa voi helposti printtailla näkyville tarvittavia tietoja. Silloin selviää helpoiten, onko datan perässä ehkä Bitmapille tyypilliset tasoitukset rivien pituuksiin ja miten päin kuva ja sen värit ovat.
Jos et jaksa tutustua tuohon, voit aina luoda väliaikaisen DC:n, valita sille haluamasi Bitmapin ja lukea pikselit GetPixel-funktiolla. Kannattaa muistaa myös laittaa alkuperäinen bittikartta takaisin DC:lle ja tuhota DC (ja mahdollisesti se omakin bittikartta).
Oisko mahdollista saada valmis pätkä toho?
joo se HBITMAP tarvitsisi vain muuttaa muotoon GLuint *
Ei missään tapauksessa. Saat itse opetella noita käyttämään. Ja vielä kun et ilmeisesti siitä OpenGL:stäkään tiedä oikein, millaisessa muodossa sen kuvan pitää olla, niin sitä suuremmalla syyllä. HBITMAP muuttuu kyllä GLuint*:ksi typecastilla, mutta siitä ei varmaankaan ole mitään iloa.
Apua saat luonnollisesti, jos tulee jotakin ylivoimaista vastaan.
joo no oon täs ny aikas monta tuntia tota pähkäilly (eilisen ja tän päivän) enkä oikeen saa sitä millään toimimaan (joo en oo kauheesti opengllää käyttäny, mut taitaa jäädäkin vähähks jos en saa toimiin)
elikkä tuolla saan kirjastosta kuvan, mutta se on hbitmap muotoo.
HMODULE hModule = LoadLibrary("Cards.dll"); HBITMAP kuva = LoadBitmap(hModule,MAKEINTRESOURCE(64));
ja tossahanhan on tuo textuurin lataus,ohjelma vain tilttaa käynnistäessä johtuen tuosta väärästä kuvamuodosta.
glTexImage2D(GL_TEXTURE_2D, 0, 3, 128, 128, 0, GL_RGB, GL_UNSIGNED_BYTE, kuva);
en oikein löytänyt selkeää esimerkkiäkään tuosta GetDiBits fuction käytöstä
int GetDIBits( HDC hdc, // handle to DC HBITMAP hbmp, // handle to bitmap UINT uStartScan, // first scan line to set UINT cScanLines, // number of scan lines to copy LPVOID lpvBits, // array for bitmap bits LPBITMAPINFO lpbi, // bitmap data buffer UINT uUsage // RGB or palette index );
tuostanoin, että esim. mikä taulukko tohon LPVOID kohdalle pitäisi pistää.
toivottavasti saisin laitettua tuon tekstuurin, jos en saa niin kait täytyy tehdä ilman opengllää tuo.
No sellainen taulukko, johon haluat sen kuvan tallentaa.
Kuten MSDN:stä helposti selviää, ensin laitat siihen NULL, niin funktio täyttää infostruktuurin tiedot, sitten varaat riittävän palan muistia ja annat sen osoittimen siihen kohti.
Löysin jonkinlaisen pätkän, mutta miksi se sanoo että:
main.cpp: In function `void LoadGLTextures()': main.cpp:34: warning: converting to non-pointer type `BYTE' from NULL main.cpp:35: warning: converting to non-pointer type `BYTE' from NULL main.cpp:36: warning: converting to non-pointer type `BYTE' from NULL main.cpp:37: warning: converting to non-pointer type `BYTE' from NULL main.cpp:42: error: `g_hWndRender' undeclared (first use this function) main.cpp:42: error: (Each undeclared identifier is reported only once for each function it appears in.) main.cpp:59: error: `m_texture' undeclared (first use this function) make.exe: *** [main.o] Error 1
ja tuossa on se löytämäni koodi
void LoadGLTextures() { // load bitmap from resource file HMODULE hModule = LoadLibrary("Cards.dll"); //LOAD THE BITMAP HBITMAP bitmap = LoadBitmap(hModule,MAKEINTRESOURCE(64)); // setup 24 bits bitmap structure // works on 8 bits bitmaps also! BITMAPINFO info; BITMAPINFOHEADER header; header.biSize = sizeof(BITMAPINFOHEADER); header.biWidth = 256; header.biHeight = 256; header.biPlanes = 1; header.biBitCount = 24; header.biCompression = BI_RGB; header.biSizeImage = 0; header.biClrUsed = 0; header.biClrImportant = 0; info.bmiHeader = header; info.bmiColors->rgbRed = NULL; info.bmiColors->rgbGreen = NULL; info.bmiColors->rgbBlue = NULL; info.bmiColors->rgbReserved = NULL; // store bitmap data in a vector const int size = 256*256*3; unsigned char data[size]; HDC hdc = GetDC(g_hWndRender); GetDIBits(hdc, bitmap, 0, 256, &data, &info, DIB_RGB_COLORS); ReleaseDC(g_hWndRender, hdc); // convert from BGR to RGB unsigned char buff; for(int i=0; i<256*256; i++) { buff = data[i*3]; if(i>=3) { data[i*3] = data[i*3+2]; data[i*3+2] = buff; } } // create one texture glGenTextures(1, &m_texture[0]); // select texture glBindTexture(GL_TEXTURE_2D, m_texture[0]); // SetTextureParameters // generate texture glTexImage2D(GL_TEXTURE_2D, 0, 3, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, &data); }
sitten koitin vielä toista mutta se valittaa ajettasessa runtime erroria, mutta käänyy
BITMAPINFO bi; void * rawbits; //LoadBitmap HMODULE hModule = LoadLibrary("Cards.dll"); //LOAD THE BITMAP HBITMAP hbmMyImage = LoadBitmap(hModule,MAKEINTRESOURCE(64)); //This fills the BITMAPINFO structure for you bi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); GetDIBits(hdc, hbmMyImage, 0, 0, NULL, &bi, DIB_RGB_COLORS); //Allocate the needed memory rawbits = (void *)new char[bi.bmiHeader.biSizeImage]; //This will actually copy the bits to the new buffer GetDIBits(hdc, hbmMyImage, 0, bi.bmiHeader.biHeight, rawbits, &bi, DIB_RGB_COLORS); //Now proceed with your gl calls, except replace your glTexImage2d call with this: //-------------------------------- // luo yksi tekstuuriobjekti glGenTextures(1, &taustaTekstuuri); // Sido äsken luotu tekstuuri teksturointiyksikköön glBindTexture(GL_TEXTURE_2D, taustaTekstuuri); // Lataa data tekstuuriin glTexImage2D(GL_TEXTURE_2D, 0, 3, bi.bmiHeader.biWidth, bi.bmiHeader.biHeight, 0, GL_RGB, GL_UNSIGNED_BYTE, rawbits); // Suodatus päälle glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
yksi vaihtoehto olis käyttää glaux tiedoston komentoi, mutta ymmärsin että tuo on vanhentunu...kannattaako sitä käyttää? (AUX_RGBImageRec functiot)
joo sain tiedososta ladattua jo textuurin, niin kait mie pian sen si tohonki saan....
Okei elikkä nyt saan ladattua hyvin tiedostosta, mutta kuvan täytyy olla 256x256 kokonen, muuten pätkii ihan tajuttomasti , kuva kylläkin näkyy. Sitten värisyvyyksienkaa on ongelmia, täytyy olla 24bittinen kuva. Miten saisin niin että kuva saa olla minkäkokonen tahansa ja värisysyys kans mikä vain.
LPTSTR szFileName; GLuint texid=0; // Creates Texture From A Bitmap File szFileName = "testi.bmp"; HBITMAP hBMP; // Handle Of The Bitmap BITMAP BMP; // Bitmap Structure glGenTextures(1, &texid); // Create The Texture // Does The Bitmap Exist? hBMP=(HBITMAP)LoadImage(GetModuleHandle(NULL), szFileName, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE ); // If Not Return False GetObject(hBMP, sizeof(BMP), &BMP); // Get The Object // hBMP: Handle To Graphics Object // sizeof(BMP): Size Of Buffer For Object Information // &BMP: Buffer For Object Information glPixelStorei(GL_UNPACK_ALIGNMENT, 4); // Pixel Storage Mode (Word Alignment / 4 Bytes) // Typical Texture Generation Using Data From The Bitmap glBindTexture(GL_TEXTURE_2D, texid); // Bind To The Texture ID glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); // Linear Min Filter glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // Linear Mag Filter glTexImage2D(GL_TEXTURE_2D, 0, 3, BMP.bmWidth, BMP.bmHeight, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, BMP.bmBits); DeleteObject(hBMP);
jeps löysin sellasenki luokan jo nehen sivuilta...mutta nyt ongelmana on se että se valittaa IID_IPicture että:
NeHe_IPicture.o(.text+0xc2):NeHe_IPicture.cpp: undefined reference to `IID_IPicture' NeHe_IPicture.o(.text+0xe8):NeHe_IPicture.cpp: undefined reference to `OleLoadPicturePath@24'
selailin nettiä enkä löytänyt sopivaa määritystä
Hienoa, edistystä :)
OpenGL vaatii (speksin mukaan ainakin) joka tapauksessa kuvan, jonka sivut ovat kakkosen potensseja. Kuvan muokkaaminen sopivaksi onnistuu ehkä helpoiten tuossa sillä, että kuvan lataamisen jälkeen luot kaksi DC:tä, liität toiseen sopivan (256x256) apubitmapin ja toiseen sen lataamasi (SelectObject taitaa olla funktio). Sitten blittaat sen ladatun toiselle BitBlt:llä ja käytät sitä lopussa koodissa.
Tuossakin taas tarkkana, että kaikki tulee tuhottua. Eli lopuksi voi vaikka valita ne alkuperäiset kuvat takaisin DC:lle, jolloin ne tuhoutuvat mukana, ja tuhota itse omansa.
Hmm...mistäs saisin tuon "uuid.lib" kirjaston kun ilmeisesti tarvisin sen ja dev-cpp:ssassa ei näytä olevan sitä valmiina, kopsasin borlannista tuon, mutta devi valitti sen tiedosto muodosta, joten se ei toimi.
joo se oli hieman erinimella ja kyllä pelittä nyt.
Aihe on jo aika vanha, joten et voi enää vastata siihen.