如何将仅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;
}
谢谢!这是GL ES中的唯一解决方案吗(我也可以使用3.0)?我的问题是iOS上放弃速度很慢.. – sydd
不改变几何图形,是的。一般而言,透明精灵的“最佳”修正是使用合适的几何图形,将完全不透明的部分隔离起来,然后剔除透明部分,这样就不会渲染大部分没有任何用处的像素。 类似这样的:https://community.arm.com/groups/arm-mali-graphics/blog/2015/11/19/mali-performance-7-accelerating-2d-rendering-using-opengl-es – solidpixel