【发布时间】:2016-01-14 19:42:20
【问题描述】:
我正在 Android 系统中开发一个基于 Qt 5.4 的应用程序。
我正在生成几个 OES 纹理并通过着色器在 Qt FBO TEXTURE_2D 中渲染。每个 OES 纹理都有自己的 eglcontext,每个人都有相同的 sharedContext。 OES 纹理是一一使用的,我的意思是,我不想同时渲染多个,但我需要创建多个,因为我必须能够在同一时间渲染多个未来。
这是我必须更新时使用的代码:
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 纹理,因为在尝试 glActiveTexture 第二个时我得到了W/Adreno-ES20(28468): <core_glActiveTexture:348>: GL_INVALID_ENUM。因此,目标纹理被填充为黑色。
我已经检查了所有这些并且是正确的:
- 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 枚举的访问表。
-
@MaticOblak 由于某种原因,生成的textureIds不是一个一个,我正在检查它是否有3个要渲染的纹理,数字是:(oesTextureId 23)(oesTextureId 45)(oesTextureId 61)跨度>
-
所以这似乎是问题所在。您可能永远不会假设 id 将是连续的,甚至以 0 或任何其他低值开头。您是否还在纠结该怎么做,或者您是否了解生成自己的自动增量活动纹理 ID 的概念?
-
@MaticOblak,是的,我仍然坚持要做什么,我正在阅读有关生成我自己的自动增量纹理 ID 的信息,因为我从未使用过,欢迎提供任何帮助。
标签: android qt opengl-es-2.0