我试图将XML布局渲染到OpenGL表面。这工作正常,我可以在布局上做3D效果。但是,当我尝试更新它并再次渲染它时,它不起作用。通过twiddling和尝试不同的功能,最终结果是黑色对象,表面外部小部件的图形损坏,或原始对象没有任何修改。
将视图转换为位图的代码是:
public static Bitmap toBitmap(final View view) {
final Bitmap bitmap = Bitmap.createBitmap(400, 100,
Bitmap.Config.ARGB_8888);
final Canvas canvas = new Canvas(bitmap);
final Paint paint = new Paint();
view.setDrawingCacheEnabled(true);
final int width = MeasureSpec.makeMeasureSpec(canvas.getWidth(),
MeasureSpec.EXACTLY);
final int height = MeasureSpec.makeMeasureSpec(canvas.getHeight(),
MeasureSpec.EXACTLY);
view.measure(width, height);
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
canvas.drawBitmap(view.getDrawingCache(), 0, 0, paint);
return bitmap;
}
然后,在我的对象构造函数中,我调用:
public static int loadTexture(final Bitmap bitmap) {
GLES20.glGenTextures(1, textureHandle, 0);
if (textureHandle[0] != 0) {
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandle[0]);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,
GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,
GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
bitmap.recycle();
}
if (textureHandle[0] == 0) {
throw new RuntimeException("Error loading texture.");
}
return textureHandle[0];
}
使用更新的布局再次调用loadTexture()
方法会将其渲染为黑色。我写了另一个小方法尝试不同的方法:
public static int updateTexture(final Bitmap bitmap) {
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandle[0]);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,
GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D,
GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST);
GLUtils.texSubImage2D(GLES20.GL_TEXTURE_2D, 0, 0, 0, bitmap);
//GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0);
// GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, 0);
return textureHandle[0];
}
这使原始纹理保持不变,并产生错误:
<qgl2DrvAPI_glTexSubImage2D:502>: GL_INVALID_VALUE
glStartTilingQCOM: 0x501
评论texSubImage2D()
调用并将其替换为texImage2D()
不会做任何事情,也不会产生任何错误消息。
如果有人能够解释我可能做错的任何事情,那将非常感激。
谢谢!
答案 0 :(得分:0)
您是否从OpenGL线程调用更新方法?如果使用texSubImage函数,则无需再次指定纹理参数。