代码之家  ›  专栏  ›  技术社区  ›  dilix

Andengine为精灵中的每个像素设置alpha

  •  3
  • dilix  · 技术社区  · 13 年前

    我在场景中有一个大精灵,例如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)。

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

    1 回复  |  直到 13 年前
        1
  •  3
  •   Tim seongjoo    13 年前

    将数组上载为与精灵具有相同维度的第二个纹理,然后在绘制精灵时,在同一纹理坐标处对第二个贴图进行采样。

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

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