2016-10-25 4 views
0

Ich zeichne ein Quad in OpenGL und dann glReadPixels, um auf den Tiefenpuffer zuzugreifen. Aber das Problem ist, ich bekomme immer 1 von der ganzen Position des OpenGL-Fensters. Beispiel: Für zbuffer [0] [0] (siehe Code unten) sollte der Wert 0 sein, da dieser Teil des Fensters kein Objekt enthält. Auch für zbuffer [639] [470] sollte der Wert ebenfalls 0 sein, aber ich erhalte für beide Fälle 1.OpenGL- ungenaue Tiefenwerte aus dem Z-Puffer

Können Sie mir bitte zeigen, was ich hier falsch mache?

#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; 
} 

Und hier das Objekt in OpenGL gezeichnet ist:

enter image description here

Antwort

2

Zum Beispiel für Z-Buffer [0] [0] (bitte den Code siehe unten), sollte der Wert sein 0, weil dieser Teil des Fensters kein Objekt hat.

Nein, sollte es nicht. Der Standard glClearDepth Wert ist 1,0, also setzt glClear(GL_DEPTH_BUFFER_BIT) jedes Pixel im Tiefenpuffer auf 1.0. Dies ist auch sinnvoll, da bei Verwendung der dfeault-Konventionen die nahe Ebene im Fensterbereich auf z=0 und die ferne Ebene auf z=1 abgebildet wird und der Tiefentest auf GL_LESS gesetzt wird, so dass Fragmente passieren, die näher am aktuell gezeichneten sind an dieser Position.

+0

Vielen Dank für Ihre Erklärung. Könntest du mir bitte sagen, wie ich Tiefenwerte (aus dem Z-Puffer) für das Objekt, das ich gezeichnet habe, bekommen kann? Ich bekomme 1 für alle Positionen. – Tariq

+0

@Tariq: Nun, lesen Sie einfach die Werte bei einem Pixel, der tatsächlich von dem Objekt, das Sie gezeichnet haben, betroffen ist. Ich habe den Code kurz überflogen und denke, dass das Bildfensterzentrum 320, 240 Ihr primitives Element abdecken sollte. – derhass

+0

Ich bekomme 0.990594 für den Viewport-Center (320, 240). Es klingt vielleicht dumm, aber ich konnte nicht ganz nachvollziehen, welchen Wert ich für das Objekt, das ich gezeichnet habe, und für den schwarzen Teil des Darstellungsbereichs erwarten würde (siehe Bild im Anhang). Ich dachte, dass ich für das gezeichnete Objekt Werte größer als 0 und für den leeren Teil des Bildschirms 0 erhalten würde. – Tariq

Verwandte Themen