Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: OpenGL: BGR->RGB

KoodiNoppa [28.08.2007 23:15:40]

#

Kuten otsikosta huomaa, pitäisi saada BGR-formaatin bittikartat RGB-formaattiin, jottei värit vääristyisi. En ole kokenut OpenGL:n käyttäjä, joten koodissa on netistä haettuja pätkiä :)
Eli ilmeisesti tähän funktioon se bittien vaihto pitäisi saada:

bool NeHeLoadBitmap(LPTSTR szFileName, GLuint &texid)					// Creates Texture From A Bitmap File
{
	HBITMAP hBMP;														// Handle Of The Bitmap
	BITMAP	BMP;														// Bitmap Structure

	glGenTextures(1, &texid);											// Create The Texture
	hBMP=(HBITMAP)LoadImage(GetModuleHandle(NULL), szFileName, IMAGE_BITMAP, 0, 0, LR_CREATEDIBSECTION | LR_LOADFROMFILE );

	if (!hBMP)															// Does The Bitmap Exist?
		return FALSE;													// 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_RGB, GL_UNSIGNED_BYTE, BMP.bmBits);

	DeleteObject(hBMP);													// Delete The Object

	return TRUE;														// Loading Was Successful
}

pieslice [29.08.2007 00:24:56]

#

Eiköhän kannattaisi tallettaa nuo kuvat RGB-formaatissa jolloin latautuisivat oikein?

www.suomipelit.com on myös toimivaa koodia, OpenGl tutoriaali #3:ssa, jossa on ihan hyvä TGA loaderi (tosin koodin formatointi tuossa esimerkissä on jotain ihan hirveää).

Markus [29.08.2007 14:31:35]

#

Tai anna glTexImage2D-funktiolle suoraan datan formaatiksi GL_BGR...

KoodiNoppa [29.08.2007 17:06:45]

#

Ne kuvat on RGB-formaatissa, mutta kuitenkin OpenGL näyttää ne BGR:nä... En tiedä mikä on vialla mutta niin se vaan on.
GL_BGR:ää ei kääntäjän mukaan ole. Jossain päin nettiä luki sellainen kuin GL_BGR_EXT, mutta sitäkään ei ole. Varmaankin jostain lisäkirjastosta löytyisi, mutta kun olen niin huono asentamaan niitä :(

Metabolix [29.08.2007 18:31:46]

#

Google kertoi, että puuttuva vakio olisi otsikossa glext.h, voisit siis kokeilla, onko sellainen jo valmiiksi olemassa.

Toinen vaihtoehto on muuttaa kuva itse. Bitmapilla hommassa on vielä oma pieni konstinsa, kun rivit on lopustaan täytetty lähimpään tasaan neljään tavuun asti.

void muuta_bmp(const BITMAP *BMP)
{
  int w = BMP->bmWidth, h = BMP->bmHeight;
  char *data = BMP->bmBits;

  // Lasketaan tavuja / rivi: 3 tavua / pikseli ja pyöristys ylös lähimpään neljään.
  const int tavuja_rivilla = ((3 * w + 3) / 4) * 4;
  int x, y;
  for (y = 0; y < h; ++y) {
    for (x = 0; x < w; ++x) {
      // 3*x, koska yksi pikseli vie kolme tavua
      int kohta = 3 * x + tavuja_rivilla * y;

      // Vaihdetaan ensimmäinen ja kolmas tavu.
      char apu = data[kohta];
      data[kohta] = data[kohta + 2];
      data[kohta + 2] = apu;
    }
  }
}

// muuta_bmp(&BMP); glTexImage2D(...);

Kolmas vaihtoehto on käyttää jotain muuta kuvaformaattia. Esimerkiksi PNG tuo luontaisetuna myös tuen läpinäkyvyydelle sekä häviöttömän pakkauksen. Kuvien lataamiseen voi käyttää glpng-kirjastoa.

Markus [29.08.2007 18:34:33]

#

GL_BGR tuli mukaan OpenGL:ään versiossa 1.2.
Sinulla ilmeisesti on (ja pitäisikin olla) version 1.1 otsikkotiedostot.
Kaikki yli version 1.1 menevät asiat on määritelty tiedostossa glext.h, jonka saa imuroitua osoitteesta opengl.org.

Helpoimmalla pääset kun käytät pientä apukirjastoa nimeltä GLEW: http://glew.sourceforge.net/
Includeta gl.h:n sijasta glew.h ja kutsu ikkunan luonnin jälkeen ennen ensimmäistäkään opengl-funktio-kutsua funktiota glewInit(), niin kaikki version 1.1 menevät asiat ja laajennukset ovat suoraan käytössäsi.


ps. Tai määrittele "GL_BGR" itse:
#define GL_BGR 0x80E0

KoodiNoppa [31.08.2007 18:12:25]

#

glext oli koneella :)

Nyt kaikki toimii niin kuin pitää. Kiitos kaikille avusta.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta