如何将仅alpha> 0写入模板缓冲区?

问题描述:

我正在尝试将纹理渲染到模板缓冲区。我只需要alpha值大于0的像素,但是我的代码渲染了我的四边形的每个像素 - 即使是0 alpha的像素。我怎样才能避免这种情况?如何将仅alpha> 0写入模板缓冲区?

继承人我的代码:

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); 

当RenderDoc我看到模板缓冲区包含1S在我的质地是调试...但它是一个矩形,它没有考虑阿尔法考虑。

我的继承人片段着色器(它工作正常,正常渲染):

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

使用“放弃”语句在着色器砸你不希望保留的片段。

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