问题:当且仅当没有偏移量时,将包含图像数据的包装传递给我对我有用-否则ByteBuffer
(如果有偏移量集)它会无用地崩溃,例如:byte[]
GLES20.glTexImage2D(...)
ByteBuffer
Fatal signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 0x61616162636575 in tid 32016 (GLThread 4912), pid 31806
背景:我有一个byte[]
720p 图像的 YUV (I420) 数据 - 我需要将其作为 3 个单独的 s 读取出来ByteBuffer
以传递给具有 3 个不同 sampler2D 通道(每个缓冲区 1 个通道)的 OpenGL 着色器。
理想情况下,由于所有信息都在内存中,我将创建三个 ByteBuffers 包装不同的部分,byte[]
如下所示:
ByteBuffer yBuffer = ByteBuffer.wrap(rawYUVData, 0, yBufferSize);
ByteBuffer uBuffer = ByteBuffer.wrap(rawYUVData, yBufferSize, uBufferSize);
ByteBuffer vBuffer = ByteBuffer.wrap(rawYUVData, yBufferSize+uBufferSize, uBufferSize);
然后在我的渲染器代码中,我glTexImage2D
还调用了 OpenGL 三次:
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, yTexDataHandle);
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_LUMINANCE, imgWidth, imgHeight, 0, GLES20.GL_LUMINANCE, GLES20.GL_UNSIGNED_BYTE, yBuffer);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, uTexDataHandle);
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_LUMINANCE, uWidth, uHeight, 0, GLES20.GL_LUMINANCE, GLES20.GL_UNSIGNED_BYTE, uBuffer);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, vTexDataHandle);
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_LUMINANCE, uWidth, uHeight, 0, GLES20.GL_LUMINANCE, GLES20.GL_UNSIGNED_BYTE, vBuffer);
这是崩溃的。我可以通过将上面的内容复制到新的 s 中,然后将 s 重新包装在新数组上来很好uBuffer
地vBuffer
修复byte[]
崩溃ByteBuffer
。
但是我正在不必要地复制数据,并且每秒复制 30 倍。
我可以不将ByteBuffer
s 包裹在带有偏移量的连续字节 [] 上,并出于某种原因在 OpenGL 中使用它们吗?我真的必须一直复制吗?
texture2D()
通过删除涉及违规采样器的调用,我检查了这不是我的着色器文件中的问题。- 即使只是在我的构造中添加 1 的偏移量,
yBuffer
它也会在 0 的情况下崩溃,它可以正常工作。(rawYUVData.length 始终 > yBufferSize + 1)