Использование glMapBufferRange для чтения данных в буфер - PullRequest
0 голосов
/ 10 октября 2019

У меня есть вопрос, я хочу использовать 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. Как указано в документации здесь: https://www.khronos.org/registry/OpenGL-Refpages/es3.0/html/glMapBufferRange.xhtml функция возвращает NULL, если произошла ошибка. Поэтому я проверил наличие ошибки с помощью glGetError (). Но ошибка, которую я получаю, равна 0, что совпадает с GL_NO_ERROR. Так чего мне не хватает, что я делаю не так?

Заранее спасибо!

1 Ответ

0 голосов
/ 10 октября 2019

Честно говоря, я до сих пор не слышал о контексте openGL (просто прочитал об этом), я начал писать свой код на основе примера проекта сенсорного графика Android: https://github.com/android/ndk-samples/tree/master/sensor-graph. Чтобы ответить на ваш вопрос, у меня нет 'У меня до сих пор были проблемы, и я думаю, что да, но я не уверен на 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();
}

});      

Обновление: @Matic Oblak Вы были правы, контекст на самом деле был проблемой. Пока я только касался буферов через JNI в onSurfaceCreated, onSurfaceChanged или onDrawFrame, все было хорошо. Но как только я попытался получить к ним доступ, например, через mLiveViewJNI.dummyCall, я столкнулся с этой проблемой, и все вернуло 0 или NULL. Спасибо:)!

...