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:
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
@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
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