Opengl es 如何只编写alpha>;0到模具缓冲区?

Opengl es 如何只编写alpha>;0到模具缓冲区?,opengl-es,opengl-es-2.0,opentk,opengl-es-3.0,Opengl Es,Opengl Es 2.0,Opentk,Opengl Es 3.0,我正在尝试向模具缓冲区渲染纹理。我只需要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(Ste

我正在尝试向模具缓冲区渲染纹理。我只需要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调试时,我看到模具缓冲区包含1,其中我的纹理是。。。但它是一个矩形,它不考虑alpha

这是我的片段着色器(它可以正常渲染):

在着色器中使用“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;
}
在着色器中使用“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;
}

谢谢这是GL ES中唯一的解决方案吗(我也可以使用3.0)?我的问题是,在iOS上丢弃速度很慢。不改变几何体,是的。一般来说,透明精灵的“最佳”修复方法是使用拟合良好的几何体来隔离完全不透明的部分,并剔除透明部分,因此渲染的像素百分比不高,没有任何用处。像这样的话:谢谢!这是GL ES中唯一的解决方案吗(我也可以使用3.0)?我的问题是,在iOS上丢弃速度很慢。不改变几何体,是的。一般来说,透明精灵的“最佳”修复方法是使用拟合良好的几何体来隔离完全不透明的部分,并剔除透明部分,因此渲染的像素百分比不高,没有任何用处。大概是这样的: