android 创建帧缓冲器从外部oes获取图像

wyyhbhjk  于 2023-03-21  发布在  Android
关注(0)|答案(1)|浏览(104)

我尝试使用帧缓冲区进行多通道渲染,问题是源是摄像机,因此texInput不是GL_TEXTURE_2D类型,而是GL_TEXTURE_EXTERNAL_OES类型,如果我使用函数glTexImage 2D,则在渲染到该纹理后,当我将来使用该纹理时,会出现黑屏,没有任何错误glErros。
另一方面,如果我不使用它(因为它不支持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来代替glTexImage 2d,所以最终代码是:

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}")
}

虽然这看起来很有意义,但我仍然得到帧缓冲区的状态为未完成:/

xpszyzbs

xpszyzbs1#

我怀疑您的问题来自于尝试将外部纹理附加到帧缓冲区对象。
与其尝试将其附加到帧缓冲区,不如尝试以通常的方式从其中采样?即:

  • 选择一个纹理单元,例如GL_TEXTURE0,并使用glActiveTexture激活它
  • 使用glBindTexture将纹理绑定到该纹理单元
  • 将纹理单元的ID与glUniform1i统一放置(如果之前使用GL_TEXTURE0,则ID为0,如果使用GL_TEXTURE1,则ID为1,以此类推)
  • 绘制使用纹理的内容(例如,使用glDrawArrays

我不认为我可以提供有用的示例代码,但这是使用纹理的正常方式,所以会有很多这样的示例。我假设在调用glBindTexture时需要使用GL_TEXTURE_EXTERNAL_OES而不是GL_TEXTURE_2D
如果需要,您仍然可以使用帧缓冲区对象进行绘制,只是不能从中进行阅读。

相关问题