Задача: переместить буфер из основной памяти в память видеокарты и считать её обратно. Важно чтобы входной буфер полностью совпадал с выходным.
(Это я пытаюсь разобраться как работает GPGPU. Первый этап — обмен данными с видеокартой)
Как я понял, запись картинки можно сделать glTexImage2D(), а считать обратно с помощью glReadPixels(). Оба вызова срабатывают без ошибок, но обратно мне возвращается чёрный экран.
Мой код лежит (тут). Основная часть:
dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
eglInitialize(dpy, &majorVersion, &minorVersion);
eglChooseConfig(dpy, s_configAttribs, &config, 1, &numConfigs);
EGLint attribs[] = { EGL_WIDTH, w, EGL_HEIGHT, h, EGL_NONE };
surface = eglCreatePbufferSurface(dpy, config, attribs);
context = eglCreateContext(dpy, config, NULL, NULL);
eglMakeCurrent(dpy, surface, surface, context);
eglQuerySurface(dpy, surface, EGL_WIDTH, &w);
eglQuerySurface(dpy, surface, EGL_HEIGHT, &h);
glViewport(0, 0, w, h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(0, w, 0, h, 0, 1);
glBindTexture(GL_TEXTURE_2D, 0);
glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterx(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
// *** data = { 0, 10, 20, 30, ... }
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
texSize, texSize, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
glReadPixels(0, 0, texSize, texSize, GL_RGBA,
GL_UNSIGNED_BYTE, result);
// *** result теперь такой: {0,0,0,255,0,0,0,255,...}
Как сделать так чтобы содержимое result полностью совпадало с исходной data? Есть ли более оптимальный путь достичь этого же результата, если в дальнейшем я захочу использовать шейдер для работы с буфером?