2017-01-30 9 views
1

動作していない、と私はデプステストを有効にしてみました。OpenGLのデプステストは、私はOpenGLを使用してモデルを作成しようとしています

は、私は私のmainにこれらのコマンドを使用します。

glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); 
glEnable(GL_DEPTH_TEST); 

そして、この私のディスプレイで:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

私も追加してみました:

glDepthFunc(GL_LEQUAL); 

をそして、それは動作しません。 。私は深刻な問題だと私が思うものはまだ見ることができます。ここ は、問題を示すビデオです:https://www.youtube.com/watch?v=OafrRH4Mzjc

  • 注:そのビデオでは、ボードは、第一の角度がOKであるので、左から右、上から下への構築であるが、他の角度が悪いです。

私は何をしないのですか?


編集

#define _CRT_SECURE_NO_WARNINGS 

#define SIZE_MOVES 17 

#include <stdio.h> 

/* Include the GLUT library. This file (glut.h) contains gl.h and glu.h */ 
#include <GL\glew.h> 
#include <GL\freeglut.h> 

static int left_click = GLUT_UP; 
static int right_click = GLUT_UP; 
static int xold; 
static int yold; 
static float rotate_x = 146; 
static float rotate_y = -26; 

int width, height; 

GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 }; 
GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 }; 
GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 }; 
GLfloat light_position[] = { 0, 5, -10, 0 }; 

GLfloat mat_specular[] = { 0.3, 0.3, 0.3, 1.0 }; 
GLfloat mat_shininess[] = { 1 }; 


// colors 
const GLfloat colors[2][4] = { 
    { 1.0, 1.0, 1.0, 1.0 }, //white 
    { 0.0, 0.0, 0.0, 1.0 } //black 
}; 

// rgb 
const GLfloat rgb[3][4] = { 
    { 1.0, 0.0, 0.0, 1.0 }, 
    { 0.0, 1.0, 0.0, 1.0 }, 
    { 0.0, 0.0, 1.0, 1.0 } 
}; 

void resetMaterial() { 
    GLfloat c[] = { 1, 1, 1, 1 }; 
    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, c); 
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular); 
    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess); 
} 

void drawSquare(int color) { 
    glPushMatrix(); { 
     glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, colors[color]); 

     glScalef(1, 0.5, 1); 
     glutSolidCube(1); 
    } glPopMatrix(); 
} 

void drawBoard() { 
    for (int i = 0; i < 8; i++) 
     for (int j = 0; j < 8; j++) { 
      glPushMatrix(); { 
       glTranslatef(i + 0.5, 0, j + 0.5); 
       drawSquare((i + j) % 2); 
      } glPopMatrix(); 
     } 
} 

void drawAxes() { 
    glBegin(GL_LINES); { 
     glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, rgb[0]); 
     glVertex3f(-2, 0, 0); glVertex3f(5, 0, 0); 
     glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, rgb[1]); 
     glVertex3f(0, -2, 0); glVertex3f(0, 5, 0); 
     glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, rgb[2]); 
     glVertex3f(0, 0, -2); glVertex3f(0, 0, 5); 
    } glEnd(); 
} 

void letThereBeLight() { 
    /*Add ambient light*/ 
    GLfloat ambientLight[] = { 0.2f, 0.2f, 0.2f, 1.0f }; 
    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambientLight); 

    /*Add positioned light*/ 
    GLfloat lightColor1[] = { 0.2f, 0.2f, 0.1f, 1.0f }; 
    GLfloat lightPosition1[] = { -8, 8, 5, 0.0f }; 

    glLightfv(GL_LIGHT0, GL_SPECULAR, lightColor1); 
    glLightfv(GL_LIGHT0, GL_POSITION, lightPosition1); 

    /*Add directed light*/ 
    GLfloat lightColor2[] = { 0.3, 0.3, 0.3, 1.0f }; 
    GLfloat lightPosition2[] = { 8, 8, -5, 1.0f }; 
    glLightfv(GL_LIGHT1, GL_AMBIENT, lightColor2); 
    glLightfv(GL_LIGHT1, GL_POSITION, lightPosition2); 
} 

void display(void) { 
    // Clear frame buffer and depth buffer 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    // Set up viewing transformation, looking down -Z axis 
    glLoadIdentity(); 
    gluLookAt(0, 5, -15, 0, 0, 3, 0, 1, 0); 

    letThereBeLight(); 

    resetMaterial(); 

    // Rotate view: 
    glPushMatrix(); { 
     glRotatef(rotate_y, 1, 0, 0); 
     glRotatef(rotate_x, 0, 1, 0); 

     glLightfv(GL_LIGHT0, GL_POSITION, light_position); 

     glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, colors[0]); 

     glPushMatrix(); { 
      glTranslatef(-4, 0, -4); // Move to center 
      drawBoard(); 
     } glPopMatrix(); 

     drawAxes(); // For debuging 
    } glPopMatrix(); 

    /* End */ 
    glFlush(); 
    glutSwapBuffers(); 
} 

void mouseFunc(int button, int state, int x, int y) { 
    if (GLUT_LEFT_BUTTON == button) 
     left_click = state; 

    xold = x; 
    yold = y; 
} 

void motionFunc(int x, int y) { 
    if (GLUT_DOWN == left_click) { 
     rotate_y = rotate_y + (y - yold)/5.f; 
     rotate_x = rotate_x + (x - xold)/5.f; 
     glutPostRedisplay(); 
    } 

    xold = x; 
    yold = y; 
} 


void reshapeFunc(int new_width, int new_height) { 
    width = new_width; 
    height = new_height; 

    glViewport(0, 0, width, height); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    gluPerspective(50, width/height, 1, 20); 

    glMatrixMode(GL_MODELVIEW); 

    glutPostRedisplay(); 
} 

int main(int argc, char **argv) { 
    /* Creation of the window */ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); 
    glutInitWindowSize(900, 600); 
    glEnable(GL_DEPTH_TEST); 

    glutCreateWindow("Chess"); 

    glEnable(GL_CULL_FACE); 
    glCullFace(GL_BACK); 

    glEnable(GL_POLYGON_SMOOTH); 
    glEnable(GL_LINE_SMOOTH); 

    glEnable(GL_LIGHTING); 
    glEnable(GL_LIGHT0); 
    glEnable(GL_LIGHT1); 
    glShadeModel(GL_SMOOTH); 
    glDisable(GL_COLOR_MATERIAL); 

    glEnable(GL_BLEND); 
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

    /* Declaration of the callbacks */ 
    glutDisplayFunc(&display); 
    glutReshapeFunc(&reshapeFunc); 
    glutMouseFunc(&mouseFunc); 
    glutMotionFunc(&motionFunc); 

    /* Loop */ 
    glutMainLoop(); 

    /* Never reached */ 
    return 0; 
} 
+0

あなたはglDepthFuncとglEnableです(GL_CULL_FACE)は、それらに関連する可能性犯人を削除するために呼び出して削除しようとしたことがありますか? – Bartvbl

+0

@Bartvblしました。間抜けを取り除くことは悪くなります。深さ関数を削除すると何もしません – Amit

+0

これはGLUTの知識を超えています。代わりにGLFWやGLEWのようなものを使うことを勧めてもいいですか?彼らは現代のバインディングで、OpenGLの新しいバージョンで更新されています。そして、私はGLFWではデフォルトでデプスバッファを取得すると信じています。 – Bartvbl

答えて

3
gluPerspective(50, width/height, 0, 20); 
           ^wat 

zNearニーズがgreater than zeroなるように(強調鉱山):再生の最小例ファイル

デプスバッファ精度に影響されますzNearに指定された値およびzFar。デプスバッファ あまり効果、zNearzFarの比率が大きいほど互いに近い面 を区別するであろう。

r = zFar/zNear roughtly log2(r)ビットのデプスバッファ の精度が失われます。新しく投稿MCVEを考える:

int main(int argc, char **argv) { 
    /* Creation of the window */ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); 
    glutInitWindowSize(900, 600); 
    glEnable(GL_DEPTH_TEST); // too soon 

    glutCreateWindow("Chess"); 
    ... 
} 

それはちょうどdatenwolf saidようなものだzNearが0に近づくようrはzNearが0


EDITに設定してはならない、を無限に近づくのであなたは現在のGLコンテキスト(glutCreateWindow()がコンテキストを作成し、それを最新にする)を得る前にglEnable()です。

gl*()は、まで機能しません。glutCreateWindow()の後に機能しません。

+0

これを指摘してくれてありがとう、私は知らなかった。しかし、私はそれを1に変更しましたが、私は同じ結果を得ます。 – Amit

+1

@Amit:[mcve]の時間。 – genpfault

+1

私は編集を追加しました。空のファイルから始めて、メイン(設定)、変数、ライティング(それ以外はすべて白く見える)、表示機能、およびマウス左クリックドラッグを使用した回転可能なビューを追加してモデルを回転させ、ビデオのように。 – Amit

関連する問題