使用 glMapBufferRange 将数据读取到缓冲区

Using glMapBufferRange to read data to a buffer

我想用glMapBufferRange读出数据。我的使用方法如下:

bindBuffer(vboIdx);
void *ptr = glMapBufferRange(GL_ARRAY_BUFFER, 0, size, GL_MAP_READ_BIT);
int err = glGetError();
assert(ptr);
memcpy(dst, ptr, size);
glUnmapBuffer(GL_ARRAY_BUFFER);
unbindBuffer();

不过,ptr好像是NULL。如此处的文档所述:khronos - glMapBufferRange;函数 returns NULL 如果发生错误。因此,我使用 glGetError() 检查错误。但是我得到的错误是 0,这与 GL_NO_ERROR.

相同

我做错了什么?

老实说,到目前为止我还没有听说过 OpenGL 上下文(只是读过),我开始根据 android's sensor graph sample project.

编写代码

回答你的问题,到目前为止我没有遇到过问题,我想是的,但我不是 100% 确定。在请求数据读出之前,我将数据写入缓冲区:

if(dataSize == 0) {
    return;
}

 bindBuffer(vboIdx);
 if(dataSize > vertexBufSize[vboIdx] - offset) {
     glBufferData(GL_ARRAY_BUFFER, dataSize, data, GL_STREAM_DRAW);
     vertexBufSize[vboIdx] = dataSize;
 }

 void *ptr = glMapBufferRange(GL_ARRAY_BUFFER, offset, dataSize, GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
 int err = glGetError();
 assert(ptr);

 if(data != nullptr) {
     memcpy(ptr, data, dataSize);
 }

 glUnmapBuffer(GL_ARRAY_BUFFER);
     unbindBuffer();

这是我打电话的地方 glBufferData()

Java 边:

mView = (GLSurfaceView) frameLayout.findViewById(R.id.plot_view);
mView.setEGLContextClientVersion(3);
mView.setEGLConfigChooser(true);
if(LOG) Log.d(TAG, "onCreateView(): get ID: " + mView.getId());

isStreaming = true;
mView.setRenderer(new GLSurfaceView.Renderer() {
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
  mLiveViewJNI.surfaceCreated();
}

@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
  mLiveViewJNI.surfaceChanged(width, height);
}

@Override
public void onDrawFrame(GL10 gl) {
  mLiveViewJNI.drawFrame();
}

});      

是对的,实际上是上下文的问题。只要我只在 onSurfaceCreatedonSurfaceChangedonDrawFrame 内通过 JNI 接触缓冲区,一切都很好。

但是,当我尝试通过 mLiveViewJNI.dummyCall 从外部访问它们时,我 运行 遇到了那个问题,所有内容都返回了 0NULL.