如何将唯一的 alpha > 0 写入模板缓冲区?

How to write a only alpha > 0 to the stencil buffer?

我正在尝试将纹理渲染到模板缓冲区。我只需要 alpha > 0 的像素,但我的代码正在渲染四边形的每个像素——即使是 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...但它是一个矩形,它没有考虑 alpha。

这是我的片段着色器(它适用于正常渲染):

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

在着色器中使用 "discard" 语句删除您不想保留的片段。

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