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