3

CompressedTextureActivity の例があることは知っており、それに基づいてコードを作成しましたが、これを機能させることはできません。ここで助けが必要です:

public static int loadCompressedTexture(final Context context, final int resourceId){
        final int[] textureHandle = new int[1];
        GLES20.glGenTextures(1, textureHandle, 0);

        if (textureHandle[0] != 0){
            InputStream input = context.getResources().openRawResource(resourceId);

            GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandle[0]);

            GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
            GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);

            try{
                ETC1Util.loadTexture(GLES20.GL_TEXTURE_2D, 0, 0,GLES20.GL_RGB, GLES20.GL_UNSIGNED_SHORT_5_6_5, input);
            }
            catch(IOException e){
                System.out.println("DEBUG! IOException"+e.getMessage());
            }
            finally{
                try {
                    input.close();
                } catch (IOException e) {
                    // ignore exception thrown from close.
                }
            }       
            //GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D);

            checkGlError("");
        }
        else
            throw new RuntimeException("Error loading texture.");

        return textureHandle[0];
    }

loadTexture が IOException をスローしており、結果は黒くなっています...


更新: ヘッダーのない pkm ファイルがありました。何らかの理由で、それらをそのようにエンコードする必要があると考えましたが、ヘッダーでエンコードしたため、IOException エラーは発生しなくなりました。ちなみに、私はetc1toolを使用しており、ソースのpngファイルは2048x2048です。

しかし、どんどん黒くなっていく…

ちなみに、これは正常に表示される通常のテクスチャをロードするために使用するコードです。

public static int loadTexture(final Context context, final int resourceId)
{
    final int[] textureHandle = new int[1];

    GLES20.glGenTextures(1, textureHandle, 0);

    if (textureHandle[0] != 0)
    {
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inScaled = false;   // No pre-scaling
        final Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(), resourceId, options);

        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandle[0]);

        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR_MIPMAP_NEAREST);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);

        GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);

        GLES20.glGenerateMipmap(GLES20.GL_TEXTURE_2D);

        logHeap();

        bitmap.recycle();                       
    }

    if (textureHandle[0] == 0)
    {
        throw new RuntimeException("Error loading texture.");
    }

    return textureHandle[0];
}
4

1 に答える 1

0

次のようにミップマップを設定したと思っても:

GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);

そして、ミップマップを生成していませんでした.これらの2行のコードは、神が知っている理由で、私のオブジェクトの描画メソッドにありました.

GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER,  GLES20.GL_LINEAR_MIPMAP_LINEAR);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER,  GLES20.GL_LINEAR);

それらを取り除くことで問題は解決しました!

于 2012-10-01T01:51:29.010 に答える