Android OpenGL ES 2.0纹理更新显示黑色

Android OpenGL ES 2.0纹理更新显示黑色,android,opengl-es,opengl-es-2.0,textures,Android,Opengl Es,Opengl Es 2.0,Textures,我正在尝试将XML布局渲染到OpenGL曲面。这是正确的,我可以在布局上做3D效果。但是,当我尝试更新它并再次渲染它时,它不起作用。通过旋转和尝试不同的功能,最终结果要么是一个黑色的对象,表面外部小部件上的图形损坏,要么是没有任何修改的原始对象 我将视图转换为位图的代码是: public静态位图toBitmap(最终视图){ 最终位图=位图.createBitmap(400100, 位图.Config.ARGB_8888); 最终画布=新画布(位图); 最终油漆=新油漆(); view.setD

我正在尝试将XML布局渲染到OpenGL曲面。这是正确的,我可以在布局上做3D效果。但是,当我尝试更新它并再次渲染它时,它不起作用。通过旋转和尝试不同的功能,最终结果要么是一个黑色的对象,表面外部小部件上的图形损坏,要么是没有任何修改的原始对象

我将视图转换为位图的代码是:

public静态位图toBitmap(最终视图){
最终位图=位图.createBitmap(400100,
位图.Config.ARGB_8888);
最终画布=新画布(位图);
最终油漆=新油漆();
view.setDrawingCacheEnabled(true);
final int width=MeasureSpec.makeMeasureSpec(canvas.getWidth(),
精确测量);
final int height=MeasureSpec.makeMeasureSpec(canvas.getHeight(),
精确测量);
视图。测量(宽度、高度);
布局(0,0,view.getMeasuredWidth(),view.getMeasuredHeight());
drawBitmap(view.getDrawingCache(),0,0,paint);
返回位图;
}
然后,在对象的构造函数中,我调用:

publicstaticintloadTexture(最终位图){
GLES20.glGenTextures(1,textureHandle,0);
if(textureHandle[0]!=0){
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,textureHandle[0]);
GLES20.glTexParameteri(GLES20.GL_纹理_2D,
GLES20.GL_纹理_最小_过滤器,GLES20.GL_最近);
GLES20.glTexParameteri(GLES20.GL_纹理_2D,
GLES20.GL_纹理(MAG_过滤器,GLES20.GL_最近);
GLUtils.texImage2D(GLES20.GL_纹理_2D,0,位图,0);
bitmap.recycle();
}
if(textureHandle[0]==0){
抛出新的RuntimeException(“加载纹理时出错”);
}
返回textureHandle[0];
}
使用更新的布局再次调用
loadTexture()
方法将使其变为黑色。我写了另一个小方法来尝试不同的方法:

publicstaticintupdateTexture(最终位图){
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,textureHandle[0]);
GLES20.glTexParameteri(GLES20.GL_纹理_2D,
GLES20.GL_纹理_最小_过滤器,GLES20.GL_最近);
GLES20.glTexParameteri(GLES20.GL_纹理_2D,
GLES20.GL_纹理(MAG_过滤器,GLES20.GL_最近);
GLUtils.texSubImage2D(GLES20.GL_纹理_2D,0,0,位图);
//GLUtils.texImage2D(GLES20.GL_纹理_2D,0,位图,0);
//GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,0);
返回textureHandle[0];
}
这将保持原始纹理不变,并产生错误:

:GL\u无效\u值
GLStartTillingQCOM:0x501
注释
texSubImage2D()
调用并将其替换为
texImage2D()
不会产生任何错误消息

如果有人能告诉我我做错了什么,我将不胜感激


谢谢

是否从OpenGL线程调用更新方法?如果使用texSubImage函数,则无需再次指定纹理参数。

是否从OpenGL线程调用更新方法?如果使用texSubImage函数,则无需再次指定纹理参数。@TraxNet解决了此问题:我现在注册要更新纹理,然后在
onDraw()
中进行适当的更新。现在我被其他表面上的新纹理泄漏所困扰,但我相信这个新缺陷与这个问题无关。我添加了一个答案(复制并粘贴我的评论),以便您可以将其标记为已解决。打开一个关于新问题的新问题。致以最良好的问候。纹理泄漏的问题是我不正确地在人脸之间共享纹理句柄。一个简单的逻辑错误是通过保持句柄隔离来修复的。很好,你找到了它,继续努力吧!干杯