Transparency with bitmap resource as a texture

Started by
10 comments, last by SERPENT 20 years ago
hey, this is my first time here, and I think you might like to know that i am the n00biest of all n00bs. Anyway, I''ve been programming this little cube with a bitmap texture as a win32 resource in msvc++ 6. My problem is, I can''t get the transparency to work. Heres my LoadGLTextures:

int LoadGLTextures()									// Load Bitmaps And Convert To Textures

{
	
HWND hwnd;
	int Status=TRUE;									// Status Indicator


   // load bitmap from resource file

   HBITMAP bitmap  = LoadBitmap(GetModuleHandle(NULL), 
      MAKEINTRESOURCE(IDB_BITMAP2));


   // 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(hWnd);
      GetDIBits(hdc, bitmap,  0, 256,  &data,  &info, DIB_RGB_COLORS);
  
	  ReleaseDC(hWnd, 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;
      }
   }
 unsigned char  *src_bitmap = data;
   unsigned char *alpha_bitmap = (unsigned char *)malloc(((256)*(256)) *4) ;
   for (unsigned int src = 0, dst = 0; src < (256)*3; src +=3, dst +=4)
{
// if the pixel is black, set the alpha to 0. Otherwise, set it to 255.

	
	if( src_bitmap[src] == 0xFF && src_bitmap[src+1] == 0 && src_bitmap[src+2] == 0xFF )
{
alpha_bitmap[dst+3] = 0;
PostQuitMessage(0); //I tell it to quit, and it WONT!

}
else
alpha_bitmap[dst+3] = 0xFF;

// copy pixel data over

alpha_bitmap[dst] = src_bitmap[src];
alpha_bitmap[dst+1] = src_bitmap[src+1];
alpha_bitmap[dst+2] = src_bitmap[src+2];
}

   // create one texture

   glGenTextures(1, &m_texture[0]);
				
   // select texture

   glBindTexture(GL_TEXTURE_2D, m_texture[0]);

	
   // SetTextureParameters

		glTexImage2D(GL_TEXTURE_2D, 0, 3, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, &data);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
		glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_NEAREST);

   gluBuild2DMipmaps(GL_TEXTURE_2D, 4, 256, 256,
GL_RGBA, GL_UNSIGNED_BYTE, alpha_bitmap);
		// generate texture

   glTexImage2D(GL_TEXTURE_2D, 0, 3, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, &data);
//free all the stuff, etc.



and within my DrawScene(), i have:
   
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER,0);
right before i draw my cube. My cube''s texture has a large pink(255,0,255) square on it that should go transparent, but it doesn''t. Help me, please. Thank you all! http://www.WoodmanStudios.tk http://www.WoodmanStudios.tk
http://www.WoodmanStudios.tk
Advertisement
first: PostQuitMessage does not quit... it just tells windows to inform you about it in the next run of your message loop ;=)

and for your problem.
enabling alpha blending is nice but you first have to set the blending modes to... should be:
SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA);
SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA);
SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);

have a look at SetRenderState, there you find it

EDIT: you have btw used AlphaTest function which is not the same as AlphaBlending. Alpha test refuses drawing pixels depending on an alpha value but you want to blend it using the colors on the screen

[edited by - RPTD on March 28, 2004 5:33:20 PM]

Life's like a Hydra... cut off one problem just to have two more popping out.
Leader and Coder: Project Epsylon | Drag[en]gine Game Engine

hmm. do i need diect3d (d3d) in order to use those?
http://www.WoodmanStudios.tk
Yeah, that reply makes sense only in a D3D context, not an OpenGL context.

One of the problems is probably that you''re calling glTexImage2D() after you''ve called gluBuild2DMipmaps(). The glu functions calls glTexImage2D() on all your mip map levels (including 0) so that call overwrites part of what glu did.

Also, you''re passing TexImage2D() the RGB data (without alpha), not the RGBA data (with alpha) which would account for your alpha not coming through.

PostQuitMessage() posts a message to the Windows event loop. It''s un-clear whether what you actually want "ExitProcess()" at that point, or perhaps "break;" (depending on what it is you want to quit out of!)
enum Bool { True, False, FileNotFound };
I can''t make teximage2d with RGBA because it has an illegal operation when i run it. And when i put teximage2d before my mipmap no texture at all shows up. Help me please.
http://www.WoodmanStudios.tk
quote:Original post by SERPENT
hmm. do i need diect3d (d3d) in order to use those?


yeah... sorry guys... was kinda sleepy when i wrote this but in fact it's the same. you have to set the source/dest blend function in ogl too, just like this:
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);



EDIT: i've done this in my code. perhaps it helps you.
// copy data to temporary texture-data
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, vTex->width, vTex->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, vTexData);


[edited by - RPTD on March 28, 2004 6:12:52 PM]

Life's like a Hydra... cut off one problem just to have two more popping out.
Leader and Coder: Project Epsylon | Drag[en]gine Game Engine

darn. it still isn't working. heres my textures again:
int LoadGLTextures()									// Load Bitmaps And Convert To Textures{	HWND hwnd;	int Status=TRUE;									// Status Indicator   // load bitmap from resource file   HBITMAP bitmap  = LoadBitmap(GetModuleHandle(NULL),       MAKEINTRESOURCE(IDB_BITMAP2));   // 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(hWnd);      GetDIBits(hdc, bitmap,  0, 256,  &data,  &info, DIB_RGB_COLORS);  	  ReleaseDC(hWnd, 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;      }   } unsigned char  *src_bitmap = data;   unsigned char *alpha_bitmap = (unsigned char *)malloc(((256)*(256)) *4) ;   for (unsigned int src = 0, dst = 0; src < (256)*3; src +=3, dst +=4){// if the pixel is black, set the alpha to 0. Otherwise, set it to 255.		if( src_bitmap[src] == 0xFF && src_bitmap[src+1] == 0 && src_bitmap[src+2] == 0xFF ){alpha_bitmap[dst+3] = 0;PostQuitMessage(0);}elsealpha_bitmap[dst+3] = 0xFF;alpha_bitmap[dst+3] = 0;// copy pixel data overalpha_bitmap[dst] = src_bitmap[src];alpha_bitmap[dst+1] = src_bitmap[src+1];alpha_bitmap[dst+2] = src_bitmap[src+2];}   // create one texture   glGenTextures(1, &m_texture[0]);				   // select texture   glBindTexture(GL_TEXTURE_2D, m_texture[0]);	   // SetTextureParameters		glTexImage2D(GL_TEXTURE_2D, 0, 3, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, &data);		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);		glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_NEAREST);	   				gluBuild2DMipmaps(GL_TEXTURE_2D, 4, 256, 256,GL_RGBA, GL_UNSIGNED_BYTE, alpha_bitmap);		glTexImage2D(GL_TEXTURE_2D, 0, 3, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, &data);//free stuff yadayadaand here's my blitting:   glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glEnable(GL_BLEND);glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);	glBegin(GL_QUADS);			glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);		glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);		glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);		glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);		// Back Face		glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);		glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);		glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);		glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);		// Top Face		glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);		glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,  1.0f,  1.0f);		glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,  1.0f,  1.0f);		glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);		// Bottom Face		glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);		glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);		glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);		glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);		// Right face		glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);		glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);		glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);		glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);		// Left Face		glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);		glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);		glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);		glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);	glEnd();return true;

EDIT: your teximage2d still gives me an illigal error.
http://www.WoodmanStudios.tk

[edited by - SERPENT on March 28, 2004 6:16:29 PM]
http://www.WoodmanStudios.tk
OK, here is my entire source. It''s a little program where you can rotate a cube(i''m testing opengl out for the first time.) Please, somebody, tell me what i''m doing wrong! I beg of you! I will be your best friend!!

here goes..
#include <windows.h>		// Header File For Windows#include <gl\gl.h>			// Header File For The OpenGL32 Library#include <gl\glu.h>			// Header File For The GLu32 Library#include <gl\glaux.h>		// Header File For The Glaux Library#include <math.h>#include <stdarg.h>#include <stdio.h>#include "globals.h"#include "resource.h"HDC			hDC=NULL;		// Private GDI Device ContextHGLRC		hRC=NULL;		// Permanent Rendering ContextHWND		hWnd=NULL;		// Holds Our Window HandleHINSTANCE	hInstance;		// Holds The Instance Of The ApplicationGLuint	base;bool	keys[256];			// Array Used For The Keyboard Routinebool	active=TRUE;		// Window Active Flag Set To TRUE By Defaultbool	fullscreen=TRUE;	// Fullscreen Flag Set To Fullscreen Mode By Defaultbool trans = true;bool wireframe = false;bool TPressed = false;bool WPressed = false;float col1,col2,col3;bool colorup = true;GLfloat	rtri;				// Angle For The Triangle ( NEW )GLfloat	rquad;				// Angle For The Quad ( NEW )GLfloat	cnt1;				// 1st Counter Used To Move Text & For ColoringGLfloat	cnt2;LRESULT	CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);	// Declaration For WndProcGLuint	m_texture[1];			// Storage For One Texture ( NEW )AUX_RGBImageRec *LoadBMP(char *Filename)				// Loads A Bitmap Image{	FILE *File=NULL;									// File Handle	if (!Filename)										// Make Sure A Filename Was Given	{		return NULL;									// If Not Return NULL	}	File=fopen(Filename,"r");							// Check To See If The File Exists	if (File)											// Does The File Exist?	{		fclose(File);									// Close The Handle		return auxDIBImageLoad(MAKEINTRESOURCE(IDB_BITMAP2));				// Load The Bitmap And Return A Pointer	}	return NULL;										// If Load Failed Return NULL}int LoadGLTextures()									// Load Bitmaps And Convert To Textures{	HWND hwnd;	int Status=TRUE;									// Status Indicator   // load bitmap from resource file   HBITMAP bitmap  = LoadBitmap(GetModuleHandle(NULL),       MAKEINTRESOURCE(IDB_BITMAP2));   // 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(hWnd);      GetDIBits(hdc, bitmap,  0, 256,  &data,  &info, DIB_RGB_COLORS);  	  ReleaseDC(hWnd, 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;      }   } unsigned char  *src_bitmap = data;   unsigned char *alpha_bitmap = (unsigned char *)malloc(((256)*(256)) *4) ;   for (unsigned int src = 0, dst = 0; src < (256)*3; src +=3, dst +=4){// if the pixel is black, set the alpha to 0. Otherwise, set it to 255.		if( src_bitmap[src] == 0xFF && src_bitmap[src+1] == 0 && src_bitmap[src+2] == 0xFF ){alpha_bitmap[dst+3] = 0;PostQuitMessage(0);}elsealpha_bitmap[dst+3] = 0xFF;alpha_bitmap[dst+3] = 0;// copy pixel data overalpha_bitmap[dst] = src_bitmap[src];alpha_bitmap[dst+1] = src_bitmap[src+1];alpha_bitmap[dst+2] = src_bitmap[src+2];}   // create one texture   glGenTextures(1, &m_texture[0]);				   // select texture   glBindTexture(GL_TEXTURE_2D, m_texture[0]);	   // SetTextureParameters			glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);		glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);		glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_NEAREST);	   		//	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, 256, 256, 0, GL_RGBA8, GL_UNSIGNED_BYTE, &data);		gluBuild2DMipmaps(GL_TEXTURE_2D, 4, 256, 256,		GL_RGB, GL_UNSIGNED_BYTE, alpha_bitmap);			glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, &data);		// generate texture   	//	free (alpha_bitmap);																							/*	AUX_RGBImageRec *TextureImage[1];					// Create Storage Space For The Texturememset(TextureImage,0,sizeof(void *)*1);           	// Set The Pointer To NULL	TextureImage[0]=LoadBMP("test.bmp");					unsigned char *alpha_bitmap = (unsigned char *)malloc( ((TextureImage[0]->sizeX*TextureImage[0]->sizeY) * 4) );unsigned char *src_bitmap = TextureImage[0]->data;	// Load The Bitmap, Check For Errors, If Bitmap''s Not Found Quit	if (TextureImage[0]=LoadBMP("test.bmp"))	{		Status=TRUE;									// Set The Status To TRUEfor (unsigned int src = 0, dst = 0; src < (TextureImage[0]->sizeX*TextureImage[0]->sizeY)*3; src +=3, dst +=4){// if the pixel is black, set the alpha to 0. Otherwise, set it to 255.		if( src_bitmap[src] == 0xFF && src_bitmap[src+1] == 0 && src_bitmap[src+2] == 0xFF ){alpha_bitmap[dst+3] = 0;}elsealpha_bitmap[dst+3] = 0xFF;// copy pixel data overalpha_bitmap[dst] = src_bitmap[src];alpha_bitmap[dst+1] = src_bitmap[src+1];alpha_bitmap[dst+2] = src_bitmap[src+2];}				glGenTextures(1, &texture[0]);					// Create The Texture		// Typical Texture Generation Using Data From The Bitmap		glBindTexture(GL_TEXTURE_2D, texture[0]);		*/	/*	gluBuild2DMipmaps(GL_TEXTURE_2D, 4, TextureImage[0]->sizeX, TextureImage[0]->sizeY,GL_RGBA, GL_UNSIGNED_BYTE, alpha_bitmap);	}	if (TextureImage[0])									// If Texture Exists	{		if (TextureImage[0]->data)							// If Texture Image Exists		{			free(TextureImage[0]->data);					// Free The Texture Image Memory		}		free(TextureImage[0]);		free( alpha_bitmap );						// Free The Image Structure	}*/	return Status;										// Return The Status}float xrot;float yrot;GLvoid glPrint(const char *fmt, ...)					// Custom GL "Print" Routine{	char		text[256];								// Holds Our String	va_list		ap;										// Pointer To List Of Arguments	if (fmt == NULL)									// If There''s No Text		return;											// Do Nothing	va_start(ap, fmt);									// Parses The String For Variables	    vsprintf(text, fmt, ap);						// And Converts Symbols To Actual Numbers	va_end(ap);											// Results Are Stored In Text	glPushAttrib(GL_LIST_BIT);							// Pushes The Display List Bits	glListBase(base - 32);								// Sets The Base Character to 32	glCallLists(strlen(text), GL_UNSIGNED_BYTE, text);	// Draws The Display List Text	glPopAttrib();										// Pops The Display List Bits}/*unsigned int iTexture;int LoadGLTextures(){AUX_RGBImageRec *AUXTextureImage = 0;// Open the fileFILE *hFile = fopen("test.bmp","r"); // Does file exist ?if (hFile){// Close the streamfclose(hFile);// Load bitmapAUXTextureImage = auxDIBImageLoad("test.bmp");unsigned char *alpha_bitmap = (unsigned char *)malloc( ((AUXTextureImage->sizeX*AUXTextureImage->sizeY) * 4) );unsigned char *src_bitmap = AUXTextureImage->data;if( src_bitmap == NULL || alpha_bitmap == NULL ){MessageBox( NULL, "Image not loaded", "ERROR", MB_OK );}for (unsigned int src = 0, dst = 0; src < (AUXTextureImage->sizeX*AUXTextureImage->sizeY)*3; src +=3, dst +=4){// if the pixel is black, set the alpha to 0. Otherwise, set it to 255.if( src_bitmap[src] == 0xFF && src_bitmap[src+1] == 0 && src_bitmap[src+2] == 0xFF ){alpha_bitmap[dst+3] = 0;}elsealpha_bitmap[dst+3] = 0xFF;// copy pixel data overalpha_bitmap[dst] = src_bitmap[src];alpha_bitmap[dst+1] = src_bitmap[src+1];alpha_bitmap[dst+2] = src_bitmap[src+2];}// Create one textureglGenTextures(1, &iTexture);// Make the texture the current oneglBindTexture(GL_TEXTURE_2D, iTexture);// Texture parametersglTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S, GL_REPEAT);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T, GL_REPEAT);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER, GL_NEAREST);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);// Build mip-mapsgluBuild2DMipmaps(GL_TEXTURE_2D, 4, AUXTextureImage->sizeX, AUXTextureImage->sizeY,GL_RGBA, GL_UNSIGNED_BYTE, alpha_bitmap);free( alpha_bitmap );}else// Failedreturn FALSE;// Does texture exist ?if (AUXTextureImage){// If texture image existsif (AUXTextureImage->data)// Free the texture image memoryfree(AUXTextureImage->data);else// Failedreturn FALSE;// free the image structurefree(AUXTextureImage);}else// Failedreturn FALSE;}*/int DrawGLScene(GLvoid) // Here''s Where We Do All The Drawing{glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);glLoadIdentity();	glTranslatef(0.0,0.0,-10.0f);	glRotatef(xrot,1.0f,0.0f,0.0f);		glRotatef(yrot,0.0f,1.0f,0.0f);		if(wireframe == true)		glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );	else		glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );		if(trans == true){		glEnable(GL_ALPHA_TEST);//glAlphaFunc(GL_GREATER,0);glEnable(GL_BLEND);glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);}			else{		glDisable(GL_ALPHA_TEST);				}// Front FaceglColor3ub(col1, col2, col3);	glBegin(GL_QUADS);			glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);		glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);		glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);		glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);		// Back Face		glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);		glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);		glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);		glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);		// Top Face		glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);		glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,  1.0f,  1.0f);		glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,  1.0f,  1.0f);		glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);		// Bottom Face		glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);		glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);		glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);		glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);		// Right face		glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);		glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);		glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);		glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);		// Left Face		glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);		glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);		glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);		glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);	glEnd();	if(GetAsyncKeyState(''B'')){		if(colorup == true){		col1 += 0.5f;	col2 += 0.5f;	col3 += 0.3f;		}		else		{			col1 -= 0.5f;			col2 -=0.5f;			col3 -=0.3f;	}	}	if(col1 >= 255.0f)		colorup = false;	if(col1 <= 100.0f || col2 <= 100.0f || col3 <= 100.0f)		colorup = true;		if(GetAsyncKeyState(VK_DOWN))			xrot += 0.2f;		if(GetAsyncKeyState(VK_UP))			xrot -= 0.2f;		if(GetAsyncKeyState(VK_LEFT))			yrot -= 0.2f;				if(GetAsyncKeyState(VK_RIGHT))			yrot += 0.2f;		if(GetAsyncKeyState(''T'') && TPressed == false)		{	if(trans == true)trans = false;			else trans = true;			TPressed = true;		}		if(!GetAsyncKeyState(''T''))			TPressed = false;		if(GetAsyncKeyState(''W'') && WPressed == false)		{			if(wireframe == true)wireframe = false;			else wireframe = true;			WPressed = true;		}		if(!GetAsyncKeyState(''W''))			WPressed = false;	glTranslatef(0.0f,0.0f,-1.0f);	//glColor3f(255.0f,0.0f,0.0f);glRasterPos2f(-0.45f,-0.4f);glPrint("%f,%f",xrot,yrot);//glColor3ub(255, 255, 255);	glLoadIdentity();glTranslatef(0.0f,0.0f,-1.0f);glColor3f(0.0f,1.0f,1.0f);glRasterPos2f(-0.4f,-0.4f);glPrint("3-D C++ OpenGL Engine Test By Tom Woodman");glLoadIdentity();glTranslatef(0.0f,0.0f,-1.0f);glColor3f(0.0f,1.0f,1.0f);glRasterPos2f(-0.23f,0.385f);glPrint("Use Arrow Keys To Rotate");glLoadIdentity();glTranslatef(0.0f,0.0f,-1.0f);//glColor3f(10.0f,0.0f,1.0f);glRasterPos2f(-0.55,0.3);glPrint("[T] Transparency");glRasterPos2f(-0.55,0.26);glPrint("[W] Wireframe Mode");glRasterPos2f(-0.55,0.22);glPrint(" Brightness"</font>);<br>glRasterPos2f(-0.55,0.18);<br>glPrint(<font color=darkred>"[F] Fullscreen Mode"</font>);<br>glRasterPos2f(-0.55,0.14);<br>glPrint(<font color=darkred>"[E] Exit"</font>);<br><br><br><font color=blue>return</font> <font color=blue>true</font>; <font color=gray><font color=gray>// Keep Going<br></font></font><br>} <br>GLvoid BuildFont(GLvoid)								<font color=gray>// Build Our Bitmap Font<br></font><br>{<br>	HFONT	font;										<font color=gray>// Windows Font ID<br></font><br>	HFONT	oldfont;									<font color=gray>// Used For Good House Keeping<br></font><br><br>	base = glGenLists(96);								<font color=gray>// Storage For 96 Characters<br></font><br><br>	font = CreateFont(	-24,							<font color=gray>// Height Of Font<br></font><br>						0,								<font color=gray>// Width Of Font<br></font><br>						0,								<font color=gray>// Angle Of Escapement<br></font><br>						0,								<font color=gray>// Orientation Angle<br></font><br>						FW_BOLD,						<font color=gray>// Font Weight<br></font><br>						FALSE,							<font color=gray>// Italic<br></font><br>						FALSE,							<font color=gray>// Underline<br></font><br>						FALSE,							<font color=gray>// Strikeout<br></font><br>						ANSI_CHARSET,					<font color=gray>// Character Set Identifier<br></font><br>						OUT_TT_PRECIS,					<font color=gray>// Output Precision<br></font><br>						CLIP_DEFAULT_PRECIS,			<font color=gray>// Clipping Precision<br></font><br>						ANTIALIASED_QUALITY,			<font color=gray>// Output Quality<br></font><br>						FF_DONTCARE|DEFAULT_PITCH,		<font color=gray>// Family And Pitch<br></font><br>						<font color=darkred>"Courier New"</font>);					<font color=gray>// Font Name<br></font><br><br>	oldfont = (HFONT)SelectObject(hDC, font);           <font color=gray><font color=gray>// Selects The Font We Want<br></font></font><br>	wglUseFontBitmaps(hDC, 32, 96, base);				<font color=gray>// Builds 96 Characters Starting At Character 32<br></font><br>	SelectObject(hDC, oldfont);							<font color=gray><font color=gray>// Selects The Font We Want<br></font></font><br>	DeleteObject(font);									<font color=gray>// Delete The Font<br></font><br>}<br><br>GLvoid KillFont(GLvoid)									<font color=gray>// Delete The Font List<br></font><br>{<br>	glDeleteLists(base, 96);							<font color=gray>// Delete All 96 Characters<br></font><br>}<br><br><br><br><br>GLvoid ReSizeGLScene(GLsizei width, GLsizei height)		<font color=gray>// Resize And Initialize The GL Window<br></font><br>{<br>	<font color=blue>if</font> (height==0)										<font color=gray>// Prevent A Divide By Zero By<br></font><br>	{<br>		height=1;										<font color=gray>// Making Height Equal One<br></font><br>	}<br><br>	glViewport(0,0,width,height);						<font color=gray>// Reset The Current Viewport<br></font><br><br>	glMatrixMode(GL_PROJECTION);						<font color=gray>// Select The Projection Matrix<br></font><br>	glLoadIdentity();									<font color=gray>// Reset The Projection Matrix<br></font><br><br>	<font color=gray>// Calculate The Aspect Ratio Of The Window<br></font><br>	gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);<br><br>	glMatrixMode(GL_MODELVIEW);							<font color=gray>// Select The Modelview Matrix<br></font><br>	glLoadIdentity();									<font color=gray>// Reset The Modelview Matrix<br></font><br>}<br><br><font color=blue>int</font> InitGL(GLvoid)										<font color=gray>// All Setup For OpenGL Goes Here<br></font><br>{<br><br>	col1 = 255;<br>	col2 = 255;<br>	col3 = 255;<br>	glEnable(GL_TEXTURE_2D);	<br>	<font color=gray>//glShadeModel(GL_SMOOTH);							// Enable Smooth Shading<br></font><br>	glClearColor(0.0f, 0.0f, 0.0f, 0.5f);				<font color=gray>// Black Background<br></font><br>	glClearDepth(1.0f);									<font color=gray>// Depth Buffer Setup<br></font><br>	glEnable(GL_DEPTH_TEST);							<font color=gray>// Enables Depth Testing<br></font><br>	glDepthFunc(GL_LEQUAL);								<font color=gray>// The Type Of Depth Testing To Do<br></font><br>	glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);	<font color=gray>// Really Nice Perspective Calculations<br></font><br>	BuildFont();	<br>		<font color=blue>if</font> (!LoadGLTextures())							<font color=gray>// Jump To Texture Loading Routine ( NEW )<br></font><br>	{<br>		<font color=blue>return</font> FALSE;							<font color=gray>// If Texture Didn''t Load Return FALSE ( NEW )<br></font><br>	}<br>	<font color=blue>return</font> TRUE;										<font color=gray>// Initialization Went OK<br></font><br>}<br><br><font color=gray>/*int DrawGLScene(GLvoid)									// Here''s Where We Do All The Drawing<br>{<br>	<br><br>	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);	// Clear Screen And Depth Buffer<br>	glLoadIdentity();<br>	glTranslatef(0.0f,0.0f,-5.0f);// Reset The Current Modelview Matrix<br>	/*glTranslatef(0.0f,0.0f,-1.0f);						// Move One Unit Into The Screen<br>	// Pulsing Colors Based On Text Position<br><br>	// Position The Text On The Screen<br>	glRasterPos2f(0,0);<br> 	glPrint("penisssss");	// Print GL Text To The Screen<br><br>	glTranslatef(-1.5f,0.0f,-6.0f);						// Move Left 1.5 Units And Into The Screen 6.0<br>//	glRotatef(rtri,0.0f,1.0f,0.0f);						// Rotate The Triangle On The Y axis ( NEW )<br>									// Done Drawing The Triangle<br>	glLoadIdentity();									// Reset The Current Modelview Matrix<br>	glTranslatef(0.0f,0.0f,rtri);						// Move Right 1.5 Units And Into The Screen 6.0<br>	glRotatef(rquad,0.0f,0.0f,1.0f);					// Rotate The Quad On The X axis ( NEW )<br>						// Set The Color To Blue One Time Only<br>	glEnable(GL_ALPHA_TEST);<br>glAlphaFunc(GL_GREATER,0);<br><br>glBindTexture(GL_TEXTURE_2D, iTexture); // Select Our Texture<br>	glBegin(GL_QUADS);									// Draw A Quad<br>		glVertex3f(-4.8f, 1.0f, 0.0f);					// Top Left<br>		glVertex3f( 1.0f, 1.0f, 0.0f);					// Top Right<br>		glVertex3f( 1.0f,-1.0f, 0.0f);					// Bottom Right<br>		glVertex3f(-3.0f,-1.0f, 0.0f);					// Bottom Left<br>	glEnd();// Done Drawing The Quad<br>	glTranslatef(2.0f,0.0f,rtri+50);						// Move Right 1.5 Units And Into The Screen 6.0<br>	glRotatef(rquad,0.0f,0.0f,1.0f);					// Rotate The Quad On The X axis ( NEW )<br>					*		// Set The Color To Blue One Time Only<br><br><br> // Select Our Texture<br>//	glColor3f(1.0f,0.0f,0.0f);	<br>		glEnable(GL_ALPHA_TEST);<br>glAlphaFunc(GL_GREATER,0);<br>	glBegin(GL_QUADS);									// Draw A Quad<br>		glVertex3f(-3.8f, 1.0f, 0.0f);					// Top Left<br>		glVertex3f( 4.0f, 1.0f, 0.0f);					// Top Right<br>		glVertex3f( 4.0f,-1.0f, 0.0f);					// Bottom Right<br>		glVertex3f(-3.0f,-1.0f, 0.0f);					// Bottom Left<br>	glEnd();<br>	rtri-=0.01f;											// Increase The Rotation Variable For The Triangle ( NEW )<br>	if(rtri &lt; -100.0f)<br>		rtri = 0;<br>	rquad-=0.15f;										// Decrease The Rotation Variable For The Quad ( NEW )<br><br><br><br><br><br>//glBindTexture(GL_TEXTURE_2D, texture[0]);<br>	glBegin(GL_QUADS);<br>		// Front Face<br>		glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);	// Bottom Left Of The Texture and Quad<br>		glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);	// Bottom Right Of The Texture and Quad<br>		glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);	// Top Right Of The Texture and Quad<br>		glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);	// Top Left Of The Texture and Quad<br>		// Back Face<br>		glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);	// Bottom Right Of The Texture and Quad<br>		glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);	// Top Right Of The Texture and Quad<br>		glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);	// Top Left Of The Texture and Quad<br>		glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);	// Bottom Left Of The Texture and Quad<br>		// Top Face<br>		glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);	// Top Left Of The Texture and Quad<br>		glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f,  1.0f,  1.0f);	// Bottom Left Of The Texture and Quad<br>		glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f,  1.0f,  1.0f);	// Bottom Right Of The Texture and Quad<br>		glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);	// Top Right Of The Texture and Quad<br>		// Bottom Face<br>		glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f);	// Top Right Of The Texture and Quad<br>		glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f);	// Top Left Of The Texture and Quad<br>		glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);	// Bottom Left Of The Texture and Quad<br>		glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);	// Bottom Right Of The Texture and Quad<br>		// Right face<br>		glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f);	// Bottom Right Of The Texture and Quad<br>		glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f,  1.0f, -1.0f);	// Top Right Of The Texture and Quad<br>		glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f,  1.0f,  1.0f);	// Top Left Of The Texture and Quad<br>		glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f,  1.0f);	// Bottom Left Of The Texture and Quad<br>		// Left Face<br>		glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f);	// Bottom Left Of The Texture and Quad<br>		glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f,  1.0f);	// Bottom Right Of The Texture and Quad<br>		glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f,  1.0f,  1.0f);	// Top Right Of The Texture and Quad<br>		glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f,  1.0f, -1.0f);	// Top Left Of The Texture and Quad<br>	glEnd();<br><br>return true; // Keep Going<br>}*/</font><br><br>GLvoid KillGLWindow(GLvoid)								<font color=gray>// Properly Kill The Window<br></font><br>{<br>	<font color=blue>if</font> (fullscreen)										<font color=gray>// Are We In Fullscreen Mode?<br></font><br>	{<br>		ChangeDisplaySettings(NULL,0);					<font color=gray>// If So Switch Back To The Desktop<br></font><br>		ShowCursor(TRUE);								<font color=gray>// Show Mouse Pointer<br></font><br>	}<br><br>	<font color=blue>if</font> (hRC)											<font color=gray>// Do We Have A Rendering Context?<br></font><br>	{<br>		<font color=blue>if</font> (!wglMakeCurrent(NULL,NULL))					<font color=gray>// Are We Able To Release The DC And RC Contexts?<br></font><br>		{<br>			MessageBox(NULL,<font color=darkred>"Release Of DC And RC Failed."</font>,<font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred>"SHUTDOWN ERROR"</font></font></font></font></font>,MB_OK | MB_ICONINFORMATION);<br>		}<br><br>		<font color=blue>if</font> (!wglDeleteContext(hRC))						<font color=gray>// Are We Able To Delete The RC?<br></font><br>		{<br>			MessageBox(NULL,<font color=darkred>"Release Rendering Context Failed."</font>,<font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred>"SHUTDOWN ERROR"</font></font></font></font></font>,MB_OK | MB_ICONINFORMATION);<br>		}<br>		hRC=NULL;										<font color=gray>// Set RC To NULL<br></font><br>	}<br><br>	<font color=blue>if</font> (hDC && !ReleaseDC(hWnd,hDC))					<font color=gray>// Are We Able To Release The DC<br></font><br>	{<br>		MessageBox(NULL,<font color=darkred>"Release Device Context Failed."</font>,<font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred>"SHUTDOWN ERROR"</font></font></font></font></font>,MB_OK | MB_ICONINFORMATION);<br>		hDC=NULL;										<font color=gray>// Set DC To NULL<br></font><br>	}<br><br>	<font color=blue>if</font> (hWnd && !DestroyWindow(hWnd))					<font color=gray>// Are We Able To Destroy The Window?<br></font><br>	{<br>		MessageBox(NULL,<font color=darkred>"Could Not Release hWnd."</font>,<font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred>"SHUTDOWN ERROR"</font></font></font></font></font>,MB_OK | MB_ICONINFORMATION);<br>		hWnd=NULL;										<font color=gray>// Set hWnd To NULL<br></font><br>	}<br><br>	<font color=blue>if</font> (!UnregisterClass(<font color=darkred><font color=darkred><font color=darkred>"OpenGL"</font></font></font>,hInstance))			<font color=gray>// Are We Able To Unregister Class<br></font><br>	{<br>		MessageBox(NULL,<font color=darkred>"Could Not Unregister Class."</font>,<font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred>"SHUTDOWN ERROR"</font></font></font></font></font>,MB_OK | MB_ICONINFORMATION);<br>		hInstance=NULL;									<font color=gray>// Set hInstance To NULL<br></font><br>	}<br>	KillFont();<br>}<br><br><font color=gray>/*	This Code Creates Our OpenGL Window.  Parameters Are:					*<br> *	title			- Title To Appear At The Top Of The Window				*<br> *	width			- Width Of The GL Window Or Fullscreen Mode				*<br> *	height			- Height Of The GL Window Or Fullscreen Mode			*<br> *	bits			- Number Of Bits To Use For Color (8/16/24/32)			*<br> *	fullscreenflag	- Use Fullscreen Mode (TRUE) Or Windowed Mode (FALSE)	*/</font><br> <br>BOOL CreateGLWindow(<font color=blue>char</font>* title, <font color=blue>int</font> width, <font color=blue>int</font> height, <font color=blue>int</font> bits, <font color=blue>bool</font> fullscreenflag)<br>{<br>	GLuint		PixelFormat;			<font color=gray>// Holds The Results After Searching For A Match<br></font><br>	WNDCLASS	wc;						<font color=gray>// Windows Class Structure<br></font><br>	DWORD		dwExStyle;				<font color=gray><font color=gray><font color=gray>// Window Extended Style<br></font></font></font><br>	DWORD		dwStyle;				<font color=gray>// Window Style<br></font><br>	RECT		WindowRect;				<font color=gray>// Grabs Rectangle Upper Left / Lower Right Values<br></font><br>	WindowRect.left=(<font color=blue>long</font>)0;			<font color=gray>// Set Left Value To 0<br></font><br>	WindowRect.right=(<font color=blue>long</font>)width;		<font color=gray>// Set Right Value To Requested Width<br></font><br>	WindowRect.top=(<font color=blue>long</font>)0;				<font color=gray>// Set Top Value To 0<br></font><br>	WindowRect.bottom=(<font color=blue>long</font>)height;		<font color=gray>// Set Bottom Value To Requested Height<br></font><br><br>	fullscreen=fullscreenflag;			<font color=gray>// Set The Global Fullscreen Flag<br></font><br><br>	hInstance			= GetModuleHandle(NULL);				<font color=gray>// Grab An Instance For Our Window<br></font><br>	wc.style			= CS_HREDRAW | CS_VREDRAW | CS_OWNDC;	<font color=gray>// Redraw On Size, And Own DC For Window.<br></font><br>	wc.lpfnWndProc		= (WNDPROC) WndProc;					<font color=gray>// WndProc Handles Messages<br></font><br>	wc.cbClsExtra		= 0;									<font color=gray><font color=gray>// No Extra Window Data<br></font></font><br>	wc.cbWndExtra		= 0;									<font color=gray><font color=gray>// No Extra Window Data<br></font></font><br>	wc.hInstance		= hInstance;							<font color=gray>// Set The Instance<br></font><br>	wc.hIcon			= LoadIcon(NULL, IDI_WINLOGO);			<font color=gray>// Load The Default Icon<br></font><br>	wc.hCursor			= LoadCursor(NULL, IDC_ARROW);			<font color=gray>// Load The Arrow Pointer<br></font><br>	wc.hbrBackground	= NULL;									<font color=gray>// No Background Required For GL<br></font><br>	wc.lpszMenuName		= NULL;									<font color=gray>// We Don''t Want A Menu<br></font><br>	wc.lpszClassName	= <font color=darkred><font color=darkred><font color=darkred>"OpenGL"</font></font></font>;								<font color=gray>// Set The Class Name<br></font><br><br>	<font color=blue>if</font> (!RegisterClass(&wc))									<font color=gray>// Attempt To Register The Window Class<br></font><br>	{<br>		MessageBox(NULL,<font color=darkred>"Failed To Register The Window Class."</font>,<font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred>"ERROR"</font></font></font></font></font></font></font></font></font></font>,MB_OK|MB_ICONEXCLAMATION);<br>		<font color=blue>return</font> FALSE;											<font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>// Return FALSE<br></font></font></font></font></font></font></font></font></font><br>	}<br>	<br>	<font color=blue>if</font> (fullscreen)												<font color=gray>// Attempt Fullscreen Mode?<br></font><br>	{<br>		DEVMODE dmScreenSettings;								<font color=gray>// Device Mode<br></font><br>		memset(&dmScreenSettings,0,<font color=blue>sizeof</font>(dmScreenSettings));	<font color=gray>// Makes Sure Memory''s Cleared<br></font><br>		dmScreenSettings.dmSize=<font color=blue>sizeof</font>(dmScreenSettings);		<font color=gray>// Size Of The Devmode Structure<br></font><br>		dmScreenSettings.dmPelsWidth	= width;				<font color=gray>// Selected Screen Width<br></font><br>		dmScreenSettings.dmPelsHeight	= height;				<font color=gray>// Selected Screen Height<br></font><br>		dmScreenSettings.dmBitsPerPel	= bits;					<font color=gray>// Selected Bits Per Pixel<br></font><br>		dmScreenSettings.dmFields=DM_BITSPERPEL|DM_PELSWIDTH|DM_PELSHEIGHT;<br><br>		<font color=gray>// Try To Set Selected Mode And Get Results.  NOTE: CDS_FULLSCREEN Gets Rid Of Start Bar.<br></font><br>		<font color=blue>if</font> (ChangeDisplaySettings(&dmScreenSettings,CDS_FULLSCREEN)!=DISP_CHANGE_SUCCESSFUL)<br>		{<br>			<font color=gray>// If The Mode Fails, Offer Two Options.  Quit Or Use Windowed Mode.<br></font><br>			<font color=blue>if</font> (MessageBox(NULL,<font color=darkred>"The Requested Fullscreen Mode Is Not Supported By\nYour Video Card. Use Windowed Mode Instead?"</font>,<font color=darkred>"NeHe GL"</font>,MB_YESNO|MB_ICONEXCLAMATION)==IDYES)<br>			{<br>				fullscreen=FALSE;		<font color=gray>// Windowed Mode Selected.  Fullscreen = FALSE<br></font><br>			}<br>			<font color=blue>else</font><br>			{<br>				<font color=gray>// Pop Up A Message Box Letting User Know The Program Is Closing.<br></font><br>				MessageBox(NULL,<font color=darkred>"Program Will Now Close."</font>,<font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred>"ERROR"</font></font></font></font></font></font></font></font></font></font>,MB_OK|MB_ICONSTOP);<br>				<font color=blue>return</font> FALSE;									<font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>// Return FALSE<br></font></font></font></font></font></font></font></font></font><br>			}<br>		}<br>	}<br><br>	<font color=blue>if</font> (fullscreen)												<font color=gray>// Are We Still In Fullscreen Mode?<br></font><br>	{<br>		dwExStyle=WS_EX_APPWINDOW;								<font color=gray><font color=gray><font color=gray>// Window Extended Style<br></font></font></font><br>		dwStyle=WS_POPUP;										<font color=gray><font color=gray>// Windows Style<br></font></font><br>		ShowCursor(FALSE);										<font color=gray>// Hide Mouse Pointer<br></font><br>	}<br>	<font color=blue>else</font><br>	{<br>		dwExStyle=WS_EX_APPWINDOW | WS_EX_WINDOWEDGE;			<font color=gray><font color=gray><font color=gray>// Window Extended Style<br></font></font></font><br>		dwStyle=WS_OVERLAPPEDWINDOW;							<font color=gray><font color=gray>// Windows Style<br></font></font><br>	}<br><br>	AdjustWindowRectEx(&WindowRect, dwStyle, FALSE, dwExStyle);		<font color=gray>// Adjust Window To True Requested Size<br></font><br><br>	<font color=gray>// Create The Window<br></font><br>	<font color=blue>if</font> (!(hWnd=CreateWindowEx(	dwExStyle,							<font color=gray>// Extended Style For The Window<br></font><br>								<font color=darkred><font color=darkred><font color=darkred>"OpenGL"</font></font></font>,							<font color=gray>// Class Name<br></font><br>								title,								<font color=gray>// Window Title<br></font><br>								dwStyle |							<font color=gray>// Defined Window Style<br></font><br>								WS_CLIPSIBLINGS |					<font color=gray><font color=gray>// Required Window Style<br></font></font><br>								WS_CLIPCHILDREN,					<font color=gray><font color=gray>// Required Window Style<br></font></font><br>								0, 0,								<font color=gray>// Window Position<br></font><br>								WindowRect.right-WindowRect.left,	<font color=gray>// Calculate Window Width<br></font><br>								WindowRect.bottom-WindowRect.top,	<font color=gray>// Calculate Window Height<br></font><br>								NULL,								<font color=gray>// No Parent Window<br></font><br>								NULL,								<font color=gray>// No Menu<br></font><br>								hInstance,							<font color=gray><font color=gray>// Instance<br></font></font><br>								NULL)))								<font color=gray>// Dont Pass Anything To WM_CREATE<br></font><br>	{<br>		KillGLWindow();								<font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>// Reset The Display<br></font></font></font></font></font></font></font><br>		MessageBox(NULL,<font color=darkred>"Window Creation Error."</font>,<font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred>"ERROR"</font></font></font></font></font></font></font></font></font></font>,MB_OK|MB_ICONEXCLAMATION);<br>		<font color=blue>return</font> FALSE;								<font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>// Return FALSE<br></font></font></font></font></font></font></font></font></font><br>	}<br><br>	<font color=blue>static</font>	PIXELFORMATDESCRIPTOR pfd=				<font color=gray>// pfd Tells Windows How We Want Things To Be<br></font><br>	{<br>		<font color=blue>sizeof</font>(PIXELFORMATDESCRIPTOR),				<font color=gray>// Size Of This Pixel Format Descriptor<br></font><br>		1,											<font color=gray>// Version Number<br></font><br>		PFD_DRAW_TO_WINDOW |						<font color=gray>// Format Must Support Window<br></font><br>		PFD_SUPPORT_OPENGL |						<font color=gray>// Format Must Support OpenGL<br></font><br>		PFD_DOUBLEBUFFER,							<font color=gray>// Must Support Double Buffering<br></font><br>		PFD_TYPE_RGBA,								<font color=gray>// Request An RGBA Format<br></font><br>		bits,										<font color=gray>// Select Our Color Depth<br></font><br>		0, 0, 0, 0, 0, 0,							<font color=gray>// Color Bits Ignored<br></font><br>		0,											<font color=gray>// No Alpha Buffer<br></font><br>		0,											<font color=gray>// Shift Bit Ignored<br></font><br>		0,											<font color=gray>// No Accumulation Buffer<br></font><br>		0, 0, 0, 0,									<font color=gray>// Accumulation Bits Ignored<br></font><br>		16,											<font color=gray>// 16Bit Z-Buffer (Depth Buffer)  <br></font><br>		0,											<font color=gray>// No Stencil Buffer<br></font><br>		0,											<font color=gray>// No Auxiliary Buffer<br></font><br>		PFD_MAIN_PLANE,								<font color=gray>// Main Drawing Layer<br></font><br>		0,											<font color=gray>// Reserved<br></font><br>		0, 0, 0										<font color=gray>// Layer Masks Ignored<br></font><br>	};<br>	<br>	<font color=blue>if</font> (!(hDC=GetDC(hWnd)))							<font color=gray>// Did We Get A Device Context?<br></font><br>	{<br>		KillGLWindow();								<font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>// Reset The Display<br></font></font></font></font></font></font></font><br>		MessageBox(NULL,<font color=darkred>"Can''t Create A GL Device Context."</font>,<font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred>"ERROR"</font></font></font></font></font></font></font></font></font></font>,MB_OK|MB_ICONEXCLAMATION);<br>		<font color=blue>return</font> FALSE;								<font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>// Return FALSE<br></font></font></font></font></font></font></font></font></font><br>	}<br><br>	<font color=blue>if</font> (!(PixelFormat=ChoosePixelFormat(hDC,&pfd)))	<font color=gray>// Did Windows Find A Matching Pixel Format?<br></font><br>	{<br>		KillGLWindow();								<font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>// Reset The Display<br></font></font></font></font></font></font></font><br>		MessageBox(NULL,<font color=darkred>"Can''t Find A Suitable PixelFormat."</font>,<font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred>"ERROR"</font></font></font></font></font></font></font></font></font></font>,MB_OK|MB_ICONEXCLAMATION);<br>		<font color=blue>return</font> FALSE;								<font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>// Return FALSE<br></font></font></font></font></font></font></font></font></font><br>	}<br><br>	<font color=blue>if</font>(!SetPixelFormat(hDC,PixelFormat,&pfd))		<font color=gray>// Are We Able To Set The Pixel Format?<br></font><br>	{<br>		KillGLWindow();								<font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>// Reset The Display<br></font></font></font></font></font></font></font><br>		MessageBox(NULL,<font color=darkred>"Can''t Set The PixelFormat."</font>,<font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred>"ERROR"</font></font></font></font></font></font></font></font></font></font>,MB_OK|MB_ICONEXCLAMATION);<br>		<font color=blue>return</font> FALSE;								<font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>// Return FALSE<br></font></font></font></font></font></font></font></font></font><br>	}<br><br>	<font color=blue>if</font> (!(hRC=wglCreateContext(hDC)))				<font color=gray>// Are We Able To Get A Rendering Context?<br></font><br>	{<br>		KillGLWindow();								<font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>// Reset The Display<br></font></font></font></font></font></font></font><br>		MessageBox(NULL,<font color=darkred>"Can''t Create A GL Rendering Context."</font>,<font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred>"ERROR"</font></font></font></font></font></font></font></font></font></font>,MB_OK|MB_ICONEXCLAMATION);<br>		<font color=blue>return</font> FALSE;								<font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>// Return FALSE<br></font></font></font></font></font></font></font></font></font><br>	}<br><br>	<font color=blue>if</font>(!wglMakeCurrent(hDC,hRC))					<font color=gray>// Try To Activate The Rendering Context<br></font><br>	{<br>		KillGLWindow();								<font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>// Reset The Display<br></font></font></font></font></font></font></font><br>		MessageBox(NULL,<font color=darkred>"Can''t Activate The GL Rendering Context."</font>,<font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred>"ERROR"</font></font></font></font></font></font></font></font></font></font>,MB_OK|MB_ICONEXCLAMATION);<br>		<font color=blue>return</font> FALSE;								<font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>// Return FALSE<br></font></font></font></font></font></font></font></font></font><br>	}<br><br>	ShowWindow(hWnd,SW_SHOW);						<font color=gray>// Show The Window<br></font><br>	SetForegroundWindow(hWnd);						<font color=gray>// Slightly Higher Priority<br></font><br>	SetFocus(hWnd);									<font color=gray>// Sets Keyboard Focus To The Window<br></font><br>	ReSizeGLScene(width, height);					<font color=gray>// Set Up Our Perspective GL Screen<br></font><br><br>	<font color=blue>if</font> (!InitGL())									<font color=gray>// Initialize Our Newly Created GL Window<br></font><br>	{<br>		KillGLWindow();								<font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>// Reset The Display<br></font></font></font></font></font></font></font><br>		MessageBox(NULL,<font color=darkred>"Initialization Failed."</font>,<font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred><font color=darkred>"ERROR"</font></font></font></font></font></font></font></font></font></font>,MB_OK|MB_ICONEXCLAMATION);<br>		<font color=blue>return</font> FALSE;								<font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray><font color=gray>// Return FALSE<br></font></font></font></font></font></font></font></font></font><br>	}<br><br>	<font color=blue>return</font> TRUE;									<font color=gray>// Success<br></font><br>}<br><br>LRESULT CALLBACK WndProc(	HWND	hWnd,			<font color=gray>// Handle For This Window<br></font><br>							UINT	uMsg,			<font color=gray>// Message For This Window<br></font><br>							WPARAM	wParam,			<font color=gray><font color=gray>// Additional Message Information<br></font></font><br>							LPARAM	lParam)			<font color=gray><font color=gray>// Additional Message Information<br></font></font><br>{<br>	<font color=blue>switch</font> (uMsg)									<font color=gray>// Check For Windows Messages<br></font><br>	{<br>		<font color=blue>case</font> WM_ACTIVATE:							<font color=gray>// Watch For Window Activate Message<br></font><br>		{<br>			<font color=blue>if</font> (!HIWORD(wParam))					<font color=gray>// Check Minimization State<br></font><br>			{<br>				active=TRUE;						<font color=gray>// Program Is Active<br></font><br>			}<br>			<font color=blue>else</font><br>			{<br>				active=FALSE;						<font color=gray>// Program Is No Longer Active<br></font><br>			}<br><br>			<font color=blue>return</font> 0;								<font color=gray>// Return To The Message Loop<br></font><br>		}<br><br>		<font color=blue>case</font> WM_SYSCOMMAND:							<font color=gray>// Intercept System Commands<br></font><br>		{<br>			<font color=blue>switch</font> (wParam)							<font color=gray>// Check System Calls<br></font><br>			{<br>				<font color=blue>case</font> SC_SCREENSAVE:					<font color=gray>// Screensaver Trying To Start?<br></font><br>				<font color=blue>case</font> SC_MONITORPOWER:				<font color=gray>// Monitor Trying To Enter Powersave?<br></font><br>				<font color=blue>return</font> 0;							<font color=gray>// Prevent From Happening<br></font><br>			}<br>			<font color=blue>break</font>;									<font color=gray>// Exit<br></font><br>		}<br><br>		<font color=blue>case</font> WM_CLOSE:								<font color=gray>// Did We Receive A Close Message?<br></font><br>		{<br>			PostQuitMessage(0);						<font color=gray>// Send A Quit Message<br></font><br>			<font color=blue>return</font> 0;								<font color=gray><font color=gray><font color=gray><font color=gray>// Jump Back<br></font></font></font></font><br>		}<br><br>		<font color=blue>case</font> WM_KEYDOWN:							<font color=gray>// Is A Key Being Held Down?<br></font><br>		{<br>			keys[<font color=purple>wParam</font>] = TRUE;					<font color=gray>// If So, Mark It As TRUE<br></font><br>			<font color=blue>return</font> 0;								<font color=gray><font color=gray><font color=gray><font color=gray>// Jump Back<br></font></font></font></font><br>		}<br><br>		<font color=blue>case</font> WM_KEYUP:								<font color=gray>// Has A Key Been Released?<br></font><br>		{<br>			keys[<font color=purple>wParam</font>] = FALSE;					<font color=gray>// If So, Mark It As FALSE<br></font><br>			<font color=blue>return</font> 0;								<font color=gray><font color=gray><font color=gray><font color=gray>// Jump Back<br></font></font></font></font><br>		}<br><br>		<font color=blue>case</font> WM_SIZE:								<font color=gray>// Resize The OpenGL Window<br></font><br>		{<br>			ReSizeGLScene(LOWORD(lParam),HIWORD(lParam));  <font color=gray>// LoWord=Width, HiWord=Height<br></font><br>			<font color=blue>return</font> 0;								<font color=gray><font color=gray><font color=gray><font color=gray>// Jump Back<br></font></font></font></font><br>		}<br>	}<br><br>	<font color=gray>// Pass All Unhandled Messages To DefWindowProc<br></font><br>	<font color=blue>return</font> DefWindowProc(hWnd,uMsg,wParam,lParam);<br>}<br><br><font color=blue>int</font> WINAPI WinMain(	HINSTANCE	hInstance,			<font color=gray><font color=gray>// Instance<br></font></font><br>					HINSTANCE	hPrevInstance,		<font color=gray>// Previous Instance<br></font><br>					LPSTR		lpCmdLine,			<font color=gray>// Command Line Parameters<br></font><br>					<font color=blue>int</font>			nCmdShow)			<font color=gray>// Window Show State<br></font><br>{<br>	MSG		msg;									<font color=gray>// Windows Message Structure<br></font><br>	BOOL	done=FALSE;								<font color=gray>// Bool Variable To Exit Loop<br></font><br><br>	<font color=gray>// Ask The User Which Screen Mode They Prefer<br></font><br><font color=gray>//	if (MessageBox(NULL,"Would You Like To Run In Fullscreen Mode?", "Start FullScreen?",MB_YESNO|MB_ICONQUESTION)==IDNO)<br></font><br><font color=gray>//	{<br></font><br><font color=gray>//		fullscreen=FALSE;							// Windowed Mode<br></font><br><font color=gray>//	}<br></font><br>fullscreen = <font color=blue>false</font>;<br>	<font color=gray>// Create Our OpenGL Window<br></font><br><br><br><br><font color=blue>if</font> (!CreateGLWindow(<font color=darkred>"OpenGL Testing"</font>,800,600,32,fullscreen))<br>	{<br>		<font color=blue>return</font> 0;									<font color=gray><font color=gray>// Quit If Window Was Not Created<br></font></font><br>	}<br><br>	<font color=blue>while</font>(!done)									<font color=gray>// Loop That Runs While done=FALSE<br></font><br>	{<br>	<br>		<font color=blue>if</font> (PeekMessage(&msg,NULL,0,0,PM_REMOVE))	<font color=gray>// Is There A Message Waiting?<br></font><br>		{<br>			<font color=blue>if</font> (msg.message==WM_QUIT)				<font color=gray>// Have We Received A Quit Message?<br></font><br>			{<br>				done=TRUE;							<font color=gray>// If So done=TRUE<br></font><br>			}<br>			<font color=blue>else</font>									<font color=gray>// If Not, Deal With Window Messages<br></font><br>			{<br>				TranslateMessage(&msg);				<font color=gray>// Translate The Message<br></font><br>				DispatchMessage(&msg);				<font color=gray>// Dispatch The Message<br></font><br>			}<br>		}<br>		<font color=blue>else</font>										<font color=gray>// If There Are No Messages<br></font><br>		{<br>			<font color=gray>// Draw The Scene.  Watch For ESC Key And Quit Messages From DrawGLScene()<br></font><br>			<font color=blue>if</font> ((active && !DrawGLScene()) || keys[<font color=purple>VK_ESCAPE</font>] || keys[<font color=purple>''E''</font>])	<font color=gray>// Active?  Was There A Quit Received?<br></font><br>			{<br>				done=TRUE;							<font color=gray>// ESC or DrawGLScene Signalled A Quit<br></font><br>			}<br>			<font color=blue>else</font>									<font color=gray>// Not Time To Quit, Update Screen<br></font><br>			{<br>				SwapBuffers(hDC);					<font color=gray>// Swap Buffers (Double Buffering)<br></font><br>			}<br><br>			<font color=blue>if</font> (keys[<font color=purple>''F''</font>])						<font color=gray>// Is F1 Being Pressed?<br></font><br>			{<br>				keys[<font color=purple>''F''</font>]=FALSE;					<font color=gray>// If So Make Key FALSE<br></font><br>				KillGLWindow();						<font color=gray>// Kill Our Current Window<br></font><br>				fullscreen=!fullscreen;				<font color=gray>// Toggle Fullscreen / Windowed Mode<br></font><br>				<font color=gray>// Recreate Our OpenGL Window<br></font><br>				<font color=blue>if</font> (!CreateGLWindow(<font color=darkred>"NeHe''s Rotation Tutorial"</font>,800,600,32,fullscreen))<br>				{<br>					<font color=blue>return</font> 0;						<font color=gray><font color=gray>// Quit If Window Was Not Created<br></font></font><br>				}<br>			}<br>		}<br>	}<br><br>	<font color=gray>// Shutdown<br></font><br>	KillGLWindow();									<font color=gray>// Kill The Window<br></font><br>	<font color=blue>return</font> (msg.wParam);							<font color=gray>// Exit The Program<br></font><br>}<br></pre><!–ENDSCRIPT–>    <br><br>http://www.WoodmanStudios.tk   
http://www.WoodmanStudios.tk
why do you load the texture 3 times?

you''ve got two times the same call to
glTexImage2D(GL_TEXTURE_2D, 0, 3, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, &data);
in your code plus a call to gluBuild2DMipmaps. this one internally calls glTexImage2D a couple of times itself so you have an overkill.
so do call either only glTexImage2D once or gluBuild2DMipmaps.

Life's like a Hydra... cut off one problem just to have two more popping out.
Leader and Coder: Project Epsylon | Drag[en]gine Game Engine

ok. I only have one call for that.
i''ve pin-pointed my problem, and the problem is that alpha_bitmap doesn''t contain anything, which means the transfer of data between data to alpha_bitmap(which filters out the pink in the process) fails. help!
http://www.WoodmanStudios.tk

This topic is closed to new replies.

Advertisement