2014-12-11 2 views
1

두 가지 작업에 스텐실 버퍼를 사용하고 있습니다. 첫 번째는 마스킹을 허용하는 것이고 두 번째는 마주 칠 수있는 객체의 마스크를 쓰는 것입니다. 이 특별한 경우 예약 된 비트는 0x80이며, 나머지는 정기적 인 마스킹을 위해 남아 있습니다.OpenGL : 특정 비트를 제외하고 스텐실 버퍼를 지우시겠습니까?

첫 번째 목적은 약 127 회 사용 후에 버퍼를 지우거나 테스트 할 때 이전의 스텐실이 다시 유효해야한다는 것입니다. 값을 1로 되돌려 야합니다. 두 번째 목적은 버퍼에 예약 된 비트가 필요하기 때문입니다 전체 프레임을 통해 살아 남기.

예약 된 비트를 유지하면서 스텐실 버퍼 전체를 지울 수있는 방법이 있습니까?

+0

내가 그 일반적인 상상 때문에 대신 컬러 청소를 사용하여이 문제를 검색하고, 내 대답을 발견; 'glClear()'는'glColorMask()'에주의 할 것이므로'glStencilMask()'에도 적용된다고 생각합니다. –

답변

1

의견에있는 귀하의 이론은 정확합니다. glClear()glClearBuffer()으로 작성된 값에 glStencilMask()이 적용됩니다.

섹션에서

는 OpenGL 4.5 사양에 "17.4.3 버퍼 제거"(강조 추가)

지우기가 호출되면 (가능한 경우)에 적용되는 단지 당 단편 작업 인 픽셀 소유권 테스트, 가위 테스트, sRGB 변환 (17.3.9 절 참조) 및 디더링. 17.4.2 절에서 설명한 마스킹 작업이 적용됩니다. 섹션 17.4.2 "이 버퍼 업데이트의 미세 조정"을 제목 및 glStencilMask()의 설명서가 포함되어

. glStencilMask() 좀더 일반적인 버전 glStencilMaskSeparate() 대해서는, 그것도 명시 말한다 전면 프리미티브에 의해 생성

단편 (섹션 17.3 참조이면 마스크를 사용하여 위로 향하는 프리미티브에 의해 생성 된 프론트 마스크 및 단편을 사용 .5). 지우기 버퍼는 스텐실 버퍼를 지울 때 항상 전면 스텐실 쓰기 마스크를 사용합니다.

그래서 스텐실 버퍼의 맨 아래 7 개 비트를 지우려면, 당신은 사용할 수 있습니다

glStencilMask(0x7f); 
glClear(GL_STENCIL_BUFFER_BIT); 
관련 문제