旧版设备上的OpenGL ES渲染

时间:2017-10-26 18:52:40

标签: java android opengl-es

我正在为Android构建绘图应用程序,我的目标是Android版本> = 5.0(minSdkVersion 21)。我在Android 6.0+设备上使用OpenGL + TextureView正确使用了图纸(在华为,One Plus,Nexus等上测试过),但在Android 5.1.1上,我在下面的附件中看到了问题。

以下是一些信息:

打开GL ES设置

setEGLContextClientVersion(2);
setPreserveEGLContextOnPause(true);
// Enable transparency.
setEGLConfigChooser(8, 8, 8, 8, 16, 8);
setOpaque(false);

...

mRenderer = new GTRenderer(this);
setRenderer(mRenderer);
setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

我有TextureView的扩展名,用于处理连续/脏绘图。同样在GLTextureView我有:

@Override
public boolean onTouchEvent(MotionEvent event) {
    if (event.getPointerCount() == 1) {
        mRenderer.onTouchEvent(event);
        requestRender();
        return true;
    } else {
        int action = event.getActionMasked();
        if (action == MotionEvent.ACTION_CANCEL) {
            // Zoom started, so add Undo.
            mRenderer.cancelOrFinishLine(event, false);
        }
    }
    return false;
}

知道为什么会这样吗?

这就是它的外观(在Android 6 +上看起来像这样):

enter image description here

这就是它的外观(Android 5.0):

enter image description here

1 个答案:

答案 0 :(得分:0)

好吧,我发现了为什么会这样。在我这之前:

GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width, height, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null);

而不是null我实际上创建了一个这样的空缓冲区:

IntBuffer textureContent = IntBuffer.allocate(width * height * 4);
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, width, height, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, textureContent);

现在我在我测试过的所有设备上都获得了白色画布 - 即使是在旧平板电脑上我也看到了上面的胡言乱语。我猜旧设备需要初始化的内容缓冲区。