如何使用OpenGL在Android屏幕外渲染位图?

如何使用OpenGL在Android屏幕外渲染位图?,android,kotlin,bitmap,opengl-es,Android,Kotlin,Bitmap,Opengl Es,我需要渲染位图而不在屏幕上显示它。为此,我使用EGL14创建OpenGL上下文,如中所述。然后我使用GLES20.glReadPixels将OpenGL曲面保存到位图。但由于某些原因,它没有按预期呈现,只是透明的 导入android.graphics.Bitmap 导入android.opengl* 导入android.opengl.EGL14.EGL\u上下文\u客户端\u版本 导入java.nio.ByteBuffer 类渲染器{ 私有lateinit变量显示:EGLDisplay 私有la

我需要渲染位图而不在屏幕上显示它。为此,我使用
EGL14
创建OpenGL上下文,如中所述。然后我使用
GLES20.glReadPixels
将OpenGL曲面保存到位图。但由于某些原因,它没有按预期呈现,只是透明的

导入android.graphics.Bitmap
导入android.opengl*
导入android.opengl.EGL14.EGL\u上下文\u客户端\u版本
导入java.nio.ByteBuffer
类渲染器{
私有lateinit变量显示:EGLDisplay
私有lateinit变量表面:EGLSurface
私有lateinit var eglContext:eglContext
抽奖{
//只是一个用红色填充位图的存根
GLES20.glClearColor(1f、0f、0f、1f)
GLES20.glClear(GLES20.GLU颜色缓冲位)
}
fun saveBitmap():位图{
val宽度=320
val高度=240
val mpixelbuff=ByteBuffer.allocate(宽*高*4)
GLES20.glReadPixels(0,0,宽度,高度,GLES20.GL_RGBA,GLES20.GL_无符号_字节,mPixelBuf)
返回Bitmap.createBitmap(宽度、高度、Bitmap.Config.ARGB_8888)
}
private fun initializeEglContext(){
display=EGL14.eglGetDisplay(EGL14.EGL\u默认显示)
if(display==EGL14.EGL\u NO\u display){
抛出运行时异常(“eglGetDisplay失败${EGL14.eglGetError()}”)
}
val版本=阵列(2)
如果(!EGL14.eglInitialize(显示,版本,0,版本,1)){
抛出运行时异常(“eglInitialize失败${EGL14.eglGetError()}”)
}
val configAttr=intArrayOf(
EGL14.EGL_颜色_缓冲区_类型,EGL14.EGL_RGB_缓冲区,
EGL14.EGL_级,0,
EGL14.EGL_可渲染类型,EGL14.EGL_OPENGL_ES2_位,
EGL14.EGL_表面类型,EGL14.EGL_缓冲位,
EGL14.EGL_无
)
val配置:数组=arrayOfNulls(1)
val numConfig=IntArray(1)
EGL14.eglChooseConfig(
显示,配置属性,0,
配置,0,1,numConfig,0
)
if(numConfig[0]==0){
抛出运行时异常(“未找到配置”)
}
val配置:EGLConfig?=configs[0]
val surfAttr=intArrayOf(
EGL14.EGL_宽度,320,
EGL14.EGL_高度,240,
EGL14.EGL_无
)
surface=EGL14.eglCreatePbufferSurface(显示,配置,surfAttr,0)
val contextAttrib=intArrayOf(
EGL_上下文_客户端_版本,2,
EGL14.EGL_无
)
eglContext=EGL14.eglCreateContext(显示,配置,EGL14.EGL\u否\u上下文,contextAttrib,0)
EGL14.eglMakeCurrent(显示、表面、表面、eglContext)
}
乐趣毁灭(){
EGL14.eglMakeCurrent(显示,EGL14.EGL_无_表面,EGL14.EGL_无_表面,
EGL14.EGL(无上下文)
EGL14.eglDestroySurface(显示器,表面)
EGL14.eglDestroyContext(显示,eglContext)
EGL14.eglTerminate(显示)
}
}
我就是这样使用它的:

val renderer=renderer()
renderer.initializeEglContext()文件
renderer.draw()
val bitmap=renderer.saveBitmap()
renderer.destroy()
代码运行时没有任何错误。我检查了上下文是否已成功创建。例如
GLES20.glCreateProgram
按预期工作并返回有效id。我得到的唯一警告是

W/OpenGLRenderer:未能选择保留EGL\u交换\u行为的配置,正在重试,但没有。。。
但我不确定它是否会以任何方式影响结果。 但是,
位图
没有填充颜色,并且是透明的:

val color=位图[0,0]
Log.d(“Main”,“onCreate:${Color.valueOf(Color)}”)
颜色(0.0,0.0,0.0,0.0,sRGB IEC61966-2.1)

我想我错过了什么,但我不知道是什么。如何使其实际渲染?

必须将像素缓冲区复制到位图:

val mPixelBuf bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
bitmap.copyPixelsFromBuffer(mPixelBuf)
return bitmap

您忘记在绘图函数中调用
glClear()
。您只将其使用的颜色设置为“清除”。谢谢!这不是我第一次忘记呼叫
glClear
。我在问题中修复了它,因为这不是唯一的原因,不幸的是,为什么位图没有渲染。为什么egl曲面的尺寸为64x64?它应该是320x240。@Hikomori修复了它,但问题仍然是一样的。在任何情况下,位图的像素应在边界内,而其他像素未定义