Tengo una pregunta, quiero usar glMapBufferRange para leer datos. La forma en que lo uso es la siguiente:

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

Sin embargo, ptr parece ser NULL. Como se indica en la documentación aquí: https: // www .khronos.org / registry / OpenGL-Refpages / es3.0 / html / glMapBufferRange.xhtml la función devuelve NULL si ocurre un error. Por lo tanto, verifiqué el error usando glGetError (). Pero el error que obtengo es 0, que es lo mismo que GL_NO_ERROR. Entonces, ¿qué me estoy perdiendo, qué estoy haciendo mal?

¡Gracias de antemano!

0
Grimfandango 10 oct. 2019 a las 11:04

1 respuesta

La mejor respuesta

Honestamente, no he escuchado sobre el contexto openGL hasta ahora (solo leí sobre él), comencé a escribir mi código basado en el proyecto de muestra de gráficos de sensores de Android: https://github.com/android/ndk-samples/tree/master/sensor-graph. Para responder a su pregunta, no he tenido ningún problema hasta ahora y supongo que sí, pero no estoy 100% seguro. Antes de solicitar una lectura de datos, escribo datos en el búfer:

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

Aquí es donde llamo glBufferData()

Actualización: Lado de 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();
}

});      

Actualización: @Matic Oblak Tenías razón, el contexto era en realidad un problema. Siempre que solo tocara los búferes a través de JNI dentro de onSurfaceCreated, onSurfaceChanged o onDrawFrame, todo estaba bien. Pero tan pronto como intenté acceder a ellos afuera, por ejemplo, a través de mLiveViewJNI.dummyCall, encontré ese problema y todo devolvió 0 o NULL. Gracias :)!

0
Grimfandango 10 oct. 2019 a las 11:56