blending problems with OpenGL
im working on a simple 3d world and i am using bitmap images... i wanted to make a door/window that is masked so that you can see thru the black areas of the mask... everything works except when you behind another wall you can still see the door from across the world.... i hope this makes sense. i would rather use bitmaps in this particular program. i know .tga's would be ideal but i dont want to go that route. can someone please tell me what im doing wrong?
Code:
int InitGL(GLvoid) // All Setup For OpenGL Goes Here
{
if (!LoadGLTextures()) // Jump To Texture Loading Routine
{
return FALSE; // If Texture Didn't Load Return FALSE
}
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // Clear The Background Color To Black
glClearDepth(1.0); // Enables Clearing Of The Depth Buffer
glEnable(GL_DEPTH_TEST); // Enable Depth Testing
glShadeModel(GL_SMOOTH); // Enables Smooth Color Shading
glEnable(GL_TEXTURE_2D); // Enable 2D Texture Mapping
//glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
return TRUE; // Initialization Went OK
}
int DrawGLScene(GLvoid) // Here's Where We Do All The Drawing
{
srand(time(NULL));
int k = 0;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear The Screen And The Depth Buffer
glLoadIdentity(); // Reset The View
// yrot = yrot+180;
if (lookupdown > 60) lookupdown = 60;
if (lookupdown < -60) lookupdown = -60;
glBindTexture(GL_TEXTURE_2D, texture[4]);
glRotatef(lookupdown,1.0f,0,0);
glRotatef(yrot,0.0f,1.0f,0.0f);
glTranslated(x,0.0,z);
glBegin(GL_QUADS);
// Top Face
glNormal3f( 0.0f,1.0f, 0.0f);
glTexCoord2f(20.0f, 20.0f); glVertex3f(-20.0f, 0.75f, -20.0f);
glTexCoord2f(0.0f, 20.0f); glVertex3f( -2.0f, 0.75f, -20.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( -2.0f, 0.75f, -2.0f);
glTexCoord2f(20.0f, 0.0f); glVertex3f(-20.0f, 0.75f, -2.0f);
glEnd();
glBindTexture(GL_TEXTURE_2D, texture[4]);
glBegin(GL_QUADS);
// Bottom Face
glNormal3f( 0.0f,-1.0f, 0.0f);
glTexCoord2f(20.0f, 20.0f); glVertex3f(-20.0f, -0.75f, -20.0f);
glTexCoord2f(0.0f, 20.0f); glVertex3f( -2.0f, -0.75f, -20.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( -2.0f, -0.75f, -2.0f);
glTexCoord2f(20.0f, 0.0f); glVertex3f(-20.0f, -0.75f, -2.0f);
glEnd();
glTranslatef(-19.0f,0.0f,-19.0f);
for(int i = 0; i < 9; i++)
{
for(int j = 0; j < 10; j++)
{
if(matrix[k] == 2)
{
glBindTexture(GL_TEXTURE_2D, texture[3]);
glBegin(GL_QUADS);
// Front Face
//glNormal3f( 0.0f, 0.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -0.75f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -0.75f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 0.75f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 0.75f, 1.0f);
// Back Face
//glNormal3f( 0.0f, 0.0f,-1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -0.75f, -1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 0.75f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 0.75f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -0.75f, -1.0f);
// Right face
//glNormal3f( 1.0f, 0.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -0.75f, -1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 0.75f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 0.75f, 1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -0.75f, 1.0f);
// Left Face
//glNormal3f(-1.0f, 0.0f, 0.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -0.75f, -1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -0.75f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 0.75f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 0.75f, -1.0f);
glEnd();
}
if(matrix[k] == 1)
{
glBindTexture(GL_TEXTURE_2D, texture[6]);
glBegin(GL_QUADS);
// Front Face
glNormal3f( 0.0f, 0.0f, 1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -0.75f, 1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -0.75f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 0.75f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 0.75f, 1.0f);
// Back Face
glNormal3f( 0.0f, 0.0f,-1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -0.75f, -1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 0.75f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 0.75f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -0.75f, -1.0f);
// Right face
glNormal3f( 1.0f, 0.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -0.75f, -1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 0.75f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 0.75f, 1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -0.75f, 1.0f);
// Left Face
glNormal3f(-1.0f, 0.0f, 0.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -0.75f, -1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -0.75f, 1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 0.75f, 1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 0.75f, -1.0f);
glEnd();
}
if(matrix[k] == 3)
{
glBindTexture(GL_TEXTURE_2D, texture[5]);
glEnable(GL_BLEND); // Enable Blending
glDisable(GL_DEPTH_TEST); // Disable Depth Testing
glBlendFunc(GL_DST_COLOR,GL_ZERO); // Blend Screen Color With Zero (Black)
glBegin(GL_QUADS);
// Front Face
//glNormal3f( 0.0f, 0.0f, 1.0f);
//glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -0.75f, 1.0f);
//glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -0.75f, 1.0f);
//glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 0.75f, 1.0f);
//glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 0.75f, 1.0f);
// Back Face
glNormal3f( 0.0f, 0.0f,-1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -0.75f, -1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 0.75f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 0.75f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -0.75f, -1.0f);
// Right face
//glNormal3f( 1.0f, 0.0f, 0.0f);
//glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -0.75f, -1.0f);
//glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 0.75f, -1.0f);
//glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 0.75f, 1.0f);
//glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -0.75f, 1.0f);
// Left Face
//glNormal3f(-1.0f, 0.0f, 0.0f);
//glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -0.75f, -1.0f);
//glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -0.75f, 1.0f);
//glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 0.75f, 1.0f);
//glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 0.75f, -1.0f);
glEnd();
glBindTexture(GL_TEXTURE_2D, texture[2]);
glBlendFunc(GL_ONE, GL_ONE); // Copy Image 1 Color To The Screen
glBegin(GL_QUADS);
// Front Face
//glNormal3f( 0.0f, 0.0f, 1.0f);
//glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -0.75f, 1.0f);
//glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -0.75f, 1.0f);
//glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 0.75f, 1.0f);
//glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 0.75f, 1.0f);
// Back Face
glNormal3f( 0.0f, 0.0f,-1.0f);
glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -0.75f, -1.0f);
glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 0.75f, -1.0f);
glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 0.75f, -1.0f);
glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -0.75f, -1.0f);
// Right face
//glNormal3f( 1.0f, 0.0f, 0.0f);
//glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -0.75f, -1.0f);
//glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 0.75f, -1.0f);
//glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 0.75f, 1.0f);
//glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -0.75f, 1.0f);
// Left Face
//glNormal3f(-1.0f, 0.0f, 0.0f);
//glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -0.75f, -1.0f);
//glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -0.75f, 1.0f);
//glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 0.75f, 1.0f);
//glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 0.75f, -1.0f);
glEnd();
glEnable(GL_DEPTH_TEST); // Enable Depth Testing
glDisable(GL_BLEND); // Disable Blendin
}
k++;
glTranslatef(2.0f,0.0f,0.0f);
}
glTranslatef(-20.0f,0.0f,2.0f);
}
return TRUE;// Keep Going
}