如何写一个唯一的alpha> 0到模板缓冲区?

时间:2016-09-21 16:59:12

标签: opengl-es opengl-es-2.0 opentk opengl-es-3.0

我正在尝试将纹理渲染到模板缓冲区。我只需要其alpha值为>的像素。 0,但我的代码渲染我的四边形的每个像素 - 甚至是0 alpha的像素。我怎么能避免这个?

继承我的代码:

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

1 个答案:

答案 0 :(得分: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;
}