繁体   English   中英

带有glTexImage2D的Android OpenGL GLES20中的内存冲突

[英]Memory violation in Android OpenGL GLES20 with glTexImage2D

我有一个位图(可以将其转换为ByteBuffer)。 我想将所有6个面按偏移量上传到OpenGL中的GPU。 当我执行以下操作时,该应用程序崩溃并出现OpenGL,从而导致内存冲突。

这里的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。

我可以确保大小和数学计算是正确的。

为避免内存冲突,只需更换

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();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM