使用GLES 2着色器隐藏重叠像素

时间:2013-10-26 18:32:49

标签: opengl-es opengl-es-2.0 glsl

有没有办法在GLES 2中使用着色器隐藏重叠像素?我正在使用以下顶点和片段着色器。

顶点着色器:

attribute vec4 a_position;
attribute vec4 a_color;
attribute vec2 a_texCoord0;

uniform mat4 u_projTrans;
varying vec4 v_color;
varying vec2 v_texCoords;

void main (void)
{
    v_color     = a_color;
    v_texCoords = a_texCoord0;
    gl_Position = u_projTrans * a_position;
}

Fragment Shader:

#ifdef GL_ES
#define LOWP lowp
precision mediump float;
#else
#define LOWP 
#endif

varying vec2      v_texCoords;
uniform sampler2D u_texture;

void main (void)
{
    gl_FragColor = texture2D(u_texture, v_texCoords);
}

我希望能够做的是检查位置是否有填充像素。如果是,则跳过纹理的其他位置。有没有办法实现这个目标?

1 个答案:

答案 0 :(得分:0)

好的,我已经考虑过了,我想你可以使用Stencil一次性完成。 我自己从来没有这样做过,所以我不确定但是它可以工作。

您需要将模板操作设置为:

glStencilOp(GL_KEEP, GL_KEEP, GL_ZERO)

如果深度和模板测试已经过去,这将使模板测试为零像素中的模板值,并且如果没有做任何事情,则不执行任何操作。

模板功能:

glStencilFunc(GL_EQUAL, 1, 0xFFFFFFFF);

如果模板值为1,这将使模板测试通过。

在渲染网格/场景之前,需要清除模板缓冲区并将其所有像素设置为0x00000001的值。 这将导致每次渲染一个像素时,它将测试该像素中的模板值是否为1.如果它确实是1,它将渲染像素并将模板值归零。 下次尝试将像素绘制到同一个位置时,模板值将为0并且模板测试将失败,因此您的像素将不会被绘制。

这是我能想到的一种解决方法。

希望这会对你有所帮助。