使用GL_TEXTURE_EXTERNAL_OES创建帧缓冲区的多遍渲染问题
相机GL_TEXTURE_EXTERNAL_OES纹理关联FBO时帧缓冲区状态不完整的问题
我尝试通过帧缓冲区实现多遍渲染,但数据源为相机,输入纹理类型是GL_TEXTURE_EXTERNAL_OES而非GL_TEXTURE_2D,遇到以下问题:
- 若使用
glTexImage2D函数,后续用该纹理渲染会出现黑屏,且无glError报错; - 若不使用该函数(
GL_TEXTURE_EXTERNAL_OES本身不支持它),帧缓冲区状态会显示为NOT_COMPLETE。
初始实现代码
fun prepareFBO() { val intArray = IntArray(1) glGenFramebuffers(1, intArray, 0) fboId = intArray.first() glGenTextures(1, intArray, 0) texId = intArray.first() glBindTexture(GL_TEXTURE_2D, texId) glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,1080, 1920, 0, GL_RGBA, GL_UNSIGNED_BYTE, null) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST) glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST) glBindFramebuffer(GL_FRAMEBUFFER, fboId) glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, texId, 0) val status = glCheckFramebufferStatus(GL_FRAMEBUFFER) Log.e(TAG, "prepareFBO: ${status == GL_FRAMEBUFFER_COMPLETE}") glBindFramebuffer(GL_FRAMEBUFFER, 0) glBindTexture(GL_TEXTURE_2D, 0) }
注:glDrawArrays和glActiveTexture等逻辑直接渲染到默认帧缓冲区时可正常工作,如需可提供。
更新后的代码
我发现应该用eglBindTexImage替代glTexImage2D,修改后的代码如下:
fun prepareFBO() { val intArray = IntArray(1) glGenFramebuffers(1, intArray, 0) fboId = intArray.first() glBindFramebuffer(GL_FRAMEBUFFER, fboId) glGenTextures(1, intArray, 0) texId = intArray.first() glBindTexture(GL_TEXTURE_EXTERNAL_OES, texId) checkGlError("Error 1") eglBindTexImage(eglGetCurrentDisplay(), windowSurface!!.eglSurface, EGL_BACK_BUFFER) glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_EXTERNAL_OES, texId, 0) val status = glCheckFramebufferStatus(GL_FRAMEBUFFER) Log.e(TAG, "prepareFBO: is status complete? => ${status == GL_FRAMEBUFFER_COMPLETE}") }
逻辑看似合理,但帧缓冲区状态仍显示为不完整。
内容的提问来源于stack exchange,提问作者Mohammad Elsayed
相关产品推荐
相关产品推荐

