使用 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();
}
});
是对的,实际上是上下文的问题。只要我只在 onSurfaceCreated
、onSurfaceChanged
或 onDrawFrame
内通过 JNI 接触缓冲区,一切都很好。
但是,当我尝试通过 mLiveViewJNI.dummyCall
从外部访问它们时,我 运行 遇到了那个问题,所有内容都返回了 0
或 NULL
.
我想用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();
}
});
onSurfaceCreated
、onSurfaceChanged
或 onDrawFrame
内通过 JNI 接触缓冲区,一切都很好。
但是,当我尝试通过 mLiveViewJNI.dummyCall
从外部访问它们时,我 运行 遇到了那个问题,所有内容都返回了 0
或 NULL
.