OpenGL ES2.0 - 重新启动应用程序后,一切看起来都很奇怪

时间:2014-03-19 13:18:23

标签: android opengl-es opengl-es-2.0

编辑:

更多的调试让我知道glGetAttribLocation返回-1,除了第一次启动Application。程序ID有效(我猜?),现在我的测试中它是12。我还试图在绘制之前检索属性位置,但这也没有用。

我的着色器“架构”现在看起来像这样:

我将着色器变成了单例。即只有一个例子。使用它:

public void useProgram() {
    GLES20.glUseProgram(iProgram);
    getUniformLocations();
    getAttributeLocations();
}

即。程序将被发送到OpenGL,之后我正在检索所有变量的统一和属性位置,它们存储在HashMap中(每个着色器一个):

@Override
protected void getAttributeLocations() {
    addToGLMap(A_NORMAL, GLES20.glGetAttribLocation(iProgram, A_NORMAL));
    addToGLMap(A_POSITION, GLES20.glGetAttribLocation(iProgram, A_POSITION));
    addToGLMap(A_COLOR, GLES20.glGetAttribLocation(iProgram, A_COLOR));
}

我不明白,为什么程序的ID是例如12,但在我的应用程序的第二次和下一次运行中,所有属性位置都不存在...


在我的应用程序中,我正在加载一个Wavefront对象,以及我正在绘制几行和多维数据集,只是为了尝试一些东西。在启动应用程序“清理”之后,即在重新启动或安装它之后,一切看起来都是预期的。但是,如果我关闭应用程序并重新打开它,它看起来很奇怪,屏幕截图位于底部。

我目前正在做的事情:

onSurfaceCreated:

照顾剔除,清除颜色等。 清除所有加载的对象(仅用于测试,当然不会在后期删除内存)。 重新加载对象(线程)。

我的对象存储方式如下:

public class WavefrontObject {
    private FloatBuffer mPositionBuffer = null;
    private FloatBuffer mColorBuffer = null;
    private FloatBuffer mNormalBuffer = null;
    private ShortBuffer mIndexBuffer = null;
}
  • 在创建元素时填充缓冲区。

他们被画出来了:

mColorBuffer.position(0);
mNormalBuffer.position(0);
mIndexBuffer.position(0);
mPositionBuffer.position(0);


GLES20.glVertexAttribPointer(mShader.getGLLocation(BaseShader.A_POSITION), 3, GLES20.GL_FLOAT, false,
        0, mPositionBuffer);

GLES20.glEnableVertexAttribArray(mShader.getGLLocation(BaseShader.A_POSITION));

// etc...

GLES20.glDrawElements(GLES20.GL_TRIANGLES, mIndexBuffer.capacity(), GLES20.GL_UNSIGNED_SHORT, mIndexBuffer);
  • 绘制后我是否需要禁用VertexAttribArrays?我目前正在为每个绘图循环覆盖缓冲区,但它们是否可能与正在绘制的其他模型进行交互?

我正在加载的模型显示一个小型玩具飞机。重新启动应用程序后,它看起来像这样(加载对象,所有颜色都设置为白色(用于测试)):

enter image description here

所以对我而言,看起来缓冲区中还有剩余的东西?使用这些缓冲区的“最佳实践”是什么?禁用阵列? OpenGL ES2.0是否提供了某种“清除缓冲区”方法,在将值放入其中之前我可以使用它?

预期绘制的内容:在“怪异三角形”和颜色源自的位置,应该有平面模型。全白色。

1 个答案:

答案 0 :(得分:1)

当您的应用程序丢失上下文时,其OpenGL上下文将被销毁。 所以所有对象(程序及其统一/属性句柄等)都是无效的。

在重新开启期间,你必须清除/无效像你这样的所有单件对象......

相关问题