I AM TRYING TO MANIPULATE THE DEPTH BUFFER TO ALLOW FOR AN OBJECT TO HIDE BEHIND CLOSER POLYGONS. CAN SOMEONE PLEASE TEACH ME HOW TO DO THIS PROPERLY. THE FOLLOWING DOES NOT WORK RIGHT. I DON’T KNOW IF I AM SUPPOSED TO USE glClear(GL_DEPTH_BUFFER) ONCE OR MULTIPLE TIMES. AND IN WHAT ORDER SHOULD I BE RENDERING?? FRONT TO BACK, OR BACK TO FRONT?
#include <OpenGLSB.h>
#include <GLTools.h>
#include “glbmp.h”
GLdouble a = 0.0;
GLdouble s = 0.0;
int stance = 0;
int cycleone = 1;
int direction = 1;
int time = 0;
int switchstance = 1;
GLfloat posx = 0.450;
GLfloat posy = 0.0;
void init(void)
{
glEnable(GL_MULTISAMPLE);
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
//glEnable(GL_SCISSOR_TEST);
glViewport(0, 0, 1024, 1024);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
//glClear(GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(85.0, 1.0, -5.0, 0.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(2.0 , 4.00 , -5.0, 2.0 , 4.00 , 0.0, 0.0, 10.0, 0.0);
}
void RenderScene(void)
{
if (cycleone == 1)
{
GLuint texture1 = 0;
glbmp_t bitmap1;
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glbmp_LoadBitmap(“grass.bmp”, 1, &bitmap1);
//generate and bind the OpenGL texture
glGenTextures(1, &texture1);
glBindTexture(GL_TEXTURE_2D, texture1);
//copy data from bitmap into texture
glTexImage2D(GL_TEXTURE_2D, 0, 3, bitmap1.width, bitmap1.height,
0, GL_RGB, GL_UNSIGNED_BYTE, bitmap1.rgb_data);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glShadeModel(GL_SMOOTH);
glFrontFace(GL_CCW);
glBegin(GL_QUAD_STRIP);
glTexCoord2f(30.0, -10.0);
glVertex3f(30.0f, -10.0f, 0.0f);
glTexCoord2f(30.0, 30.0);
glVertex3f(30.0f, 30.0f, 0.0f);
glTexCoord2f(-20.0, -10.0);
glVertex3f(-20.0f, -10.0f, 0.0f);
glTexCoord2f(-20.0, 30.0);
glVertex3f(-20.0f, 30.0f, 0.0f);
glEnd();
GLuint texture = 0;
glbmp_t bitmap;
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glbmp_LoadBitmap(“wood.bmp”, 1, &bitmap);
//generate and bind the OpenGL texture
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
//copy data from bitmap into texture
glTexImage2D(GL_TEXTURE_2D, 0, 3, bitmap.width, bitmap.height,
0, GL_RGB, GL_UNSIGNED_BYTE, bitmap.rgb_data);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glShadeModel(GL_SMOOTH);
glFrontFace(GL_CCW);
//glClear(GL_COLOR_BUFFER_BIT);
glClear(GL_DEPTH_BUFFER_BIT);
glBegin(GL_QUAD_STRIP);
glTexCoord2f(6.0, 2.0);
glVertex3f(6.0f, 2.0f, 0.1f);
glTexCoord2f(6.0, 4.0);
glVertex3f(6.0f, 4.0f, 0.1f);
glTexCoord2f(2.0, 2.0);
glVertex3f(2.0f, 2.0f, 0.1f);
glTexCoord2f(2.0, 4.0);
glVertex3f(2.0f, 4.0f, 0.1f);
glEnd();
glClear(GL_DEPTH_BUFFER_BIT);
glBegin(GL_QUAD_STRIP);
glTexCoord2f(6.0, 6.0);
glVertex3f(6.0f, 6.0f, 0.1f);
glTexCoord2f(6.0, 8.0);
glVertex3f(6.0f, 8.0f, 0.1f);
glTexCoord2f(2.0, 6.0);
glVertex3f(2.0f, 6.0f, 0.1f);
glTexCoord2f(2.0, 8.0);
glVertex3f(2.0f, 8.0f, 0.1f);
glEnd();
GLuint texture2 = 0;
glbmp_t bitmap2;
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glbmp_LoadBitmap(“siding.bmp”, 1, &bitmap2);
//generate and bind the OpenGL texture
glGenTextures(1, &texture2);
glBindTexture(GL_TEXTURE_2D, texture2);
//copy data from bitmap into texture
glTexImage2D(GL_TEXTURE_2D, 0, 3, bitmap2.width, bitmap2.height,
0, GL_RGB, GL_UNSIGNED_BYTE, bitmap2.rgb_data);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glShadeModel(GL_SMOOTH);
glFrontFace(GL_CCW);
glBegin(GL_QUAD_STRIP);
glTexCoord2f(6.0, 4.0);
glVertex3f(6.0f, 4.0f, 0.1f);
glTexCoord2f(6.0, 8.0);
glVertex3f(6.0f, 8.0f, 0.1f);
glTexCoord2f(5.9, 4.0);
glVertex3f(5.9f, 4.0f, 0.1f);
glTexCoord2f(5.9, 8.0);
glVertex3f(5.9f, 8.0f, 0.1f);
glEnd();
glBegin(GL_QUAD_STRIP);
glTexCoord2f(2.1, 4.0);
glVertex3f(2.1f, 4.0f, 0.1f);
glTexCoord2f(2.1, 8.0);
glVertex3f(2.1f, 8.0f, 0.1f);
glTexCoord2f(2.0, 4.0);
glVertex3f(2.0f, 4.0f, 0.1f);
glTexCoord2f(2.0, 8.0);
glVertex3f(2.0f, 8.0f, 0.1f);
glEnd();
glBegin(GL_QUAD_STRIP);
glTexCoord2f(2.0, 7.9);
glVertex3f(2.0f, 7.9f, 0.1f);
glTexCoord2f(2.0, 8.0);
glVertex3f(2.0f, 8.0f, 0.1f);
glTexCoord2f(6.0, 7.9);
glVertex3f(6.0f, 7.9f, 0.1f);
glTexCoord2f(6.0, 8.0);
glVertex3f(6.0f, 8.0f, 0.1f);
glEnd();
glBegin(GL_QUAD_STRIP);
glTexCoord2f(2.0, 3.9);
glVertex3f(2.0f, 3.9f, 0.1f);
glTexCoord2f(2.0, 4.0);
glVertex3f(2.0f, 4.0f, 0.1f);
glTexCoord2f(6.0, 3.9);
glVertex3f(6.0f, 3.9f, 0.1f);
glTexCoord2f(6.0, 4.0);
glVertex3f(6.0f, 4.0f, 0.1f);
glEnd();
glDeleteTextures(1, &texture);
glbmp_FreeBitmap(&bitmap);
glDeleteTextures(1, &texture1);
glbmp_FreeBitmap(&bitmap1);
glDeleteTextures(1, &texture2);
glbmp_FreeBitmap(&bitmap2);
}
//CHARACHTER MOVING LEFT ***********************************
if (direction == 1)
{
glPushMatrix();
;
if (switchstance == 0)
{
glTranslatef(s , a , 0);
posx = posx + s;
s = s + .0360;
}
if (switchstance == 1)
{
glTranslatef(s - .001, a, 0);
}
glPushAttrib(GL_CURRENT_BIT);
glPolygonMode(GL_FRONT, GL_FILL);
glScalef(10.0f, 10.0f, 0.0f);
//HEAD OF MAIN CHARACHTER
glColor3f(1.0, .92, .92);
glBegin(GL_POLYGON);
glVertex3f(.47f, .48f , 0.000f);
glVertex3f(.47f, .50f , 0.000f);
glVertex3f(.485f, .50f , 0.000f);
glVertex3f(.485f, .49f , 0.000f);
glVertex3f(.489f, .49f , 0.000f);
glVertex3f(.489f, .488f , 0.0000f);
glVertex3f(.485f, .488f , 0.0000f);
glVertex3f(.485f, .478f , 0.0000f);
glEnd();
glClear(GL_DEPTH_BUFFER_BIT);
//EYE OF MAIN CHARACHTER
glColor3f(0.0, 0.0, 1.0);
glBegin(GL_POLYGON);
glVertex3f(.480f , .490f , 0.0000f);
glVertex3f(.485f , .499f , 0.0000f);
glVertex3f(.485f , .490f , 0.0000f);
glEnd();
glClear(GL_DEPTH_BUFFER_BIT);
//MOUTH OF MAIN CHARACHTER
glColor3f(0.65, 0.0, 0.0);
glBegin(GL_POLYGON);
glVertex3f(.482f , .480f , 0.0000f);
glVertex3f(.482f , .482f , 0.0000f);
glVertex3f(.485f , .482f , 0.0000f);
glVertex3f(.485f , .480f , 0.0000f);
glEnd();
glClear(GL_DEPTH_BUFFER_BIT);
//HAIR OF MAIN CHARACHTER
glColor3f(0.65, 0.50, 0.0);
glBegin(GL_POLYGON);
glVertex3f(.469f , .497f , 0.0000f);
glVertex3f(.472f , .501f , 0.0000f);
glVertex3f(.485f , .501f , 0.0000f);
glVertex3f(.485f , .497f , 0.0000f);
glVertex3f(.47f , .492f , 0.0000f);
glEnd();
glClear(GL_DEPTH_BUFFER_BIT);
//EAR OF MAIN CHARACHTER
glColor3f(1.00, 0.75, 0.75);
glBegin(GL_POLYGON);
glVertex3f(.473f , .487f , 0.0000f);
glVertex3f(.471f , .492f , 0.0000f);
glVertex3f(.478f , .487f , 0.0000f);
glEnd();
glClear(GL_DEPTH_BUFFER_BIT);
//BODY OF MAIN CHARACHTER
glColor3f(.40, 0.40, 0.90);
glBegin(GL_POLYGON);
glVertex3f(.470f , .463f , 0.0000f);
glVertex3f(.470f , .479f , 0.0000f);
glVertex3f(.485f , .479f , 0.0000f);
glVertex3f(.485f , .463f , 0.0000f);
glEnd();
//LEGS OF MAIN CHARACHTER
if (switchstance == 1 || time == 3 || time == 4 || time == 5 || time == 6 || time == 7)
{
glClear(GL_DEPTH_BUFFER_BIT);
glColor3f(.50, 0.50, 0.50);
glBegin(GL_POLYGON);
glVertex3f(.472f , .456f , 0.0000f);
glVertex3f(.472f , .463f , 0.0000f);
glVertex3f(.482f , .463f , 0.0000f);
glVertex3f(.482f , .456f , 0.0000f);
glEnd();
}
if(switchstance != 1 && time != 3 && time != 4 && time != 5 && time != 6 && time != 7)
{
glClear(GL_DEPTH_BUFFER_BIT);
glColor3f(.50, 0.50, 0.50);
glBegin(GL_POLYGON);
glVertex3f(.465f , .459f , 0.0000f);
glVertex3f(.470f , .463f , 0.0000f);
glVertex3f(.477f , .463f , 0.0000f);
glVertex3f(.470f , .459f, 0.0000f);
glEnd();
glBegin(GL_POLYGON);
glVertex3f(.490f, .459f, 0.000f);
glVertex3f(.485f, .463f, 0.000f);
glVertex3f(.477f, .463f, 0.000f);
glVertex3f(.485f, .459f, 0.000f);
glEnd();
}
//ARMS OF MAN CHARACHTER
if(switchstance != 1 && time != 4 && time != 5 && time != 6 && time != 7 && time != 8)
{
glClear(GL_DEPTH_BUFFER_BIT);
glColor3f(1.00, 0.92, 0.92);
glBegin(GL_POLYGON);
glVertex3f(.480f , .466f , 0.0000f);
glVertex3f(.480f , .470f , 0.0000f);
glVertex3f(.486f , .470f , 0.0000f);
glVertex3f(.486f , .466f , 0.0000f);
glEnd();
}
if (switchstance == 1 || time == 4 || time == 5 || time == 6 || time == 7 || time == 8)
{
glColor3f(1.00, 0.92, 0.92);
glBegin(GL_POLYGON);
glVertex3f(.475f , .464f , 0.0000f);
glVertex3f(.475f , .468f , 0.0000f);
glVertex3f(.480f , .468f , 0.0000f);
glVertex3f(.480f , .464f , 0.0000f);
glEnd();
}
glPopAttrib();
glPopMatrix();
}
//CHARACHTER MOVING RIGHT ***********************************
if (direction == 0)
{
glPushAttrib(GL_CURRENT_BIT);
glPolygonMode(GL_FRONT, GL_FILL);
glPushMatrix();
if (switchstance == 0)
{
glTranslatef(s, a , 0);
posx = posx - s;
s = s - .0360;
}
if (switchstance == 1)
{
glTranslatef(s - .001, a , 0);
}
glScalef(10.0f, 10.0f, 0.0f);
glClear(GL_DEPTH_BUFFER_BIT);
//HEAD OF MAIN CHARACHTER
glColor3f(1.0, .92, .92);
glBegin(GL_POLYGON);
glVertex3f(.485f, .48f , 0.000f);
glVertex3f(.485f, .50f , 0.000f);
glVertex3f(.470f, .50f , 0.000f);
glVertex3f(.470f, .49f , 0.000f);
glVertex3f(.466f, .49f , 0.000f);
glVertex3f(.466f, .488f , 0.0000f);
glVertex3f(.470f, .488f , 0.0000f);
glVertex3f(.470f, .478f , 0.0000f);
glEnd();
glClear(GL_DEPTH_BUFFER_BIT);
//EYE OF MAIN CHARACHTER
glColor3f(0.0, 0.0, 1.0);
glBegin(GL_POLYGON);
glVertex3f(.475f , .490f , 0.0000f);
glVertex3f(.470f , .499f , 0.0000f);
glVertex3f(.470f , .490f , 0.0000f);
glEnd();
glClear(GL_DEPTH_BUFFER_BIT);
//MOUTH OF MAIN CHARACHTER
glColor3f(0.65, 0.0, 0.0);
glBegin(GL_POLYGON);
glVertex3f(.473f , .480f , 0.0000f);
glVertex3f(.473f , .482f , 0.0000f);
glVertex3f(.470f , .482f , 0.0000f);
glVertex3f(.470f , .480f , 0.0000f);
glEnd();
glClear(GL_DEPTH_BUFFER_BIT);
//HAIR OF MAIN CHARACHTER
glColor3f(0.65, 0.50, 0.0);
glBegin(GL_POLYGON);
glVertex3f(.486f , .497f , 0.0000f);
glVertex3f(.483f , .501f , 0.0000f);
glVertex3f(.470f , .501f , 0.0000f);
glVertex3f(.470f , .497f , 0.0000f);
glVertex3f(.485f , .492f , 0.0000f);
glEnd();
glClear(GL_DEPTH_BUFFER_BIT);
//EAR OF MAIN CHARACHTER
glColor3f(1.00, 0.75, 0.75);
glBegin(GL_POLYGON);
glVertex3f(.482f , .487f , 0.0000f);
glVertex3f(.484f , .492f , 0.0000f);
glVertex3f(.477f , .487f , 0.0000f);
glEnd();
glClear(GL_DEPTH_BUFFER_BIT);
//BODY OF MAIN CHARACHTER
glColor3f(.40, 0.40, 0.90);
glBegin(GL_POLYGON);
glVertex3f(.485f , .463f , 0.0000f);
glVertex3f(.485f , .479f , 0.0000f);
glVertex3f(.470f , .479f , 0.0000f);
glVertex3f(.470f , .463f , 0.0000f);
glEnd();
//LEGS OF MAIN CHARACHTER
if (switchstance == 1 || time == 3 || time == 4 || time == 5 || time == 6 || time == 7)
{
glClear(GL_DEPTH_BUFFER_BIT);
glColor3f(.50, 0.50, 0.50);
glBegin(GL_POLYGON);
glVertex3f(.484f , .456f , 0.0000f);
glVertex3f(.484f , .463f , 0.0000f);
glVertex3f(.471f , .463f , 0.0000f);
glVertex3f(.471f , .456f , 0.0000f);
glEnd();
}
if(switchstance != 1 && time != 3 && time != 4 && time != 5 && time != 6 && time != 7)
{
glClear(GL_DEPTH_BUFFER_BIT);
glColor3f(.50, 0.50, 0.50);
glBegin(GL_POLYGON);
glVertex3f(.490f , .459f , 0.0000f);
glVertex3f(.485f , .463f , 0.0000f);
glVertex3f(.477f , .463f , 0.0000f);
glVertex3f(.485f , .459f, 0.0000f);
glEnd();
glColor3f(.50, 0.50, 0.50);
glBegin(GL_POLYGON);
glVertex3f(.465f , .459f , 0.0000f);
glVertex3f(.470f , .463f , 0.0000f);
glVertex3f(.477f , .463f , 0.0000f);
glVertex3f(.470f , .459f, 0.0000f);
glEnd();
}
//ARMS OF MAN CHARACHTER
if(switchstance != 1 && time != 4 && time != 5 && time != 6 && time != 7 && time != 8)
{
glClear(GL_DEPTH_BUFFER_BIT);
glColor3f(1.00, 0.92, 0.92);
glBegin(GL_POLYGON);
glVertex3f(.467f , .466f , 0.0000f);
glVertex3f(.467f , .470f , 0.0000f);
glVertex3f(.471f , .470f , 0.0000f);
glVertex3f(.471f , .466f , 0.0000f);
glEnd();
}
if (switchstance == 1 || time == 4 || time == 5 || time == 6 || time == 7 || time == 8)
{
glClear(GL_DEPTH_BUFFER_BIT);
glColor3f(1.00, 0.92, 0.92);
glBegin(GL_POLYGON);
glVertex3f(.475f , .464f , 0.0000f);
glVertex3f(.475f , .468f , 0.0000f);
glVertex3f(.480f , .468f , 0.0000f);
glVertex3f(.480f , .464f , 0.0000f);
glEnd();
}
glPopAttrib();
glPopMatrix();
}
glutSwapBuffers();
}
void TimerFunction(int value)
{
glutTimerFunc(1, TimerFunction, 1);
time = time + 1;
if (time > 10)
{
time = 0;
switchstance = 1;
}
glutPostRedisplay();
}
void SpecialKeys(int key, int x, int y)
{
if (key == GLUT_KEY_RIGHT)
{
//s = 0;
s = s - .0045;
direction = 0;
switchstance = 0;
time = 0;
posx = posx - .045;
}
if (key == GLUT_KEY_LEFT)
{
//s = 0;
s = s + .0045;
direction = 1;
switchstance = 0;
time = 0;
posx = posx + .0045;
}
if (key == GLUT_KEY_UP)
{
a = a + .045;
posy = posy + .045;
}
if (key == GLUT_KEY_DOWN)
{
a = a - .045;
posy = posy - .045;
}
glutPostRedisplay();
}
int main(int argc, char *argv[])
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(1024, 1024);
glutCreateWindow(“ARENIUS: THE SACRED STONE”);
glutDisplayFunc(RenderScene);
glutSpecialFunc(SpecialKeys);
glutTimerFunc(1, TimerFunction, 1);
init();
glutMainLoop();
return 0;
}