2016-10-25 2 views
0

OpenGL에서 쿼드를 그린 다음 glReadPixels를 사용하여 깊이 버퍼에 액세스합니다. 하지만 문제는 OpenGL 윈도우의 모든 위치에서 항상 1을 얻고 있다는 것입니다. 예를 들어, zbuffer [0] [0] (아래 코드를보십시오)의 값은 0이어야합니다. 왜냐하면 윈도우의 해당 부분에 객체가 없기 때문입니다. zbuffer [639] [470]에 대해서도 값은 0이어야하지만 두 경우 모두 1을받습니다.z 버퍼의 OpenGL- 정확하지 않은 깊이 값

내가 여기서 잘못하고있는 것을 지적 해 주시겠습니까?

#include <GL/glut.h> 
#include <GL/gl.h> 
#include <GL/glu.h> 
#include <iostream> 
#include <fstream> 

using namespace std; 



void display () // Create The Display Function 
{ 

    glEnable(GL_DEPTH_TEST); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    gluLookAt(0.0 ,0.0 ,0.0 ,0.0 ,0.0 ,-1.0 ,0.0 ,1.0 ,0.0); 


    glBegin(GL_QUADS); 

     glColor3f(0.813205,0.813205,0.813205); 
     glVertex3f(-0.389662380802125,0.249152038469432, -1.12528215173346); // top left corner 

     glColor3f(0.309385,0.309385,0.309385); 
     glVertex3f(0.433401472883409,0.272288002674917, -0.923754348668237); // top right corner 

     glColor3f(0.288292,0.288292,0.288292); 
     glVertex3f(0.441173907261717,-0.296124431126115, -0.915317251508196);// bottom right corner 

     glColor3f(0.74028,0.74028,0.74028); 
     glVertex3f(-0.388657135983495,-0.317680965994535, -1.09611219327051); // bottom left corner 


    glEnd(); 

    GLfloat zbuffer[640][480]; 

    glReadPixels(0,0,640,480,GL_DEPTH_COMPONENT,GL_FLOAT, zbuffer); 

    cout<<"Depth1:"<<zbuffer[0][0]<<endl; 
    cout<<"Depth2:"<<zbuffer[639][470]<<endl; 

    glFlush(); 

    glutSwapBuffers (); 
} 

void reshape (int w, int h) // Create The Reshape Function (the viewport) 
{ 
    glViewport(0 ,0 ,(GLsizei)w,(GLsizei)h); 
    glMatrixMode (GL_PROJECTION); 
    glLoadIdentity (); 
    gluPerspective(48.6f, (GLfloat) 640/480, 0.01f, 1000.0f); 
    glMatrixMode (GL_MODELVIEW) ; 
} 

void keyboard (unsigned char key, int x, int y) // Create Keyboard Function 
{ 
    switch (key) { 
    case 27:  // When Escape Is Pressed... 
     exit (0); // Exit The Program 
     break;  // Ready For Next Case 
    default:  // Now Wrap It Up 
     break; 
    } 
} 

void mouse(int button, int state, int x, int y) { 

     float mx = x ; 
     float my = y ; 
//  ox = (mx/320-1.0); 
//  oy = -(my/240 -1.0); 
     switch(button){ 
      case GLUT_LEFT_BUTTON: 
       if(state==GLUT_DOWN){ 
        printf("%f,",mx); 
        printf("%f\n",my); 
       } 
       break; 
     } 
} 

int main (int argc, char** argv) 
{ 
    glutInit   (&argc, argv); 
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); 
    glutInitWindowSize (640, 480); 
    glutInitWindowPosition(0, 0); 
    glutCreateWindow ("My Window"); directory as title) 
    glutReshapeFunc (reshape) ; 
    glutDisplayFunc  (display); // Matching Earlier Functions To Their Counterparts 
    glutKeyboardFunc (keyboard); 
    glutMouseFunc(mouse); 
    glutMainLoop  ();   // Initialize The Main Loop 


    return 0; 
} 

그리고 여기에서 OpenGL 그려진 목적은 예를 들어

enter image description here

답변

2

[0] [0] (아래의 코드 참조) z 버퍼의 경우, 값이되어야 0, 왜냐하면 윈도우의 해당 부분에는 객체가 없기 때문입니다.

아니요. 기본값 인 glClearDepth은 1.0이므로 glClear(GL_DEPTH_BUFFER_BIT)은 깊이 버퍼의 모든 픽셀을 1.0으로 설정합니다. 이것은 dfeault 규칙을 사용하면 가까운 평면이 창 공간의 z=0에 매핑되고 원거리 평면이 z=1으로 매핑되고 깊이 테스트가 GL_LESS으로 설정되어 조각이 현재 그려지는 부분에 더 가깝게 통과하므로 의미가 있습니다 그 위치에서.

+0

설명해 주셔서 감사합니다. 내가 직접 그려 놓은 물체의 깊이 값 (z- 버퍼로부터)을 어떻게 얻을 수 있습니까? 나는 모든 지위에 대해 1을 얻고있다. – Tariq

+0

@Tariq : 음, 실제로 그려진 개체의 영향을받는 픽셀의 값을 다시 읽으십시오. 귀하의 코드를 간단히 살펴본 후 뷰포트 센터 320,240이 프리미티브를 커버해야한다고 생각합니다. – derhass

+0

뷰포트 센터 (320, 240)에 0.990594가 표시됩니다. 그것은 어리석은 소리 일지 모르지만 필자가 그린 피사체와 뷰포트의 검정색 부분에 대해 어떤 가치를 기대해야하는지 이해할 수 없습니다 (첨부 된 이미지 참조). 나는 그려진 객체에 대해 0보다 큰 값을 얻고 화면의 빈 부분에 대해서는 0을 얻을 것이라고 생각했습니다. – Tariq