2013-07-14 3 views
1

나는 답을 찾았지만 이해할 수있는 대답을 찾지 못했습니다. 그래서 깊이 버퍼에서 값을 계산하는 방법을 묻습니다. 여기 https://en.wikipedia.org/wiki/Z-buffering 에서깊이 버퍼 값 계산

이미지와 식이다 enter image description here

및 여기로 날에 의해 기록된다
Z '= (2^D-1) * ((먼곳 + 근처)/(d가 z 버퍼의 깊이 인 경우 (내 경우에는 24 비트) 일 때 2 * (가까운 거리) + (1/z) * (-far * 근처)/z는 꼭지점의 z 값입니다.

간단한 코드를 작성하여 실행하고 깊이 버퍼 값을 읽고 계산하려고했지만 다른 답을 받으십시오.

내 코드 예제 :

/* init */ 
#define CUBE_SIDE_SIZE 0.25 
glViewport(0,0,WINDOW_WIDTH,WINDOW_HEIGHT); 
glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
glOrtho(-1, 1, -1, 1, -1, 1); 
/* draw */ 
glEnable(GL_DEPTH_TEST); 
glBegin(GL_QUADS); 
glColor3f(1, 0, 0); 
glVertex3f(-CUBE_SIDE_SIZE, -CUBE_SIDE_SIZE, -CUBE_SIDE_SIZE); 
glVertex3f(-CUBE_SIDE_SIZE, CUBE_SIDE_SIZE, -CUBE_SIDE_SIZE); 
glVertex3f(CUBE_SIDE_SIZE, CUBE_SIDE_SIZE, -CUBE_SIDE_SIZE); 
glVertex3f(CUBE_SIDE_SIZE, -CUBE_SIDE_SIZE, -CUBE_SIDE_SIZE); 
glEnd(); 

나는 깊이 버퍼 0.375 값에서 읽습니다. 어떻게이 값을 계산할 수 있습니까?

감사합니다.

+0

왜 깊이 버퍼 값을 계산 하시겠습니까? Btw : OpenGL의 사용되지 않는 메소드를 사용하지 마십시오! –

답변

2

nearValue는 -1, farValue는 +1입니다. 큐브의 위치는 -0.25입니다. 따라서 가까운 평면으로부터의 거리는 0.75입니다. z 값은 깊이 범위로 스케일되며 기본값은 [0,1]입니다. farValue-nearValue = 2이므로 심도 값은 0.75/2 = 0.375입니다.

또한 투시 투영 공식을 게시했지만 직교 투영을 사용합니다.

+0

고맙지 만 위의 수식은 모두 무엇입니까? Z 버퍼 비트의 깊이가 필요하지 않습니까? – user893269

+1

아니, 그럴 필요 없어. OpenGL의 변형을 이해하려면 [9.011 좌표가 어떻게 변형 되었습니까? 다른 좌표 공간이란 무엇입니까?] (http://www.opengl.org/archives/resources/faq/technical/transformations.htm). 더 나은 리소스는 OpenGL 사양 자체입니다. OpenGL 관련 리소스를 고수하고 Wikipedia를 무시해야합니다. –

+0

만약 내가 틀렸다면이 계산으로 다음과 같이 수정하십시오.
Z 버퍼 값 = (z - nearValue)/(farValue - nearValue)
Z 버퍼는 선형이어야한다는 가정을 가지고 있습니다.
내가 무엇을 놓치고 있습니까? – user893269