3

シーンに1つの大きなスプライトがあります。たとえば200x200で、アプリには配列[200] [200]があり、大きなスプライトのピクセルごとに0または1を格納します。

既存のスプライトの上にもう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

Upload your array as a second texture with the same dimensions as the sprite, and then when you draw the sprite, sample the second texture at the same texcoord.

If the second texture doesn't meet the mask criteria, discard the fragment

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 に答える