Сжатые текстуры в Android становятся белыми - PullRequest
2 голосов
/ 19 июня 2011

Я новичок в разработке как для Android, так и для OpenGL. Я пытаюсь сделать просто куб с текстурой, но мне нужно сжать эту текстуру в сжатии ETC1, я делаю код, подобный тому, который я нашел на сайте develop.android, нокод запускается только на эмуляторе!

я тестирую на двух устройствах

1) Nexus mobile, в этом устройстве куб не появился, я ищу в интернете, обнаружил, что оригинальный Androidэто устройство было 2.1, и оно было обновлено до 2.3, это причина, чтобы сделать устройство может рисовать детеныш?

2) Motorola Xoom Tablet, это устройство Android 3.1, куб появился здесь, но сбелый цвет, не несжатая текстура, поддерживается CTE1 и нет ошибки OPENGL!

сжатая текстура PNG 265 * 265 / и я поместил сжатую текстуру в папку raw

код похож на следующий

public class TextureCube {
private String TAG;
private Context context;
private FloatBuffer vertexBuffer; // Buffer for vertex-array
private FloatBuffer texBuffer; // Buffer for texture-coords-array

private float[] vertices = { // Vertices for a face
-1.0f, -1.0f, 0.0f, // 0. left-bottom-front
        1.0f, -1.0f, 0.0f, // 1. right-bottom-front
        -1.0f, 1.0f, 0.0f, // 2. left-top-front
        1.0f, 1.0f, 0.0f // 3. right-top-front
};
float[] texCoords = { // Texture coords for the above face
0.0f, 1.0f, // A. left-bottom
        1.0f, 1.0f, // B. right-bottom
        0.0f, 0.0f, // C. left-top
        1.0f, 0.0f // D. right-top
};
int[] textureIDs = new int[1]; // Array for 1 texture-ID

// Constructor - Set up the buffers
public TextureCube(Context context) {
    this.context = context;
    TAG = "Sam Messages: " + this.getClass().getName();
    // Setup vertex-array buffer. Vertices in float. An float has 4 bytes
    ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4);
    vbb.order(ByteOrder.nativeOrder()); // Use native byte order
    vertexBuffer = vbb.asFloatBuffer(); // Convert from byte to float
    vertexBuffer.put(vertices); // Copy data into buffer
    vertexBuffer.position(0); // Rewind

    // Setup texture-coords-array buffer, in float. An float has 4 bytes
    ByteBuffer tbb = ByteBuffer.allocateDirect(texCoords.length * 4);
    tbb.order(ByteOrder.nativeOrder());
    texBuffer = tbb.asFloatBuffer();
    texBuffer.put(texCoords);
    texBuffer.position(0);
}

// Draw the shape
public void draw(GL10 gl) {


    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

    gl.glFrontFace(GL10.GL_CCW); // Front face in counter-clockwise orientation
    gl.glEnable(GL10.GL_CULL_FACE); // Enable cull face
    gl.glCullFace(GL10.GL_BACK); // Cull the back face (don't display)

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY); // Enable texture-coords-array
    gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, texBuffer); // Define texture-coords buffer

    // front
    gl.glPushMatrix();
    gl.glTranslatef(0.0f, 0.0f, 1.0f);
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
    gl.glPopMatrix();

    // left
    gl.glPushMatrix();
    gl.glRotatef(270.0f, 0.0f, 1.0f, 0.0f);
    gl.glTranslatef(0.0f, 0.0f, 1.0f);
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
    gl.glPopMatrix();

    // back
    gl.glPushMatrix();
    gl.glRotatef(180.0f, 0.0f, 1.0f, 0.0f);
    gl.glTranslatef(0.0f, 0.0f, 1.0f);
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
    gl.glPopMatrix();

    // right
    gl.glPushMatrix();
    gl.glRotatef(90.0f, 0.0f, 1.0f, 0.0f);
    gl.glTranslatef(0.0f, 0.0f, 1.0f);
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
    gl.glPopMatrix();

    // top
    gl.glPushMatrix();
    gl.glRotatef(270.0f, 1.0f, 0.0f, 0.0f);
    gl.glTranslatef(0.0f, 0.0f, 1.0f);
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
    gl.glPopMatrix();

    // bottom
    gl.glPushMatrix();
    gl.glRotatef(90.0f, 1.0f, 0.0f, 0.0f);
    gl.glTranslatef(0.0f, 0.0f, 1.0f);
    gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
    gl.glPopMatrix();

    gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);   // Disable
                                                            // texture-coords-array
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glDisable(GL10.GL_CULL_FACE);
}

// Load an image into GL texture
public void loadTexture(GL10 gl) {

    Boolean loadCompressed = true;
    if (loadCompressed) {
        /****************************************************/
        /** LOAD A COMPRESSED TEXTURE IMAGE */
        /***********************************/
        Log.w(TAG, ": ETC1 texture support: " + ETC1Util.isETC1Supported());
        try {
              ETC1Util.loadTexture(GLES20 .GL_TEXTURE_2D, 0, 0,
                      GLES20.GL_RGB, GLES20.GL_UNSIGNED_SHORT_5_6_5,
                      context.getResources().openRawResource(R.raw.pic3));

            Log.w(TAG, ": OpenGL Error -After LoadTexture()-:" + gl.glGetError());
            Log.w(TAG,"OpenGL Extensions: " + gl.glGetString(GL10.GL_EXTENSIONS));
        } catch (IOException e) {
            Log.w(TAG, ": Could not load texture: " + e);
        } finally {

                Log.w(TAG, ": OpenGL Error -In Final()-:" + gl.glGetError());
        }
    } else {
        /*****************************************************/
        /** LOAD A TEXTURE IMAGE */
        /************************/

        gl.glGenTextures(1, textureIDs, 0); // Generate texture-ID array
        gl.glBindTexture(GL10.GL_TEXTURE_2D, textureIDs[0]); // Bind to texture ID Set up texture filters
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,GL10.GL_NEAREST);
        gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,GL10.GL_LINEAR);
        InputStream istream = context.getResources().openRawResource(R.drawable.pic5);
        Bitmap bitmap;
        try {
            bitmap = BitmapFactory.decodeStream(istream);
        } finally {
            try {
                istream.close();
            } catch (IOException e) {
            }
        }
        // Build Texture from loaded bitmap for the currently-bind texture
        // ID
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
        bitmap.recycle();
        /******************************************************/
    }
}

1 Ответ

2 голосов
/ 19 июня 2011

Не удается установить имя текстуры для загрузки сжатой текстуры, два вызова функций

gl.glGenTextures(1, textureIDs, 0); // Generate texture-ID array
gl.glBindTexture(GL10.GL_TEXTURE_2D, textureIDs[0]); // Bind to texture

сделайте это, поэтому поместите их в начало функции.

«Белая» текстура обычно указывает на то, что текстура является неполной. Обычно это происходит, если вы включили mipmapping, но не указали все необходимые уровни mipmap. В приведенном выше коде вы отключите мипмапинг для несжатых текстур:

gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,GL10.GL_LINEAR);

но оставьте вещи как есть для сжатия - попробуйте, что произойдет, если вы поместите эти два вызова после генерации имени, то есть также до if(compressed):

public void loadTexture(GL10 gl) {

    gl.glGenTextures(1, textureIDs, 0);
    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureIDs[0]);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,GL10.GL_NEAREST);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,GL10.GL_LINEAR);

    Boolean loadCompressed = true;
    if (loadCompressed) {
        /****************************************************/
        /** LOAD A COMPRESSED TEXTURE IMAGE */
        /***********************************/
        Log.w(TAG, ": ETC1 texture support: " + ETC1Util.isETC1Supported());
        try {
              ETC1Util.loadTexture(GLES20 .GL_TEXTURE_2D, 0, 0,
                      GLES20.GL_RGB, GLES20.GL_UNSIGNED_SHORT_5_6_5,
                      context.getResources().openRawResource(R.raw.pic3));

            Log.w(TAG, ": OpenGL Error -After LoadTexture()-:" + gl.glGetError());
            Log.w(TAG,"OpenGL Extensions: " + gl.glGetString(GL10.GL_EXTENSIONS));
        } catch (IOException e) {
            Log.w(TAG, ": Could not load texture: " + e);
        } finally {

                Log.w(TAG, ": OpenGL Error -In Final()-:" + gl.glGetError());
        }
    } else {
        /*****************************************************/
        /** LOAD A TEXTURE IMAGE */
        /************************/
        InputStream istream = context.getResources().openRawResource(R.drawable.pic5);
        Bitmap bitmap;
        try {
            bitmap = BitmapFactory.decodeStream(istream);
        } finally {
            try {
                istream.close();
            } catch (IOException e) {
            }
        }
        // Build Texture from loaded bitmap for the currently-bind texture
        // ID
        GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
        bitmap.recycle();
        /******************************************************/
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...