我正在开发基于Qt 5.4的Android系统应用程序。 我正在生成几个OES纹理,并通过着色器在Qt FBO TEXTURE_2D
中进行渲染。每个OES纹理都有自己的eglcontext,每个人都有相同的sharedContext。 OES纹理是一个接一个地使用的,我的意思是,我不想同时渲染多个纹理,但是我需要创建多个纹理,因为我必须能够同时渲染多个纹理未来。opengl es,glActiveTexture时出错
这是我使用的代码时,我必须更新:
m_program->bind();
glActiveTexture(GL_TEXTURE0 + textureId);
glBindTexture(GL_TEXTURE_EXTERNAL_OES, textureId);
/* my code to fill shader attr and glDraw*() */
glBindTexture(GL_TEXTURE_EXTERNAL_OES, 0);
m_program->release();
的问题是,由于某种原因,我可以使创建的第一个OES质地,因为我得到一个W/Adreno-ES20(28468): <core_glActiveTexture:348>: GL_INVALID_ENUM
尝试时glActiveTexture第二个。所以,目标纹理填充黑色。
我已经检查了这一切,并是正确的:
- textureId调用eglCreateContext时
- sharedContext。
- 当前eglContext呈现时,我的意思是,当调用上面的 代码时。
- 二OES质地已经充满
- GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS 16
- GL_MAX_TEXTURE_IMAGE_UNITS 16
- GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS 32
我有点失落,我不知道我这是一个限制或错误我的代码。
有什么想法?
编辑:在其他设备尝试,应用程序正常工作,所以我认为这个问题是关于设备的限制..
既然你说第二个调用已经报告了一个错误,你可以尝试硬编码第二个GL_TEXTURE1。如果这有效,那么你的textureId有一个奇怪的值,或者GL_TEXTURE1在你的情况下不等于GL_TEXTURE0 + 1。如果这些工作可以通过包装纹理ID来创建解决方法,则创建另一个自定义自动增量ID,然后在包含GL_TEXTUREX枚举的某个访问表上使用该ID。 –
@MaticOblak由于某种原因,生成的textureIds不是一个一个的,我正在检查它的3个纹理来渲染和数字是:(oesTextureId 23)(oesTextureId 45)(oesTextureId 61) –
所以这似乎是问题,然后。你可能永远不会认为这些ID将是连续的,或者甚至以0或任何其他低值开始。你是否仍然坚持要做什么,或者你是否理解生成自己的自动增量活动纹理ID的概念? –