GLSurfaceView在Android 4.2的Nexus 7上显示为黑屏

6
我有一个使用OpenGL ES2.0的应用,在Android各个版本中运行正常,从2.2到4.1。然而,我被告知在运行Android 4.2的Nexus 7上,应用程序中的3D图形全部是黑色的。但ActionBar和对话框正常工作。我已经在模拟的带有Intel Atom处理器、启用HAX和GPU的Nexus 7上尝试了4.2.2版本,并且可以正常运行。虽然我更喜欢运行ARM映像,但似乎那个版本不包含Open GL ES2.0。
有没有人了解什么可能导致Nexus 7上的问题,以及如何解决呢?
一个可能性是当前应用程序版本的目标API级别设置为15,而4.2.2是级别17。这可能是个问题吗?但在模拟器上它能正常工作。
以下是我在onSurfaceCreated()中用于设置渲染器纹理的代码,希望能提供一些帮助。
/**
 * Sets up texturing for the object
 */
private void setupTextures(String[] texFiles) {
    // create new texture ids if object has them
    // number of textures
    mTextureIDs = new int[texFiles.length];

    GLES20.glGenTextures(texFiles.length, mTextureIDs, 0);

    for(int i = 0; i < texFiles.length; i++) {
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextureIDs[i]);

        // parameters
        GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER,
                GLES20.GL_NEAREST);
        GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D,
                GLES20.GL_TEXTURE_MAG_FILTER,
                GLES20.GL_LINEAR);

        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_S,
                GLES20.GL_REPEAT);
        GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T,
                GLES20.GL_REPEAT);

        int ID = mContext.getResources().getIdentifier( texFiles[i], "raw", "com.antonymsoft.slidixcube" );
        InputStream is = mContext.getResources().openRawResource(ID);
        Bitmap bitmap;
        try {
            bitmap = BitmapFactory.decodeStream(is);
        } finally {
            try {
                is.close();
            } catch(IOException e) {
                // Ignore.
            }
        }

        // create it 
        GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
        bitmap.recycle();

    }
}

如果表面完全是黑色的,我认为问题比纹理加载更基本。你的渲染模式是什么?你如何设置你的GL上下文? - Reuben Scratton
@ReubenScratton 感谢您的回复!以下代码行是我从 GLSurfaceView 的构造函数中派生的类中设置上下文和渲染模式的。 ` // 创建 OpenGL ES 2.0 上下文。 setEGLContextClientVersion(2);// 设置 Renderer 以在 GLSurfaceView 上绘制 mCubeSize = 2; mCubeRenderer = new CubeRenderer( context ); setRenderer(mCubeRenderer); // 当绘图数据发生变化时,只有在需要时才渲染视图。 setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);` - tonyw
哦,我还忘了说,我使用 XML 布局创建了我的 GLSurfaceView 子类的一个实例,然后使用 findViewById() 来检索引用。 - tonyw
抱歉,我这里没有真正的想法。你的纹理位图都是2的幂次方吗?你能发布更多的代码吗? - Reuben Scratton
我的纹理不是2的幂次方。即使在OpenGL ES 2和像Nexus 7这样新的设备上,这仍然很重要吗?这是我第一次涉足OpenGL和GPU,所以我非常乐意听取建议。关于发布更多代码,我需要考虑放什么,以便不会在帖子中添加大量无关的内容。 - tonyw
我不会相信非2的幂位图能够作为纹理正常工作。你的位图尺寸是多少?在texImage2D()调用后,你能记录glGetError()的值吗? - Reuben Scratton
1个回答

5

你的纹理尺寸是多少?它应该是二的幂次方,比如16x32、512x512、1024x512等等。


3
没错,就是这样。令人惊讶的是,一些设备仍然不支持非二次幂纹理。 - tonyw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接