0

有没有办法在 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;
}

片段着色器:

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

我想做的是检查该位置是否有填充像素。如果确实如此,则跳过从纹理中绘制的位置。有没有办法做到这一点?

4

1 回答 1

0

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

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

glStencilOp(GL_KEEP, GL_KEEP, GL_ZERO)

如果深度和模板测试通过,这将使模板测试以像素为单位的模板值归零,如果没有通过,则不执行任何操作。

模板的功能是:

glStencilFunc(GL_EQUAL, 1, 0xFFFFFFFF);

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

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

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

希望这对您有所帮助。

于 2015-07-27T17:34:34.633 回答