2013-07-17 5 views
1

OpenGL ES 2.0, iOS 용 간단한 3D 응용 프로그램을 만들고 있습니다.Open GL ES 2.0의 깊이 버퍼에서 검정색 얻기

내가 원하는 것은 프래그먼트 셰이더의 깊이 버퍼에서 장면의 깊이 값을 가져오고 싶습니다.

따라서, I는 2D 텍스처

GLuint texture; 
glGenTextures(1, &texture); 
glBindTexture(GL_TEXTURE_2D, texture); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, size.x, size.y, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, NULL); 

self.Dimension = IVVec3I_Make(size.x, size.y, 0); 
self.BufferObjID = texture; 

으로 깊이 버퍼를 생성 및 깊이 첨부 프레임 버퍼에 부착.

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, pRD.BufferObjID,0); 

내 장면을 렌더링 할 때 깊이 버퍼가 올바르게 작동합니다 (깊이 테스트 및 깊이 쓰기 모두 완벽하게 작동 함).

그러나 쉐이더의 샘플러에 깊이 버퍼를 지정하고 전체 화면의 쿼드 플레인을 사용하여 화면에 깊이 버퍼를 렌더링하면 모두 검은 색입니다. 그리고 쉐이더 그 자체는 샘플러에 또 다른 일반 텍스처를 지정할 때 텍스처를 올바르게 렌더링하기 때문에 아무런 문제가 없습니다.

이것은 조각 셰이더입니다. I에서 OpenGL ES 프레임을 캡처하여 깊이 버퍼를 검사

uniform sampler2D DepthBuffer; 

void main() 
{ 
    highp vec2 tex_coord = vec2(gl_FragCoord.x/1024.0,gl_FragCoord.y/768.0); 

    tex_coord.y = 1.0-tex_coord.y; 

    gl_FragColor = texture2D(DepthBuffer, tex_coord); 
} 

는 디버거 (거의 모든 깊이 값이 1.0에 매우 근접하기 때문에 정확한) 모두 백인 깊이 버퍼를 나타낸다.

그래서 여기에 무슨 문제가있을 수 있습니까?

답변

0

그것은 당신의 응용 프로그램에서 설정의 더없이 말할 어렵지만, 여기에 몇 가지 추측은 다음과 같습니다

* 설정 GL_TEXTURE_COMPARE_MODE 매개 변수 GL_NONE로 깊이 텍스처가. 이것이 GL_COMPARE_R_TO_TEXTURE 인 경우 예상 한 결과를 얻지 못할 수 있습니다.

* 실제로는 단일 값이 저장되기 때문에 texture2D 조회에서 첫 번째 구성 요소 만 필요합니다. 당신은 당신의 파편 쉐이더에서 이것을 시도 할 수 있습니다 :

gl_FragColor = vec4(texture2D(DepthBuffer, tex_coord).rrr, 1.0); 

또한이 실험을 생각 하는데요.

* 수동으로 glReadPixels

* 색상 질감에 깊이 텍스처의 내용을 복사하고 (나는 glBlitFramebuffer을 권 해드립니다 렌더링하려고

를 통해, 텍스처의 내용을 검사하지만, ES에서 사용할 수 없습니다 2.0). glReadPixels과 glTexImage2D를 사용할 수 있습니다. 내가 똑같은 문제로 실행했습니다

+0

고마워. 하지만, 그들은 도움이되지 않았다 : (그리고 내 지식에 따라, glReadPixels는 ES 2의 Depth Attachment에 대해 작동하지 않습니다.0 –

+0

glReadPixels의 좋은 점. 아직 텍스처 데이터를 검사하는 데 궁금 할 것입니다. 렌더링하는 FB를 깊이 텍스처에 바인딩 한 다음 glCopyTexImage2D를 사용하여 더미 컬러 텍스처로 복사 할 수 있습니다. 그리고 그걸 읽을 수 있습니다! –

1

Sugu 리, 그것은 텍스처 필터링 문제라고 밝혀졌습니다. 아래와 같이 GL_NEAREST를 시도하십시오.

GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES30.GL_DEPTH_COMPONENT32F, texWidth, texHeight, 
    0, GLES20.GL_DEPTH_COMPONENT, GLES20.GL_FLOAT, null); 
GLES30.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES30.GL_TEXTURE_COMPARE_MODE, GLES20.GL_NONE); 
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST); 
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST); 

: 나는 GLES 3.0을 사용하고 있지만,이 수정은 또한 2.0와 함께 작동합니다. 기기 : HTC m8 t-mo Android 5.0 롤리팝

+1

렌더링 대상 텍스처에서 읽을 때 nvidia tegra 하드웨어에서 비슷한 문제가 발생했습니다. Tegra는 렌더링 대상 텍스처에 대한 주소 모드 제한이 있습니다. \t glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_2D, GL_TEXTURE_2, GL_CLAMP_TO_EDGE); \t glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 아마 같은 요구 사항은 깊이 버퍼 텍스처와 관련이 있습니다. – Dave

관련 문제