снимок экрана с использованием openGL и / или X11

Я пытаюсь сделать снимок экрана или окна. Пробовал использовать функции от X11 и работает нормально. Проблема в том, что получение пикселей из XImage занимает много времени. Затем я попытался найти ответы о том, как это сделать с помощью openGL. Вот что у меня:

#include <stdlib.h>
#include <stdio.h>
#include <cstdio>
#include <GL/glut.h>
#include <GL/gl.h>
#include <GL/glx.h>
#include <X11/Xlib.h>


int main(int argc, char **argv)
{

int width=1200;
int height=800; 
//_____________________________----
 Display *dpy;
  Window root;
  GLint att[] = { GLX_RGBA, GLX_DEPTH_SIZE, 24, GLX_DOUBLEBUFFER, None };
  XVisualInfo *vi;
  GLXContext glc;

  dpy = XOpenDisplay(NULL);

  if ( !dpy ) {
    printf("\n\tcannot connect to X server\n\n");
    exit(0);
  }

  root = DefaultRootWindow(dpy);
  vi = glXChooseVisual(dpy, 0, att);

  if (!vi) {
    printf("\n\tno appropriate visual found\n\n");
    exit(0);
  }

glXMakeCurrent(dpy, root, glc);
  glc = glXCreateContext(dpy, vi, NULL, GL_TRUE);


  printf("vendor: %s\n", (const char*)glGetString(GL_VENDOR));

//____________________________________________
glXMakeCurrent(dpy, root, glc);

glEnable(GL_DEPTH_TEST); 
GLubyte* pixelBuffer = new GLubyte[sizeof(GLubyte)*width*height*3*3];

glReadBuffer(GL_FRONT); 

GLint ReadBuffer;
glGetIntegerv(GL_READ_BUFFER,&ReadBuffer);
glPixelStorei(GL_READ_BUFFER,GL_RGB);

GLint PackAlignment;
glGetIntegerv(GL_PACK_ALIGNMENT,&PackAlignment); 
glPixelStorei(GL_PACK_ALIGNMENT,1);

glReadPixels(0, 0, width, height, GL_RGB, GL_UNSIGNED_INT, pixelBuffer);

int i;

for (i=0;i<100;i++) printf("%u\n",((unsigned int *)pixelBuffer)[i]);



return 0;
}

когда я запускаю программу, она возвращает ошибку: X Ошибка неудачного запроса: BadAccess (попытка доступа к частному ресурсу запрещена) Основной код операции неудачного запроса: 199 () Незначительный код операции неудачного запроса: 26 Серийный номер неудавшегося запроса: 20 Текущий серийный номер в потоке вывода: 20

, если я прокомментирую строку с помощью glXMakeCurrent (dpy, root, glc); перед glc = glXCreateContext (dpy, vi, NULL, GL_TRUE); он не возвращает ошибок, но все пиксели равны 0.

Как мне решить эту проблему? Я новичок в openGL и, возможно, мне здесь не хватает чего-то важного. Может быть, существует и другой способ получения пикселей с экрана или конкретного окна?

8
задан genpfault 19 August 2012 в 20:53
поделиться