2013-03-18 119 views
5

我的程序下面必须显示一个以简单光照亮的旋转立方体。 问题是多维数据集闪烁。当我退出调用glEnable(GL_DEPTH_TEST)时,立方体不闪烁,但我可以看到里面的面(这是正常的,因为没有深度测试)。然而这个电话是必不可少的所以我不明白为什么这个函数的调用不能正常工作。使用glEnable显示不正确(GL_DEPTH_TEST)

这里是我的代码:

#include <iostream> 
#include <SDL/SDL.h> 
#include <gl/glut.h> 

const static int WIDTH = 640; 
const static int HEIGHT = 480; 

GLfloat angle = 0.0f; 

static GLfloat position[4] = {0.0, 50.0, -50.0, 1.0}; 
static GLfloat diffuse[3] = {0.64, 0.64, 0.64}; 
static GLfloat specular[3] = {0.64, 0.64, 0.64}; 
static GLfloat emissive[3] = {0.0, 0.0, 1.0}; 

static GLfloat vertices[72] = 
{ 
    1.000000, -1.000000, -1.000000,  //V1 
    1.000000, -1.000000, 1.000000,  //V2 
    -1.000000, -1.000000, 1.000000,  //V3 
    -1.000000, -1.000000, -1.000000, //V4 

    1.000000, 1.000000, -0.999999,  //V5 
    -1.000000, 1.000000, -1.000000,  //V8 
    -1.000000, 1.000000, 1.000000,  //V7 
    0.999999, 1.000000, 1.000001,  //V6 

    1.000000, -1.000000, -1.000000,  //V1 
    1.000000, 1.000000, -0.999999,  //V5 
    0.999999, 1.000000, 1.000001,  //V6 
    1.000000, -1.000000, 1.000000,  //V2 

    1.000000, -1.000000, 1.000000,  //V2 
    0.999999, 1.000000, 1.000001,  //V6 
    -1.000000, 1.000000, 1.000000,  //V7 
    -1.000000, -1.000000, 1.000000,  //V3 

    -1.000000, -1.000000, 1.000000,  //V3 
    -1.000000, 1.000000, 1.000000,  //V7 
    -1.000000, 1.000000, -1.000000,  //V8 
    -1.000000, -1.000000, -1.000000, //V4 

    1.000000, 1.000000, -0.999999,  //V5 
    1.000000, -1.000000, -1.000000,  //V1 
    -1.000000, -1.000000, -1.000000, //V4 
    -1.000000, 1.000000, -1.000000  //V8 
}; 

static GLfloat normals[72] = 
{ 
    0.000000, -1.000000, 0.000000, 
    0.000000, -1.000000, 0.000000, 
    0.000000, -1.000000, 0.000000, 
    0.000000, -1.000000, 0.000000, 

    0.000000, 1.000000, 0.000000, 
    0.000000, 1.000000, 0.000000, 
    0.000000, 1.000000, 0.000000, 
    0.000000, 1.000000, 0.000000, 

    1.000000, 0.000000, 0.000000, 
    1.000000, 0.000000, 0.000000, 
    1.000000, 0.000000, 0.000000, 
    1.000000, 0.000000, 0.000000, 

    -0.000000, -0.000000, 1.000000, 
    -0.000000, -0.000000, 1.000000, 
    -0.000000, -0.000000, 1.000000, 
    -0.000000, -0.000000, 1.000000, 

    -1.000000, -0.000000, -0.000000, 
    -1.000000, -0.000000, -0.000000, 
    -1.000000, -0.000000, -0.000000, 
    -1.000000, -0.000000, -0.000000, 

    0.000000, -0.000000, -1.000000, 
    0.000000, -0.000000, -1.000000, 
    0.000000, -0.000000, -1.000000, 
    0.000000, -0.000000, -1.000000 
}; 

static void  eventListener(SDL_Event *pEvent, bool *pContinue) 
{ 
    while (SDL_PollEvent(pEvent)) 
    { 
     switch(pEvent->type) 
     { 
     case SDL_QUIT: 
      *pContinue = false; 
      break; 
     case SDL_KEYDOWN: 
      switch (pEvent->key.keysym.sym) 
      { 
      case SDLK_ESCAPE: 
       *pContinue = false; 
       break; 
      } 
     } 
    } 
} 

static void  beginRender(void) 
{ 
    /*Perspective*/ 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glViewport(0, 0, WIDTH, HEIGHT); 
    gluPerspective(60.0, (float)(WIDTH/HEIGHT), 0.0f, 1000.0f); 
    gluLookAt(0.0f, 0.0, 7.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f); 

    /*Clear screen*/ 

    glClearDepth(1.0f); 
    glClearColor(0.13f, 0.12f, 0.13f, 1.0f); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    /*Prepare model transformations*/ 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    /*Light settings*/ 

    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 

    /*Depth test*/ 

    glEnable(GL_DEPTH_TEST); //PROBLEM COMES FROM HERE 
} 

static void  renderFrame(void) 
{ 
    /*light position*/ 

    glLightfv(GL_LIGHT0, GL_POSITION, position); 

    /*Model transformations*/ 

    glPushMatrix(); 
    glRotatef(angle, 0.0f, 1.0f, 1.0f); 

    /*Light materials*/ 

    glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse); 
    glMaterialfv(GL_FRONT, GL_SPECULAR, specular); 
    glMaterialfv(GL_FRONT, GL_EMISSION, emissive); 
    glMateriali(GL_FRONT, GL_SHININESS, 10); 

    /*Model rendering*/ 

    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_NORMAL_ARRAY); 

    glVertexPointer(3, GL_FLOAT, 0, vertices); 
    glNormalPointer(GL_FLOAT, 0, normals); 

    glDrawArrays(GL_QUADS, 0, 24); 

    glDisableClientState(GL_NORMAL_ARRAY); 
    glDisableClientState(GL_VERTEX_ARRAY); 

    angle += 0.010f; 
    glPopMatrix(); 
} 

static void  endRender(void) 
{ 
    glFlush(); 
    SDL_GL_SwapBuffers(); 
} 

static void  startRendering(void) 
{ 
    bool  continuer = true; 
    SDL_Event event; 

    while (continuer) 
    { 
     eventListener(&event, &continuer); 
     beginRender(); 
     renderFrame(); 
     endRender(); 
    } 
} 

int    main(int ac, char **av) 
{ 
    SDL_Init(SDL_INIT_VIDEO); 
    SDL_WM_SetCaption("Test luminosity",NULL); 
    SDL_SetVideoMode(WIDTH, HEIGHT, 32, SDL_OPENGL | SDL_DOUBLEBUF); 

    startRendering(); 
    SDL_Quit(); 
    return (0); 
} 

下面是用glEnable(GL_DEPTH_TEST)屏幕(脸上都闪烁)

enter image description here

没有这个电话(无闪烁的显示,但不能深度测试)

enter image description here

我尝试了几个代码组合,但没有成功。

有人能帮助我吗?

在此先感谢您的帮助。

回答

8

你的近剪裁平面设置不正确,所以你的Z缓冲不起作用。

gluPerspective(60.0, (float)(WIDTH/HEIGHT), 0.0f, 1000.0f); 
              ^^^^ 

将它设置为合理的距离 - 尽可能远离您的生活。

另外,不要把相机方向(即视图变换)插入投影矩阵...

最后,注意,大部分的这一功能已被弃用,不再提供GL的较新版本。推荐的方法是处理自己的矩阵计算,并使用可编程管道来渲染几何图形。

+0

你好,非常感谢你的回答。关于矩阵和几何管理我将使用我自己的矩阵管理和着色器,就像你说的。这是我的主要目标。感谢所有。再见。 – user1364743 2013-03-19 18:29:01