2016-02-22 4 views
1

У меня есть растровое изображение (которое можно преобразовать в ByteBuffer). Я хочу загрузить все свои 6 граней смещениями на GPU в OpenGL. Когда я делаю следующее, приложение вылетает с OpenGL, что приводит к нарушению памяти.Нарушение памяти в Android OpenGL GLES20 с glTexImage2D

Здесь bitmap массив байтов byte[]

for (int i=0 ; i<6 ; i++) { 
     GLES20.glTexImage2D(
      GLES20.GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 
      0, 
      GLES20.GL_RGBA, 
      side, 
      side, 
      0, 
      GLES20.GL_RGBA, 
      GLES20.GL_UNSIGNED_BYTE, 
      ByteBuffer.wrap(bitmap, length/6 * i, side * side * 4)); 
    } 

Но когда я копирую массив, а затем загрузить на GPU, как это (здесь bitmap имеет тип Bitmap):

int numBytes = bitmap.getByteCount(); 
ByteBuffer pixels = ByteBuffer.allocate(numBytes); 
bitmap.copyPixelsToBuffer(pixels); 
for (int i=0 ; i<6 ; i++) { 
    Log.d("aakash", String.valueOf(numBytes/6 * i)); 
    byte[] arr = Arrays.copyOfRange(pixels.array(), numBytes/6 * i, numBytes/6 * (i+1)); 
    GLES20.glTexImage2D(
     GLES20.GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 
     0, 
     GLES20.GL_RGBA, 
     bitmap.getWidth(), 
     bitmap.getHeight()/6, 
     0, 
     GLES20.GL_RGBA, 
     GLES20.GL_UNSIGNED_BYTE, 
     ByteBuffer.wrap(arr)); 
} 

Я получаю правильно созданный куб.

Что я делаю неправильно в первом? Я хочу избежать копирования массива для загрузки его частей на GPU.

Я могу заверить, что размер и математические вычисления верны.

ответ

0

Чтобы избежать нарушения памяти просто заменить

ByteBuffer pixels = ByteBuffer.allocate(numBytes); 

с

ByteBuffer pixels = ByteBuffer.allocateDirect(numBytes); 

Но вам не нужно ByteBuffer для простой боковой загрузкой текстуры

loadSideTexture(context, GLES20.GL_TEXTURE_CUBE_MAP_POSITIVE_X, R.raw.lake2_rt); 
loadSideTexture(context, GLES20.GL_TEXTURE_CUBE_MAP_NEGATIVE_X, R.raw.lake2_lf); 

loadSideTexture(context, GLES20.GL_TEXTURE_CUBE_MAP_POSITIVE_Y, R.raw.lake2_up); 
loadSideTexture(context, GLES20.GL_TEXTURE_CUBE_MAP_NEGATIVE_Y, R.raw.lake2_dn); 

loadSideTexture(context, GLES20.GL_TEXTURE_CUBE_MAP_POSITIVE_Z, R.raw.lake2_bk); 
loadSideTexture(context, GLES20.GL_TEXTURE_CUBE_MAP_NEGATIVE_Z, R.raw.lake2_ft); 

private void loadSideTexture(Context context, int target, @RawRes int resID) { 
    final Bitmap bitmap = BitmapFactory.decodeStream(context.getResources().openRawResource(resID)); 
    GLUtils.texImage2D(target, 0, bitmap, 0); 
    bitmap.recycle(); 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^