You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 21:50:38