Android OpenGL程序失效的原因是什么?

Android OpenGL程序失效的原因是什么?,android,opengl-es-2.0,Android,Opengl Es 2.0,我目前正在搜索一个基于OpenGL程序无效的bug。但如果不知道问题可能来自何方,就很难找到问题的根源 当我创建程序时,它是有效的。此外,我不使用glDeleteProgram() 要确定我的程序是否有效,我使用。通常在OpenGL中,对象在第一次绑定之前不会创建。 glGenTextures(…)例如,为纹理对象保留并返回一个或多个名称,但这些名称在绑定到类似glBindTexture(GL\u TEXUTRE\u 2D,…)的内容之前不会成为实际纹理。。换句话说,名称是保留的,但它们引用的内

我目前正在搜索一个基于OpenGL程序无效的bug。但如果不知道问题可能来自何方,就很难找到问题的根源

当我创建程序时,它是有效的。此外,我不使用
glDeleteProgram()

要确定我的程序是否有效,我使用。

通常在OpenGL中,对象在第一次绑定之前不会创建。
glGenTextures(…)
例如,为纹理对象保留并返回一个或多个名称,但这些名称在绑定到类似
glBindTexture(GL\u TEXUTRE\u 2D,…)的内容之前不会成为实际纹理。
。换句话说,名称是保留的,但它们引用的内容尚未实例化/初始化

glIs*(…)实际返回的是您传递给它的名称是否是已创建对象的名称。因此,如果您从未绑定对象,则不会创建该对象,此函数将返回
GL\u FALSE

glUseProgram(…)
是OpenGL用来绑定GLSL程序对象的函数。尽管GLSL程序和着色器对象的工作方式不同于所有其他类型的OpenGL对象,但很可能
glIsProgram(…)
在调用
glUseProgram(…)
至少一次之后才会返回
glu-TRUE


顺便说一下,为了验证程序,我建议您使用
glValidateProgram(…)

下面是一些C伪代码,演示如何使用
glValidateProgram

如果在此之后
valid
GL\u TRUE
,则您的程序有效(例如,它已成功链接)。

您是否已打印出GLSL编译错误日志?或者说无效是什么意思?@harism GLSL编译日志没有问题。Valid表示程序()返回true。(文档中描述)我的坏消息。你能详细说明一下你是如何管理你的程序id/对象的吗?您是否在任何时候调用glDeleteProgram?可能是在glDeleteProgram仍在使用时?如果上下文丢失了,您是否要重新创建它?您是否运行了用于OpenGL ES的tracer<代码>程序(…)不会告诉您程序是否有效。这只会告诉您在OpenGL上下文中是否存在具有该名称的程序对象。如果您从未绑定程序(例如调用
glUseProgram(…)
),则根据您对“有效”的定义,它永远不会是“有效”的
GLint valid = GL_FALSE;
glValidateProgram (program);
glGetProgramiv    (program, GL_VALIDATE_STATUS, &valid);