2016-10-25 15 views
0

OpenGLでクワッドを描画してから、glReadPixelsを使用して深度バッファにアクセスします。しかし、問題は、私は常にOpenGLウィンドウのすべての位置から1を得ているということです。たとえば、zbuffer [0] [0](以下のコードを参照してください)では、ウィンドウのその部分にオブジェクトがないため、値は0になります。 zbuffer [639] [470]の場合も、値は0にする必要がありますが、どちらの場合も1を受け取ります。OpenGLの不正確な深さの値がzバッファから返される

ここで間違っていることを教えてください。

#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

関連する問題