2017-01-20 2 views
0

"OpenGL 깊이 버퍼의 범위가 좁습니다."나는 멀리 비행기가 너무 가까이에 있다는 것을 의미하지는 않습니다. 깊이 버퍼에 질감으로 문제가 있습니다. 버퍼를 보면 매우 가까운 객체 만 보여줍니다. 나는 그 그림을 더 잘 설명하는 법을 모른다.OpenGL 깊이 버퍼의 범위가 짧습니다.

오른쪽 상단에서 깊이 버퍼를 볼 수 있습니다. 이미지는 여기에서 찾을 수 있습니다 : http://imgur.com/a/wL87b

자세히 알 수 있듯이 깊이 버퍼에 어둠이 보일 정도로 가까이 가야합니다.

깊이 텍스처의 경우 : 깊이 버퍼에

depthTexture = GL11.glGenTextures(); 
GL11.glBindTexture(GL11.GL_TEXTURE_2D, depthTexture); 
GL11.glTexImage2D(GL11.GL_TEXTURE_2D, 0, GL14.GL_DEPTH_COMPONENT24, width, height, 0, GL11.GL_DEPTH_COMPONENT, GL11.GL_FLOAT, (ByteBuffer) null); 
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MAG_FILTER, GL11.GL_LINEAR); 
GL11.glTexParameteri(GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_MIN_FILTER, GL11.GL_LINEAR); 
GL30.glFramebufferTexture2D(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, GL11.GL_TEXTURE_2D, depthTexture, 0); 

:

depthBuffer = GL30.glGenRenderbuffers(); 
GL30.glBindRenderbuffer(GL30.GL_RENDERBUFFER, depthBuffer); 
GL30.glRenderbufferStorageMultisample(GL30.GL_RENDERBUFFER, multisampleing, GL14.GL_DEPTH_COMPONENT24, width, height); 
GL30.glFramebufferRenderbuffer(GL30.GL_FRAMEBUFFER, GL30.GL_DEPTH_ATTACHMENT, GL30.GL_RENDERBUFFER, depthBuffer); 

당신은 GLXX를 무시할 수 있습니다 여기에

는 FBO에 대한 깊이 버퍼를 생성하는 코드입니다 . OpenGL 메소드의 시작 부분.

더 많은 코드가 필요하면 알려주세요.

+0

제 생각에 색상 값이 어느 시점에서 고정되어 있습니다. –

답변

1

내가 알기로 나는 깊이 버퍼의 어둠을 아주 가깝게 봐야만한다.

하이퍼 볼릭 깊이 버퍼가 작동하는 방식입니다.

(나는 카메라가 눈 공간에서 -z를 따라 보이는 고전의 OpenGL 규칙을 사용하고, 왼쪽 손으로 공간 오른 손잡이에서 투영 행렬 플립)의이 투영 행렬을 살펴 보자 :

. 0  .    0 
0 .  .    0 
0 0 -(f+n)/(f-n) -2*f*n/(f-n) 
0 0  -1    0 

(.는 우리가 여기서 신경 쓸 필요가없는 숫자를 상징합니다). 당신은 몇 가지 눈 공간 벡터 (x_eye, y_eye, z_eye, 1)와 그 행렬을 곱하면

, 당신은 w_clip에 의해 관점의 분할 후

x_clip = ... 
y_clip = .... 
z_clip = [-(f+n)/(f-n) ] *z_eye + [-2*f*n/(f-n)] * 1 
w_clip = -z_eye 

하게 될 겁니다, 우리는 정규화 장치 좌표에서 우리 z 값 (NDC)와 끝까지 :

z_ndc = z_clip/w_clip = (f+n)/(f-n) + 2*f*n/[(f-n)*z_eye] 

마지막으로, glDepthRange는 윈도우 공간 z에 도달하기 위해 적용된다. fn의도

z_win = 0.5 * z_ndc + 0.5 = 0.5*(f+n)/(f-n) + f*n/[(f-n)*z_eye] + 0.5 

이 분명 z_eye의 함수이며, : 기본값은 [-1,1] [0,1]까지 이동, 그래서 그 여기에서 할 수 있도록하는 것입니다. 의 당신이 거리 1과 거리 1001에서 멀리면에 가까운면을 사용하는 가정 해 보자, 그래서이 평가됩니다

z_win(-1) = 0. a point on the near plane ends up as 0 in the depth buffer 
z_win(-1001) = 1. a point on the far plane ends up as 1 in the depth buffer 

이 :

z_win(z_eye) = 1002/2000 + 1001/(1000 *z_eye) + 0.5 = 1001/1000 + 1001/(1000 * z_eye) 

따라서는,의는 우리가 지금까지 무엇을 가지고 확인하자 이것이 건설 당으로서 우리를 놀라게해서는 안됩니다.그러나의 점에 무슨 일 사이 : 당신이 볼로

z_win(-50) = 1001/1000 - 1001/50000 = 0.98098 
z_win(-100) = 1001/1000 - 1001/100000 = 0.99099 
z_win(-250) = 1001/1000 - 1001/250000 = 0.996996 
z_win(-500) = 1001/1000 - 1001/500000 = 0.998998 
z_win(-750) = 1001/1000 - 1001/750000 = 0.999665333 

그래서, 멀리 눈의 공간에서 100 개 단위보다 객체 더 멀리는 깊이 버퍼 값> 0.99로 끝날 것입니다.

z_eye(z_win) = 1001/(1000*z_win -1001) 
z_eye(0.5) = -1.99800399 

가 예, 그렇습니다, 1에서 프러스 텀에 함께 :

은 우리가 깊이 버퍼에 0.5을 얻을 것이다 지점에 대한 시각 공간의 Z를 계산할 수, 주위에 그것을 다른 방법을 넣으려면 1001 유닛 떨어진 곳에서는 카메라 앞에있는 1 대 2 유닛의 범위 만이 깊이 버퍼 범위의 첫 번째 절반에 매핑되고 이후 998 유닛은 후반에 채워집니다.

심도 버퍼를 색상으로 시각화하려고하면 가장 가까운 부분 외에는 아무것도 표시되지 않습니다. 8 비트 색상을 사용하면 254/255 = .996을 초과하는 모든 항목이 완전히 포화 상태가됩니다 (예를 들어 ~ 200 단위).이 경우에도 차이가 너무 작아서 거의 눈에 띄지 않습니다.

깊이 버퍼를 시각화하려면 쌍곡선 왜곡을 반전시키고 선형 (= 눈가) 깊이를 시각화해야합니다.

+0

답변 해 주셔서 감사합니다. I 왜곡을 반전 코드를 사용했을 R = (2 * nearPlane)/(+ FARPLANE nearPlane - \t texture2D (depthTexture, TEXCOORD) .R * (FARPLANE - nearPlane \t)); r은 깊이입니다. 완벽하게 작동합니다. – Wendelin

관련 문제