Текстуры OpenGL ES не отображаются должным образом на HTC Magic (1.6), но нормально отображаются на эмуляторе и Mytouch 4g

#android #opengl-es #textures

#Android #opengl-es #Текстуры

Вопрос:

Текстура, используемая для куба, используется для других объектов в представлении, даже если им она не назначена. Это происходит только на моем HTC Magic под управлением 1.6. Я загружаю изображение текстуры из ресурсов, используя стандартные библиотеки растровых изображений. Однако это не должно быть проблемой, поскольку он правильно применяет текстуры к предполагаемым моделям.

Я попытался удалить текстуру после ее использования, однако текстура полностью стерта, и кубы, похоже, никогда ее не отображают.

Я переработал много кода, взятого из руководств по сети. Код:

 public void onDrawFrame(GL10 gl) {
    gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
    gl.glMatrixMode(GL10.GL_MODELVIEW);
    gl.glLoadIdentity();
    gl.glRotatef(sceneroty, 0, 1, 0);
    gl.glTranslatef(xtrans, 0, ztrans);
    root.draw(gl);
  

Root.Функция рисования:

      gl.glPushMatrix();
 gl.glFrontFace(GL10.GL_CCW);
 gl.glEnable(GL10.GL_CULL_FACE);
 gl.glCullFace(GL10.GL_BACK);
     gl.glVertexPointer(3, GL10.GL_FLOAT, 0, verticesBuffer);
     gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
     gl.glColor4f(rgba[0], rgba[1], rgba[2], rgba[3]);
     // Smooth color
     if (colorBuffer != null) {
             // Enable the color array buffer to be used during rendering.
            gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
            gl.glColorPointer(4, GL10.GL_FLOAT, 0, colorBuffer);
     }

     // New part...
     if (mShouldLoadTexture) {
             loadGLTexture(gl);mShouldLoadTexture = false;
     }

     if (mTextureId != -1 amp;amp; mTextureBuffer != null) {
             gl.glEnable(GL10.GL_TEXTURE_2D);
             // Enable the texture state
             gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);

             // Point to our buffers
             gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, mTextureBuffer);
             gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureId);
     }

     // ... end new part.

     gl.glTranslatef(x, y, z);
     gl.glRotatef(rx, 1, 0, 0);
     gl.glRotatef(ry, 0, 1, 0);
     gl.glRotatef(rz, 0, 0, 1);

     // Point out the where the color buffer is.
     gl.glDrawElements(GL10.GL_TRIANGLES, numOfIndices,
                     GL10.GL_UNSIGNED_SHORT, indicesBuffer);

     // Disable the vertices buffer.

     gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
     // New part...
     if (mTextureId != -1 amp;amp; mTextureBuffer != null) {
             gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
     }
     // ... end new part.

     // Disable face culling.
     gl.glDisable(GL10.GL_CULL_FACE);
     gl.glPopMatrix();
  

Другие используемые функции:

 protected void setTextureCoordinates(float[] textureCoords) {
    // float is 4 bytes, therefore we multiply the number if
        // vertices with 4.
    ByteBuffer byteBuf = ByteBuffer.allocateDirect(
                                           textureCoords.length * 4);
    byteBuf.order(ByteOrder.nativeOrder());
    mTextureBuffer = byteBuf.asFloatBuffer();
    mTextureBuffer.put(textureCoords);
    mTextureBuffer.position(0);
}

public void loadBitmap(Bitmap bitmap) {
    this.mBitmap = bitmap;
    mShouldLoadTexture = true;
}

private void loadGLTexture(GL10 gl) {
    // Generate one texture pointer...

    gl.glGenTextures(1, textures, 0);

    mTextureId = textures[0];

    // ...and bind it to our array
    gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureId);

    // Create Nearest Filtered Texture
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,
            GL10.GL_LINEAR);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER,
            GL10.GL_LINEAR);

    // Different possible texture parameters, e.g. GL10.GL_CLAMP_TO_EDGE
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,
            GL10.GL_CLAMP_TO_EDGE);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,
            GL10.GL_REPEAT);

    // Use the Android GLUtils to specify a two-dimensional texture image
    // from our bitmap
    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, mBitmap, 0);

}
  

Ответ №1:

Похоже, вы не отключаете текстурирование и не отсоединяете TEXTURE_2D цель. Если другие ваши кубы не имеют текстуры, они будут нарисованы с использованием той же текстуры, оставшейся от предыдущей операции рисования. Вам следует отключить текстурирование, если объекту не назначена текстура:

 if (mTextureId == -1) {
         gl.glDisable(GL10.GL_TEXTURE_2D);
         gl.glBindTexture(GL10.GL_TEXTURE_2D, 0);
 }
  

Комментарии:

1. Большое вам спасибо. Сработало очень хорошо. Я неправильно отключил текстуры, поэтому, естественно, предположил, что проблема не в этом. Еще раз спасибо.