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 그려진 목적은 예를 들어
설명해 주셔서 감사합니다. 내가 직접 그려 놓은 물체의 깊이 값 (z- 버퍼로부터)을 어떻게 얻을 수 있습니까? 나는 모든 지위에 대해 1을 얻고있다. – Tariq
@Tariq : 음, 실제로 그려진 개체의 영향을받는 픽셀의 값을 다시 읽으십시오. 귀하의 코드를 간단히 살펴본 후 뷰포트 센터 320,240이 프리미티브를 커버해야한다고 생각합니다. – derhass
뷰포트 센터 (320, 240)에 0.990594가 표시됩니다. 그것은 어리석은 소리 일지 모르지만 필자가 그린 피사체와 뷰포트의 검정색 부분에 대해 어떤 가치를 기대해야하는지 이해할 수 없습니다 (첨부 된 이미지 참조). 나는 그려진 객체에 대해 0보다 큰 값을 얻고 화면의 빈 부분에 대해서는 0을 얻을 것이라고 생각했습니다. – Tariq