2014-04-01 104 views
0

我遇到了纹理显示通过它前面的纹理的问题。我正在建造一个迷宫,墙壁后面墙壁上的纹理正在显示出来。我该如何解决这个问题?OpenGL纹理深度(裁剪纹理)

http://imgur.com/1DPNj9L

继承人我的代码。

#include <windows.h> 
#include <GL/gl.h> 
#include <GL/glut.h> 
#include <stdio.h> 

GLuint texture; //the array for our texture 
GLuint sky; 

float cameraz = -1.0; 


GLuint LoadTexture(const char * filename) 
{ 

    GLuint texture; 

    int width, height; 

    unsigned char * data; 

    FILE * file; 
    int i; 

    file = fopen(filename, "rb"); 

    if (file == NULL) return 0; 
    width = 512; 
    height = 512; 
    data = (unsigned char *)malloc(width * height * 3); 
    //int size = fseek(file,); 
    fread(data, width * height * 3, 1, file); 
    fclose(file); 

for(i = 0; i < width * height ; ++i) 
{ 
    int index = i*3; 
    unsigned char B,R; 
    B = data[index]; 
    R = data[index+2]; 

    data[index] = R; 
    data[index+2] = B; 

} 

glGenTextures(1, &texture); 
glBindTexture(GL_TEXTURE_2D, texture); 
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_MODULATE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); 


glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,GL_REPEAT); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,GL_REPEAT); 
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, width, height,GL_RGB, GL_UNSIGNED_BYTE, data); 
free(data); 

return texture; 
} 

void FreeTexture(GLuint texture) 
{ 
    glDeleteTextures(1, &texture); 
} 
/* 
void drawBackground() 
     { 
    glMatrixMode(GL_PROJECTION); 
    glPushMatrix(); 
    glOrtho(0, 1, 0, 1, 0, 1); 

    glMatrixMode(GL_MODELVIEW); 
    glPushMatrix(); 
    glLoadIdentity(); 

    // No depth buffer writes for background. 
    //glDepthMask(false); 

    glBindTexture(GL_TEXTURE_2D,sky); 
    glBegin(GL_QUADS); { 
     glTexCoord2f(0.0f, 0.0f); 
     glVertex2f(0.0f, 0.0f); 
     glTexCoord2f(0.0f, 1.0f); 
     glVertex2f(0.0f, 1.0f); 
     glTexCoord2f(1.0f, 1.0f); 
     glVertex2f(1.0f, 1.0f); 
     glTexCoord2f(1.0f, 0.0f); 
     glVertex2f(1.0f, 0.0f); 
    } glEnd(); 

    //glDepthMask(true); 

    glPopMatrix(); 
    glMatrixMode(GL_PROJECTION); 
    glPopMatrix(); 
    glMatrixMode(GL_MODELVIEW); 
     }*/ 
void drawMaze (void) { 


    glBegin(GL_QUADS); 
    glVertex3d(-500.0, 0, -500.0); 
    glVertex3d(500.0, 0, -500.0); 
    glVertex3d(500.0, 0, 500.0); 
    glVertex3d(-500.0, 0, 500.0); 
    glPushMatrix(); 
    glBegin (GL_QUADS); 
    glTexCoord2d(0.0,0.0); glVertex3d(0.0, 0.0, 0.0); 
    glTexCoord2d(7.0,0.0); glVertex3d(0.0, 0.0, 7.0); 
    glTexCoord2d(7.0,1.0); glVertex3d(0.0, 1.0, 7.0); 
    glTexCoord2d(0.0,1.0); glVertex3d(0.0, 1.0, 0.0); 
    glEnd(); 
    glPopMatrix(); 

    glPushMatrix(); 
    glBegin (GL_QUADS); 
    glTexCoord2d(0.0,0.0); glVertex3d(0.0, 0.0, 7.0); 
    glTexCoord2d(4.0,0.0); glVertex3d(4.0, 0.0, 7.0); 
    glTexCoord2d(4.0,1.0); glVertex3d(4.0, 1.0, 7.0); 
    glTexCoord2d(0.0,1.0); glVertex3d(0.0, 1.0, 7.0); 
    glEnd(); 
    glPopMatrix(); 

    glPushMatrix(); 
    glBegin (GL_QUADS); 
    glTexCoord2d(0.0,0.0); glVertex3d(5.0, 0.0, 7.0); 
    glTexCoord2d(1.0,0.0); glVertex3d(6.0, 0.0, 7.0); 
    glTexCoord2d(1.0,1.0); glVertex3d(6.0, 1.0, 7.0); 
    glTexCoord2d(0.0,1.0); glVertex3d(5.0, 1.0, 7.0); 
    glEnd(); 
    glPopMatrix(); 

    glPushMatrix(); 
    glBegin (GL_QUADS); 
    glTexCoord2d(0.0,0.0); glVertex3d(6.0, 0.0, 0.0); 
    glTexCoord2d(7.0,0.0); glVertex3d(6.0, 0.0, 7.0); 
    glTexCoord2d(7.0,1.0); glVertex3d(6.0, 1.0, 7.0); 
    glTexCoord2d(0.0,1.0); glVertex3d(6.0, 1.0, 0.0); 
    glEnd(); 
    glPopMatrix(); 

    glPushMatrix(); 
    glBegin (GL_QUADS); 
    glTexCoord2d(0.0,0.0); glVertex3d(1.0, 0.0, 0.0); 
    glTexCoord2d(5.0,0.0); glVertex3d(6.0, 0.0, 0.0); 
    glTexCoord2d(5.0,1.0); glVertex3d(6.0, 1.0, 0.0); 
    glTexCoord2d(0.0,1.0); glVertex3d(1.0, 1.0, 0.0); 
    glEnd(); 
    glPopMatrix(); 

    glPushMatrix(); 
    glBegin (GL_QUADS); 
    glTexCoord2d(0.0,0.0); glVertex3d(1.0, 0.0, 0.0); 
    glTexCoord2d(2.0,0.0); glVertex3d(1.0, 0.0, 2.0); 
    glTexCoord2d(2.0,1.0); glVertex3d(1.0, 1.0, 2.0); 
    glTexCoord2d(0.0,1.0); glVertex3d(1.0, 1.0, 0.0); 
    glEnd(); 
    glPopMatrix(); 

    glPushMatrix(); 
    glBegin (GL_QUADS); 
    glTexCoord2d(0.0,0.0); glVertex3d(1.0, 0.0, 2.0); 
    glTexCoord2d(2.0,0.0); glVertex3d(2.0, 0.0, 2.0); 
    glTexCoord2d(2.0,1.0); glVertex3d(2.0, 1.0, 2.0); 
    glTexCoord2d(0.0,1.0); glVertex3d(1.0, 1.0, 2.0); 
    glEnd(); 
    glPopMatrix(); 

    glPushMatrix(); 
    glBegin (GL_QUADS); 
    glTexCoord2d(0.0,0.0); glVertex3d(3.0, 0.0, 0.0); 
    glTexCoord2d(1.0,0.0); glVertex3d(3.0, 0.0, 1.0); 
    glTexCoord2d(1.0,1.0); glVertex3d(3.0, 1.0, 1.0); 
    glTexCoord2d(0.0,1.0); glVertex3d(3.0, 1.0, 0.0); 
    glEnd(); 
    glPopMatrix(); 

    glPushMatrix(); 
    glBegin (GL_QUADS); 
    glTexCoord2d(0.0,0.0); glVertex3d(2.0, 0.0, 1.0); 
    glTexCoord2d(1.0,0.0); glVertex3d(3.0, 0.0, 1.0); 
    glTexCoord2d(1.0,1.0); glVertex3d(3.0, 1.0, 1.0); 
    glTexCoord2d(0.0,1.0); glVertex3d(2.0, 1.0, 1.0); 
    glEnd(); 
    glPopMatrix(); 

    glPushMatrix(); 
    glBegin (GL_QUADS); 
    glTexCoord2d(0.0,0.0); glVertex3d(4.0, 0.0, 1.0); 
    glTexCoord2d(2.0,0.0); glVertex3d(6.0, 0.0, 1.0); 
    glTexCoord2d(2.0,1.0); glVertex3d(6.0, 1.0, 1.0); 
    glTexCoord2d(0.0,1.0); glVertex3d(4.0, 1.0, 1.0); 
    glEnd(); 
    glPopMatrix(); 

    glPushMatrix(); 
    glBegin (GL_QUADS); 
    glTexCoord2d(0.0,0.0); glVertex3d(3.0, 0.0, 2.0); 
    glTexCoord2d(2.0,0.0); glVertex3d(5.0, 0.0, 2.0); 
    glTexCoord2d(2.0,1.0); glVertex3d(5.0, 1.0, 2.0); 
    glTexCoord2d(0.0,1.0); glVertex3d(3.0, 1.0, 2.0); 
    glEnd(); 
    glPopMatrix(); 

    glPushMatrix(); 
    glBegin (GL_QUADS); 
    glTexCoord2d(0.0,0.0); glVertex3d(3.0, 0.0, 2.0); 
    glTexCoord2d(1.0,0.0); glVertex3d(3.0, 0.0, 3.0); 
    glTexCoord2d(1.0,1.0); glVertex3d(3.0, 1.0, 3.0); 
    glTexCoord2d(0.0,1.0); glVertex3d(3.0, 1.0, 2.0); 
    glEnd(); 
    glPopMatrix(); 

    glPushMatrix(); 
    glBegin (GL_QUADS); 
    glTexCoord2d(0.0,0.0); glVertex3d(2.0, 0.0, 3.0); 
    glTexCoord2d(1.0,0.0); glVertex3d(3.0, 0.0, 3.0); 
    glTexCoord2d(1.0,1.0); glVertex3d(3.0, 1.0, 3.0); 
    glTexCoord2d(0.0,1.0); glVertex3d(2.0, 1.0, 3.0); 
    glEnd(); 
    glPopMatrix(); 

    glPushMatrix(); 
    glBegin (GL_QUADS); 
    glTexCoord2d(0.0,0.0); glVertex3d(2.0, 0.0, 3.0); 
    glTexCoord2d(1.0,0.0); glVertex3d(2.0, 0.0, 4.0); 
    glTexCoord2d(1.0,1.0); glVertex3d(2.0, 1.0, 4.0); 
    glTexCoord2d(0.0,1.0); glVertex3d(2.0, 1.0, 3.0); 
    glEnd(); 
    glPopMatrix(); 

    glPushMatrix(); 
    glBegin (GL_QUADS); 
    glTexCoord2d(0.0,0.0); glVertex3d(2.0, 0.0, 4.0); 
    glTexCoord2d(1.0,0.0); glVertex3d(3.0, 0.0, 4.0); 
    glTexCoord2d(1.0,1.0); glVertex3d(3.0, 1.0, 4.0); 
    glTexCoord2d(0.0,1.0); glVertex3d(2.0, 1.0, 4.0); 
    glEnd(); 
    glPopMatrix(); 

    glPushMatrix(); 
    glBegin (GL_QUADS); 
    glTexCoord2d(0.0,0.0); glVertex3d(3.0, 0.0, 4.0); 
    glTexCoord2d(1.0,0.0); glVertex3d(3.0, 0.0, 5.0); 
    glTexCoord2d(1.0,1.0); glVertex3d(3.0, 1.0, 5.0); 
    glTexCoord2d(0.0,1.0); glVertex3d(3.0, 1.0, 4.0); 
    glEnd(); 
    glPopMatrix(); 

    glPushMatrix(); 
    glBegin (GL_QUADS); 
    glTexCoord2d(0.0,0.0); glVertex3d(1.0, 0.0, 5.0); 
    glTexCoord2d(2.0,0.0); glVertex3d(3.0, 0.0, 5.0); 
    glTexCoord2d(2.0,1.0); glVertex3d(3.0, 1.0, 5.0); 
    glTexCoord2d(0.0,1.0); glVertex3d(1.0, 1.0, 5.0); 
    glEnd(); 
    glPopMatrix(); 

    glPushMatrix(); 
    glBegin (GL_QUADS); 
    glTexCoord2d(0.0,0.0); glVertex3d(1.0, 0.0, 3.0); 
    glTexCoord2d(3.0,0.0); glVertex3d(1.0, 0.0, 6.0); 
    glTexCoord2d(3.0,1.0); glVertex3d(1.0, 1.0, 6.0); 
    glTexCoord2d(0.0,1.0); glVertex3d(1.0, 1.0, 3.0); 
    glEnd(); 
    glPopMatrix(); 

    glPushMatrix(); 
    glBegin (GL_QUADS); 
    glTexCoord2d(0.0,0.0); glVertex3d(0.0, 0.0, 3.0); 
    glTexCoord2d(1.0,0.0); glVertex3d(1.0, 0.0, 3.0); 
    glTexCoord2d(1.0,1.0); glVertex3d(1.0, 1.0, 3.0); 
    glTexCoord2d(0.0,1.0); glVertex3d(0.0, 1.0, 3.0); 
    glEnd(); 
    glPopMatrix(); 

    glPushMatrix(); 
    glBegin (GL_QUADS); 
    glTexCoord2d(0.0,0.0); glVertex3d(4.0, 0.0, 3.0); 
    glTexCoord2d(2.0,0.0); glVertex3d(6.0, 0.0, 3.0); 
    glTexCoord2d(2.0,1.0); glVertex3d(6.0, 1.0, 3.0); 
    glTexCoord2d(0.0,1.0); glVertex3d(4.0, 1.0, 3.0); 
    glEnd(); 
    glPopMatrix(); 

    glPushMatrix(); 
    glBegin (GL_QUADS); 
    glTexCoord2d(0.0,0.0); glVertex3d(4.0, 0.0, 3.0); 
    glTexCoord2d(2.0,0.0); glVertex3d(4.0, 0.0, 5.0); 
    glTexCoord2d(2.0,1.0); glVertex3d(4.0, 1.0, 5.0); 
    glTexCoord2d(0.0,1.0); glVertex3d(4.0, 1.0, 3.0); 
    glEnd(); 
    glPopMatrix(); 

    glPushMatrix(); 
    glBegin (GL_QUADS); 
    glTexCoord2d(0.0,0.0); glVertex3d(4.0, 0.0, 5.0); 
    glTexCoord2d(1.0,0.0); glVertex3d(5.0, 0.0, 5.0); 
    glTexCoord2d(1.0,1.0); glVertex3d(5.0, 1.0, 5.0); 
    glTexCoord2d(0.0,1.0); glVertex3d(4.0, 1.0, 5.0); 
    glEnd(); 
    glPopMatrix(); 

    glPushMatrix(); 
    glBegin (GL_QUADS); 
    glTexCoord2d(0.0,0.0); glVertex3d(5.0, 0.0, 4.0); 
    glTexCoord2d(1.0,0.0); glVertex3d(6.0, 0.0, 4.0); 
    glTexCoord2d(1.0,1.0); glVertex3d(6.0, 1.0, 4.0); 
    glTexCoord2d(0.0,1.0); glVertex3d(5.0, 1.0, 4.0); 
    glEnd(); 
    glPopMatrix(); 

    glPushMatrix(); 
    glBegin (GL_QUADS); 
    glTexCoord2d(0.0,0.0); glVertex3d(2.0, 0.0, 6.0); 
    glTexCoord2d(3.0,0.0); glVertex3d(5.0, 0.0, 6.0); 
    glTexCoord2d(3.0,1.0); glVertex3d(5.0, 1.0, 6.0); 
    glTexCoord2d(0.0,1.0); glVertex3d(2.0, 1.0, 6.0); 
    glEnd(); 
    glPopMatrix(); 

    glPushMatrix(); 
    glBegin (GL_QUADS); 
    glTexCoord2d(0.0,0.0); glVertex3d(4.0, 0.0, 6.0); 
    glTexCoord2d(1.0,0.0); glVertex3d(4.0, 0.0, 7.0); 
    glTexCoord2d(1.0,1.0); glVertex3d(4.0, 1.0, 7.0); 
    glTexCoord2d(0.0,1.0); glVertex3d(4.0, 1.0, 6.0); 
    glEnd(); 
    glPopMatrix(); 
} 

void display (void) { 
    glClearColor (0.0,0.0,0.0,1.0); 
    glClear (GL_COLOR_BUFFER_BIT); 
    glLoadIdentity(); 
    glEnable(GL_TEXTURE_2D); //enable texturing 
    //glDepthMask(GL_TRUE); 
    gluLookAt (0.5, 0.5, cameraz, 0.5, 1.0, cameraz + 1.0, 0.0, 1.0, 0.0); 
    //drawBackground(); 
    drawMaze(); 
    glutSwapBuffers(); 
} 
void reshape (int w, int h) { 
    glViewport (0, 0, (GLsizei)w, (GLsizei)h); 
    glMatrixMode (GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective (60, (GLfloat)w/(GLfloat)h, 1.0, 100.0); 
    glMatrixMode (GL_MODELVIEW); 
} 
void arrow_keys (int a_keys, int x, int y) // Create Special Function (required for arrow keys) 
{ 
    switch (a_keys) { 
    case GLUT_KEY_UP: 
     cameraz += 0.1; 
     break; 
    case GLUT_KEY_DOWN: 
     cameraz -= 0.1; 
     break; 
    case GLUT_KEY_LEFT: 
     cameraz += 0.1; 
     break; 
    case GLUT_KEY_RIGHT: 
     cameraz += 0.1; 
     break; 
    default: 
     break; 
    } 
} 

void init(){ 
    texture = LoadTexture("wall.bmp"); 
    //sky = LoadTexture("sky.bmp"); 

} 
int main (int argc, char **argv) { 
    glutInit (&argc, argv); 
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGBA); 
    glutInitWindowSize (500, 500); 
    glutInitWindowPosition (100, 100); 
    glutCreateWindow ("Mipmaps example"); 
    init(); 
    glutDisplayFunc (display); 
    glutIdleFunc (display); 
    glutReshapeFunc (reshape); 
    glutSpecialFunc  (arrow_keys); 
    texture = LoadTexture("texture.raw", 256, 256); 

    glutMainLoop(); 

    FreeTexture(texture); 

    return 0; 
} 

感谢

回答

1

首先,你需要问一个深度缓冲区,当你初始化显示:

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); 

您还需要绘制迷宫前启用深度测试:

glEnable(GL_DEPTH_TEST); 

您也可以取消注释glDepthMask(GL_TRUE);,但深度编写应该启用默认。

+0

我认为深度测试默认情况下是启用的,所以你对这两个问题都是正确的:)非常感谢你 – user1637466