2013-10-14 7 views
0

glDepthTest를 사용하여 코드를 작성했으며 투영 Z 버퍼 값의 공식이 무엇인지 이해하려고합니다./(farZ - nearZ) -
Z 버퍼의 값 = (Z_value farZ)glDepthTest의 사용이 명확하지 않습니다.

#define CUBE_SIDE_SIZE 512.0f 
    #define Z_SIZE -0.25f 
    #define WINDOW_WIDTH 1024 
    #define WINDOW_HEIGHT 768 
    void init(void) 
    { 
    glViewport(0,0,WINDOW_WIDTH,WINDOW_HEIGHT); 
    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
    glOrtho(0,WINDOW_WIDTH,0,WINDOW_HEIGHT, -1, 1); 
    } 

    void display(void) 
    { 
    GLfloat readPixel; 

    glClearColor(0.0,0.0,0.0,0.0); 
    glClearDepth(0.8); 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 

    glEnable(GL_DEPTH_TEST); 
    glDepthFunc(GL_LESS); 

    glBegin(GL_QUADS); 

    glColor3f(1, 0, 0); 

    glVertex3f(0, 0, Z_SIZE); 
    glVertex3f(0, CUBE_SIDE_SIZE, Z_SIZE); 
    glVertex3f(CUBE_SIDE_SIZE, CUBE_SIDE_SIZE, Z_SIZE); 
    glVertex3f(CUBE_SIDE_SIZE, 0, Z_SIZE); 
    glEnd(); 
    glDisable(GL_DEPTH_TEST); 
    glFlush(); 
    glutSwapBuffers(); 
    glReadPixels(0,0,1.0,1.0,GL_DEPTH_COMPONENT, GL_FLOAT, &readPixel); 
} 

이 경우 readPixel의 값은 0.625이며, 그래서 계산이 생각 :

가이 코드를 실행 제 경우
:

[1 - (-0.25)]/1 - (- 1)] = 0.625

1.25/2 그러나 난이 변화 할 때 1 #DEFINE의 Z_SIZE을 0.25f 2. gl 직교 (0, WINDOW_WIDTH, 0, WINDOW_HEIGHT, 0, 1);

readPixel에서 값 0.8을 얻었지만 깊이 테스트를 잘못 수행 한 것과 같지만 Z 버퍼 값을 계산하면 (1 - 0.25)/(1 - 0) = 0.75와 같아야합니다. 0.8 (명확한 깊이 값).

이 동작을 설명 할 수 있습니까?

답변

1

그렇게 생각 계산은 : Z 버퍼의 값 = (farZ - Z_value)/(farZ - nearZ)

아니. 추가 분할 요소 1/w이 들어갑니다. 즉, 깊이 버퍼 값은 선형 진행을 따르지 않습니다. 그들은 단조롭다.

pos_view = ModelviewMatrix · vertex_position 
pos_projected = ProjectionMatrix · pos_view 
pos_clipped = clip_prmitive(pos_projected) 
pos_NDC = pos_clipped.xyz/pos_clipped.w 

pos_NDC.z가 깊이 버퍼의 값은 다음처럼

NDC의 계산은 조정한다. 변환 단계를 이해하기위한 실질적인 방법은 모두 clip_primitive(…)을 항등 변환으로 간주 할 수 있습니다. 즉, 항목을 변경하지 않아도됩니다.

+0

나는 w가 오르막이 아닌 절정에서만 사용되었다고 생각했다. – user2877748

+1

@ user2877748 : 항상 사용되지만 정사영 w = 1을 사용합니다. – datenwolf

+0

따라서 ortho를 사용하고 변환이없는 Z 버퍼 값은 선형으로 변경됩니까? 그렇다면 작성된 수식이 OK입니까? 감사합니다 – user2877748

관련 문제