2017-04-19 9 views
0

스텐실 마스크를 사용하여 텍스처에 깊이를 렌더링하려는 응용 프로그램이 있습니다.스텐실, OpenGL ES 3.0에서 깊이 텍스처 사용 방법

만들기 질감 : 나는 GL_DEPTH_STENCIL_OES을 시도 코드가

glBindFramebuffer(GL_FRAMEBUFFER, *fbo); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

glEnable(GL_STENCIL_TEST); 
glStencilFunc(GL_EQUAL, 1, 0xFF); // Pass test if stencil value is 1 
glStencilMask(0x00); // Don't write anything to stencil buffer 
glDepthMask(GL_TRUE); // Write to depth buffer 

drawObjects(); 

입니다 : 스텐실 마스크 깊이

// bind to depth fbo 
glBindFramebuffer(GL_FRAMEBUFFER, *fbo); 

glEnable(GL_STENCIL_TEST); 
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); 
glClear(GL_STENCIL_BUFFER_BIT); 

// write to stencil when objects are rendered 
glStencilFunc(GL_ALWAYS, 1, 0xFF); 
glStencilMask(0xFF); 

drawVisibleObjects(); 

렌더링 : 그림자 맵에 대한 스텐실 마스크 만들기

glGenFramebuffers(1, fbo); 
glBindFramebuffer(GL_FRAMEBUFFER, *fbo); 

glGenTextures(1, depthTexture); 
glBindTexture(GL_TEXTURE_2D, *depthTexture); 
// using combined format: depth + stencil 
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_STENCIL_OES, w, h, 0, GL_DEPTH_STENCIL_OES, GL_UNSIGNED_INT_24_8_OES, NULL); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE); 

// attaching both depth and stencil 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, *depthTexture, 0); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_STENCIL_ATTACHMENT, GL_TEXTURE_2D, *depthTexture, 0); 

// No color output in the bound framebuffer, only depth. 
GLenum drawbuffers[] = { GL_NONE }; 
glDrawBuffers(1, drawbuffers); 

GL_CHECK(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE); 

실행되면 화면이 검게됩니다. 이것은 기본 프레임 버퍼에 깊이를 렌더링하지 않기 때문에 예기치 않게 발생하지만 텍스처에 적용됩니다. 스텐실 값은 텍스처에 저장되므로 다르게 사용해야합니까?

GL_DEPTH_STENCIL_OES가 사용 된 스텐실 텍스처를 결합 할 때 스텐실 첨부 파일을 사용하는 올바른 방법은 무엇입니까?

답변

0

스텐실 값은 렌더링 할 프레임 버퍼의 속성입니다. FBO0에서 스텐실 마스크를 사용하려면 FBO0에서 스텐실을 요청해야합니다 (그리고 FBO0으로 렌더링하는 동안 마스크 등을 채울 필요가 있습니다).