OpenGL ES Textures在HTC Magic(1.6)上无法正常显示,但在Emulator和Mytouch 4g上显示正常

时间:2011-04-27 03:52:46

标签: android opengl-es textures

用于多维数据集的纹理正用于视图中的其他对象,即使它们未被分配。这只发生在运行1.6的HTC Magic上。我使用标准的位图库从资源加载纹理图像。这应该不是问题,因为它正确地将纹理应用于预期的模型。

我尝试在使用后删除了纹理,但纹理完全擦除,立方体似乎永远不会显示它。

我回收了大量来自网络教程的代码。 代码:

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.Draw功能:

     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 && 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 && 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 个答案:

答案 0 :(得分:1)

您似乎没有禁用纹理,也没有取消TEXTURE_2D目标的绑定。如果您的其他立方体没有纹理,则将使用上一个绘制操作留下的相同纹理绘制它们。如果对象没有分配纹理,则应禁用纹理:

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