Nexus S中的glError 1282但Nexus One中没有

时间:2011-07-25 15:21:29

标签: android opengl-es-2.0

我正在使用openGL ES 2.0创建动态壁纸。 该应用程序在我的nexus中运行良好,但它在Nexus S中没有显示任何内容。

到目前为止我测试过的事情:

  • 我已经检查了this question。我的纹理是128x128所以我想这不是问题。

  • 我在代码中使用了checkGlError方法,发现它没有问题地传递了onSurfaceCreatedonSurfaceChanged。如果我在onDrawFrame()方法的第一行调用它,该方法会抛出异常。

checkGlError代码如下:

private void checkGlError(String op) {
    int error;
    while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) {
        Log.e(TAG, op + ": glError " + error);
        throw new RuntimeException(op + ": glError " + error);
    }
}

我注意到两个设备都发生了错误,但它在nexus S中看起来很关键,而它在nexus中得到了很好的效果。我的猜测是着色器编译不正确而且存在问题。

你知道nexus S和nexus之间的其他不兼容性吗? 有没有办法调试着色器的代码?

2 个答案:

答案 0 :(得分:1)

  

你知道nexus S和nexus之间的其他不兼容性吗?

不是我所知道的,尽管OpenGL ES驱动程序确实存在手机不同的可能性。

  

有没有办法调试着色器的代码?

我自己没有尝试使用着色器,但是,我可以通过GLSurfaceView上的调试来检查常规翻译,轮换等。

尝试在GLSurfaceView上设置此项并检查您是否能够在LogCat中看到更改:

mGLSurfaceView.setDebugFlags(GLSurfaceView.DEBUG_CHECK_GL_ERROR 
    | GLSurfaceView.DEBUG_LOG_GL_CALLS);

答案 1 :(得分:0)

最后,我的问题与this question有关。

从资源中读取时,Android调整了我的纹理。我解决了从原始文件夹中读取纹理的问题:

public void loadBitmap(int resourceId) {

        textureId = resourceId;

        /* Get the texture */
        InputStream is = mContext.getResources().openRawResource(textureId);
        Bitmap bitmap;

        try {
            bitmap = BitmapFactory.decodeStream(is);
        } finally {
            try {
                is.close();
            } catch (IOException e) {
                // Ignore.
            }
        }

        int width = bitmap.getWidth();
        int height = bitmap.getHeight();

        Buffer data = ByteBuffer.allocateDirect(width * height * 4);
        bitmap.copyPixelsToBuffer(data);
        data.position(0);

        // Bind the texture object
        GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, mTextures.get(0));
        ...
        // OpenGL stuff
        ...
    }