我尝试使用帧缓冲区进行多通道渲染,问题是源是摄像机,因此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}")
}
虽然这看起来很有意义,但我仍然得到帧缓冲区的状态为未完成:/
1条答案
按热度按时间xpszyzbs1#
我怀疑您的问题来自于尝试将外部纹理附加到帧缓冲区对象。
与其尝试将其附加到帧缓冲区,不如尝试以通常的方式从其中采样?即:
GL_TEXTURE0
,并使用glActiveTexture
激活它glBindTexture
将纹理绑定到该纹理单元glUniform1i
统一放置(如果之前使用GL_TEXTURE0
,则ID为0
,如果使用GL_TEXTURE1
,则ID为1
,以此类推)glDrawArrays
我不认为我可以提供有用的示例代码,但这是使用纹理的正常方式,所以会有很多这样的示例。我假设在调用
glBindTexture
时需要使用GL_TEXTURE_EXTERNAL_OES
而不是GL_TEXTURE_2D
。如果需要,您仍然可以使用帧缓冲区对象进行绘制,只是不能从中进行阅读。