Android OpenGL ES 2.0 обновление текстуры показывает черный
Я пытаюсь отобразить XML-макет на поверхности OpenGL. Это работает правильно, и я могу делать 3D-эффекты на макете. Но, когда я пытаюсь обновить его и сделать его снова, он не работает. С помощью перекручивания и пробования различных функций конечным результатом является либо черный объект, графическое повреждение на виджетах, внешних по отношению к поверхности, либо исходный объект без каких-либо изменений.
Мой код для преобразования представления в растровое изображение:
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()
, ничего не делает и не выдает сообщения об ошибке.
Спасибо!