2013-03-18 47 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

関連する問題