2011-08-20 2 views
0

나는 FBO의 깊이 텍스처에서 깊이 값을 얻을 수 없다 .. 프로그램의 흐름은 다음과 같다 + 깊이 renderbuffer)FBO를 사용하여 심도 텍스처의 값을 가져올 수없는 이유는 무엇입니까?</p> <p>설정 <br/> 1. 만들기 PASS1의 FBO (색상 질감 + 깊이 질감) <br/> 2. 만들기 PASS2의 RBO (컬러 renderbuffer :


1 만 정점 렌더링 프로세싱 (PASS1) pass0 FBO의 깊이 질감에서
2. GET 깊이 값
3. 이전 깊이 사용 정점 및 단편 처리

0 값 단지 1.0 또는 0.0 debug_buf 배열에있다,

glBindFramebuffer(GL_FRAMEBUFFER, pass1_fbo); 
// vertex processing.. 
glActiveTexture(GL_TEXTURE1); 
glGetTexImage(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, GL_FLOAT, &debug_buf[0]); 

그러나 :

glActiveTexture(GL_TEXTURE0); 
glGenTextures(2, &pass1_tex); 
glBindTexture(GL_TEXTURE_2D, pass1_tex[0]); 
glTexImage2D(GL_TEXTURE_2D, GL_RGBA8, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0); 
glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, pass1_tex[1]); 
glTexImage2D(GL_TEXTURE_2D, GL_DEPTH_COMPONENT, w, h, 0, GL_DEPTH_COMPONENT, 0); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL); 
glTexParameteri(GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY); 
glGenFramebuffers(1, pass1_fbo); 
glBindFramebuffer(GL_FRAMEBUFFER, pass1_fbo); 
glBindFramebuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMEMNT0, GL_TEXTURE_2D< pass1_tex[0], 0); 
glBindFramebuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMEMNT, GL_TEXTURE_2D< pass1_tex[0], 0); 

(pass0 FBO를 생성) 및 렌더링에 깊이 값을 얻을 수

Setup.1 코드 나는 다음과 같이했다 . 물론 모든 객체는 1.0에서 -1.0 거리 (NDC) 사이에 있으며, near 및 far 값은 gluPerspective()에서 1.0 및 2.0입니다.

FBO의 깊이 텍스처에서 적절한 깊이 값을 얻을 수없는 이유는 무엇입니까?

+3

음 모두를 위해, 당신은 코드를 게시 할 수있는 실제로 컴파일됩니까? 'glBindFramebuffer'는 프레임 버퍼를 컨텍스트에 바인드합니다; 두 개의 매개 변수 만 필요합니다. 또한, 그것이'glFramebufferTexture'라고 가정된다면, 색상과 깊이와 같은 텍스처를 넣을 것입니다, 나는 꽤 합법적이지 않습니다. 프레임 버퍼의 완성도를 확인하고 있습니까? 마지막으로'glGetTexImage' 호출을 시도 할 때 심도 텍스처를 절대 사용하지 마십시오 –

+0

심도 버퍼는 near 및 far 값에 관계없이 항상 [-1.0 .. 1.0]의 값 범위를가집니다 (적어도 < 멀리 그리고 양쪽은 합리적이다). 그것은 정상화가 여기에서하는 것입니다. – karx11erx

답변

1

in this article에 대한 답을 찾을 수 있습니다. GL_COMPARE_R_TO_TEXTURE를 사용할 때 깊이 텍스처를 샘플링하면 참조 텍스처 값 (보간 된 r 텍스처 좌표)에 대한 깊이 텍스처 값의 비교 결과가 반환됩니다. 당신이 원하는 것은 대신 다음과 같은 질감 매개 변수를 지정하는 것입니다 : 당신이 색상 질감을 사용

glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE); 
glTexParameteri (GL_TEXTURE_2D, GL_DEPTH_TEXTURE_MODE, GL_INTENSITY); 
+0

참고로, 기본 GL_DEPTH_TEXTURE_MODE는 주요 OpenGL 수정 버전 (2.x/3.x/4.x)과 변형 버전 (ES 2.x/3.x)간에 다른 것으로 보입니다. 데스크톱 OpenGL 3.x/4.x 및 OpenGL ES 3.x에서는 기본값이 GL_RED입니다. OpenGL ES 2.x의 경우 기본값은 GL_LUMINANCE입니다. 그래도 더 많은 헛소리가 계속되는 것 같습니다. http://lists.freedesktop.org/archives/mesa-dev/2013-January/033381.html 및 http://lists.freedesktop.org/archives/ mesa-dev/2012-November/030209.html – Aktau

1
glBindFramebuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMEMNT0, GL_TEXTURE_2D< pass1_tex[0], 0); 
glBindFramebuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMEMNT, GL_TEXTURE_2D< pass1_tex[0], 0); 

, pass1_tex [0] 색상과 깊이 버퍼

+1

나는 그의 코드를 너무 많이 읽지 않을 것입니다. 이 함수에 대한 인수의 수는 완전히 잘못되었으며 마지막 매개 변수는 템플릿 선언의 시작과 비슷하지만'GL_TEXTURE_2D'가 정의되고'> '가 없다는 사실을 감안할 때 단순히 상수'GL_TEXTURE_2D 'pass_tex [0]'의 값보다 크다. 아마도 의미없는 비교 일 것이다. :) –

관련 문제