2016-09-21 8 views
0

스텐실 버퍼에 텍스처를 렌더링하려고합니다. 나는 알파가 0보다 큰 픽셀 만 필요하지만, 내 코드는 내 쿼드의 모든 픽셀을 렌더링합니다. 심지어 알파가 0 인 픽셀도 있습니다. 어떻게 이것을 피할 수 있습니까?스텐실 버퍼에 알파> 0 만 쓰는 방법은 무엇입니까?

Heres는 내 코드 :

GL.StencilOp(StencilOp.Keep, StencilOp.Keep, StencilOp.Incr); 
GL.ColorMask(false, false, false, false); 
GL.DepthMask(false); 

RenderMask(mask); 

GL.StencilFunc(StencilFunction.Equal, 1, 0xFF); 

GL.StencilOp(StencilOp.Keep, StencilOp.Keep, StencilOp.Keep); 
GL.ColorMask(true, true, true, true); 
GL.DepthMask(true); 

내 질감이 어디 스텐실 버퍼가 1 초 포함되어 있음을 볼 수 RenderDoc과 디버깅 ...하지만 그 사각형,이 계정에 알파를하지 않습니다.

Heres는 내 조각 쉐이더 (정상 렌더링 잘 작동) :

varying lowp vec4 vColor; 
varying lowp vec2 vTexCoords; 
uniform lowp sampler2D uTexture; 
void main() { 
    gl_FragColor = texture2D(uTexture, vTexCoords) * vColor; 
} 

답변

2

는 유지하지 않을 조각을 드롭 쉐이더에서 "폐기"문을 사용합니다.

varying lowp vec4 vColor; 
varying lowp vec2 vTexCoords; 
uniform lowp sampler2D uTexture; 
void main() { 
    vec4 color = texture2D(uTexture, vTexCoords) * vColor; 
    if (color.a == 0.0) { 
    discard; 
    } 
    gl_FragColor = color; 
} 
+0

고마워요! 이것이 GL ES의 유일한 해결책입니까 (3.0도 사용할 수 있습니까?). 내 문제는 iOS에서 폐기가 느리다는 것입니다. – sydd

+1

지오메트리를 변경하지 않고 예. 일반적으로 투명한 스프라이트에 대한 "최상의"픽스는 완전히 불투명 한 부분을 분리하고 투명한 부분을 잘라내는 잘 맞는 기하학을 사용하여 유용하지 않은 픽셀의 비율을 높게 렌더링하지 않는 것입니다. 다음과 같이 입력하십시오 : https://community.arm.com/groups/arm-mali-graphics/blog/2015/11/19/mali-performance-7-accelerating-2d-rendering-using-opengl-es – solidpixel