【问题标题】:Using GLES 2 shader to hide overlapping pixels使用 GLES 2 着色器隐藏重叠像素
【发布时间】:2013-11-05 18:48:30
【问题描述】:

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

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

【问题讨论】:

  • 您是否考虑过为此目的使用深度测试? :) 这就是它的设计目的。
  • 不,我一般是着色器新手。我会阅读它,看看它是关于什么的。谢谢!

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


【解决方案1】:

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

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

glStencilOp(GL_KEEP, GL_KEEP, GL_ZERO)

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

模具功能:

glStencilFunc(GL_EQUAL, 1, 0xFFFFFFFF);

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

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

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

希望对你有所帮助。

【讨论】:

    猜你喜欢
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    相关资源
    最近更新 更多