3

我在场景中有一个大精灵 - 例如 200x200,在应用程序中我有一个数组 [200] [200],我在其中为大精灵中的每个像素存储 0 或 1。

我想在现有的精灵之上再绘制一个纹理精灵(例如 10x10),但是我想为新精灵中的每个像素计算它是否需要在这个场景上绘制它取决于提供的数组(如果在像素的相应位置)数组中的新精灵是'1' - 我需要绘制这个像素,如果'0' - 我不想绘制它(可能设置 alpha = 0))。

我想我可以为每个新精灵使用片段着色器,但我不明白如何向着色器提供数组数据来计算每个像素的颜色。我认为也可以对整个场景使用片段着色器(如果渲染到纹理)。

我在opengl中很新,无法弄清楚以什么方式移动。

当我为场景创建资源时 - 我尝试创建我的面具:

    mask = new float[512*512*4];
    for (int i = 0; i < mask.length; i++)
    {
        mask[i] = 2f;
    }

    GLES20.glActiveTexture(GLES20.GL_TEXTURE1);
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 1029384756);
    GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 1, GLES20.GL_RGBA, 512, 512, 0, GLES20.GL_RGBA, GLES20.GL_FLOAT, FloatBuffer.wrap(mask));
    GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR);
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);

然后当我在场景上绘制新项目时,我使用着色器:

    setShaderProgram(ShaderProgram.getInstance());

    GLES20.glActiveTexture(GLES20.GL_TEXTURE1);
    GLES20.glUniform1i(RadialBlurExample.RadialBlurShaderProgram.sUniformMask, GLES20.GL_TEXTURE1);
    GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 1029384756);
    GLES20.glActiveTexture(GLES20.GL_TEXTURE0);

但我在现场看不到新项目(maskVal <0.5)。

我试图找到将数组作为纹理传递的工作方式,但我找不到它。

4

1 回答 1

3

将您的数组作为与精灵相同尺寸的第二个纹理上传,然后在绘制精灵时,以相同的 texcoord 对第二个纹理进行采样。

如果第二个纹理不符合遮罩标准,则丢弃该片段

uniform sampler2d sprite;
uniform sampler2d mask;
in vec2 uv;
main() {

   float maskVal = texture2D(mask, uv).r;
   if(maskVal > 0.5) {
        gl_FragColor = texture2D(sprite,uv);
   } else {
        discard;
   }
}
于 2012-08-09T16:12:11.127 回答