【问题标题】:Android OpenGL ES 1.1 white box texturesAndroid OpenGL ES 1.1 白盒纹理
【发布时间】:2011-04-17 03:57:42
【问题描述】:


我有一个问题,资源中的纹理变成白色。 这个问题似乎只发生在手机上(肯定是 Droid-X),但它在模拟器上运行得很好。 我已经研究了这个问题好几天,并尝试了很多东西。

纹理的 POT 范围从 8x8 到 128x128
纹理已在 res/drawable、res/drawable-nodpi 和 res/raw
在清单文件中尝试使用和不使用:

<supports-screens android:anyDensity="true" />


我对此完全不知所措。

这是我正在使用的代码
gl 是 GL10,gl11 是 GL11

During onSurfaceCreated
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glEnable(GL10.GL_BLEND);
gl.glDisable(GL10.GL_DEPTH_TEST);
gl.glDisable(GL10.GL_DITHER);
gl.glDisable(GL10.GL_LIGHTING);

gl.glShadeModel(GL10.GL_FLAT);
gl.glClearColor(0.00f, 0.00f, 0.00f, 1.00f);
gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_DST_ALPHA);
gl.glOrthof(-1, 1, -1, 1, -1, 1);
gl.glColor4f(0.5f, 0.5f, 0.5f, 0.5f);

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_NEAREST);

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_CLAMP_TO_EDGE);

gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_REPLACE);
gl.glFrontFace(GL10.GL_CCW);

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

在 onSurfaceChanged 期间

gl.glMatrixMode(GL10.GL_PROJECTION);
gl.glLoadIdentity();
gl.glMatrixMode(GL10.GL_MODELVIEW);
gl.glLoadIdentity();
gl.glViewport(0, 0, width, height);

生成 VBO:

public final float vertices[] = { 
    -1.0f, -1.0f, 1.0f,
    1.0f, -1.0f, 1.0f,
    -1.0f, 1.0f, 1.0f,
    1.0f, 1.0f, 1.0f
};
public float textureCoord[] = { 
    0.0f, 0.0f,
    0.0f, 1.0f,
    1.0f, 0.0f,
    1.0f, 1.0f
};
public final byte indices[] = { 
    0, 1, 3,
    0, 3, 2 
};
verticesBuffer = ByteBuffer.allocateDirect(vertices.length * 
    Constants.FLOAT_SIZE).order(ByteOrder.nativeOrder()).asFloatBuffer();
textureCoordBuffer = ByteBuffer.allocateDirect(textureCoord.length * 
    Constants.FLOAT_SIZE).order(ByteOrder.nativeOrder()).asFloatBuffer();
indicesBuffer = ByteBuffer.allocateDirect(indices.length).order(ByteOrder.nativeOrder());

// fill buffers
verticesBuffer.put(vertices);
textureCoordBuffer.put(textureCoord);
indicesBuffer.put(indices);

// set pointer positions
verticesBuffer.position(0);
textureCoordBuffer.position(0);
indicesBuffer.position(0);

// temp buffer array
int[] buffer = new int[1];

// VERTICES BUFFER.
gl11.glGenBuffers(1, buffer, 0);
verticesBufferIndex = buffer[0];
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, verticesBufferIndex);
final int vertexSize = verticesBuffer.capacity() * Constants.FLOAT_SIZE;
gl11.glBufferData(GL11.GL_ARRAY_BUFFER, vertexSize, verticesBuffer, GL11.GL_STATIC_DRAW);

// TEXTURE COORD BUUFER
gl11.glGenBuffers(1, buffer, 0);
textureCoordBufferIndex = buffer[0];
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, textureCoordBufferIndex);
final int texCoordSize = textureCoordBuffer.capacity() * Constants.FLOAT_SIZE;
gl11.glBufferData(GL11.GL_ARRAY_BUFFER, texCoordSize, textureCoordBuffer, GL11.GL_STATIC_DRAW);

// clear buffer id
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, 0);

// Unbind the array buffer.
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, 0);
gl11.glGenBuffers(1, buffer, 0);

// INDICES BUFFER
indicesBufferIndex = buffer[0];
gl11.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, indicesBufferIndex);
final int indexSize = indicesBuffer.capacity();
gl11.glBufferData(GL11.GL_ELEMENT_ARRAY_BUFFER, indexSize, indicesBuffer, GL11.GL_STATIC_DRAW);

// Unbind the element array buffer.
gl11.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, 0);

gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, verticesBufferIndex);
gl11.glVertexPointer(3, GL11.GL_FLOAT, 0, 0);
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, textureCoordBufferIndex);
gl11.glTexCoordPointer(2, GL11.GL_FLOAT, 0, 0);
gl11.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, indicesBufferIndex);

BitmapFactory.Options sBitmapOptions = new BitmapFactory.Options();
sBitmapOptions.inPreferredConfig = Bitmap.Config.ARGB_4444;

// many of these calls :
Bitmap bitmap = BitmapFactory.decodeStream(resources.openRawResource(resourceID), null, sBitmapOptions);
int[] textures = new int[1];
gl.glGenTextures(1, textures, 0);
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
mCropWorkspace[0] = 0;
mCropWorkspace[1] = bitmap.getHeight();
mCropWorkspace[2] = bitmap.getWidth();
mCropWorkspace[3] = -bitmap.getHeight();
((GL11) gl).glTexParameteriv(GL10.GL_TEXTURE_2D, 
GL11Ext.GL_TEXTURE_CROP_RECT_OES, mCropWorkspace, 0);
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
bitmap.recycle();
return texture[0]; // which gets stored into textureID for later

onDrawFrame 期间

gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

// and many of these
gl11.glPushMatrix();
// transfomations
gl11.glBindTexture(GL11.GL_TEXTURE_2D, textureID);
gl11.glDrawElements(GL10.GL_TRIANGLES, indicesCount, GL10.GL_UNSIGNED_BYTE, 0);
gl11.glPopMatrix();


对不起所有的代码,但我认为一切都在那里。
谢谢,

【问题讨论】:

    标签: android opengl-es textures


    【解决方案1】:

    在调用glDraw...() 函数之前,您必须启用顶点数组和纹理坐标数组并绑定缓冲区索引。

    onDrawFrame() 中的glBindTexture() 之后,输入:

    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    
    GL11 gl11 = (GL11) gl;
    
    gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, verticesBufferIndex);
    gl11.glVertexPointer(3, GL11.GL_FLOAT, 0, 0);
    
    gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, textureCoordBufferIndex);
    gl11.glTexCoordPointer(2, GL11.GL_FLOAT, 0, 0); 
    gl11.glBindBuffer(GL11.GL_ELEMENT_ARRAY_BUFFER, indicesBufferIndex);
    
    // Draw...
    

    【讨论】:

    • 我在 onSurfaceCreated 里面有它,因为它永远不会改变,我把它放在 onDrawFrame 的开头,然后为每个项目绑定正确的纹理索引,如上所示。由于纹理坐标、顶点和索引永远不会改变,它应该只需要绑定一次对吗?该程序在模拟器(1.6 和 2.2)上运行良好,没有产生 opengl 错误。
    • @Will McG:嗯,在某些情况下你会在onDrawFrame() 中获得一个新的不同的GL 上下文,因此你必须重新绑定它。
    • Lanner:不走运,我告诉它在每一帧上生成硬件缓冲区,而不仅仅是绑定旧缓冲区。我的兄弟正在他的 Evo4G 上试用它,他得到一个完全黑屏,而我得到的是白框。不确定这是否是同一个问题,但它是新信息。
    • 不知何故我已经解决了这个问题。我主要是删除了大部分,更准确地基于SpriteMethodText和ReplicaIslasnd。我认为我的问题可能是在使用 GLUtils.texImage2D 加载位图期间。在其他一些站点上,有人提到 gl.glTexParameterf 并不总是保持其状态,并且必须在每次调用 GLUtils.texImage2D 之前调用。就像我说的,我认为这可能是问题所在,因为我认为我没有改变其他任何东西。
    • 我遇到了同样的问题,检查了纹理大小并将我的代码缩减为裸露的骨头......就像你说的,我必须在调用 GLUtils.texImage2D 之前调用 glTexParameterf。通过更改它立即修复它。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2015-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多