читать пиксели из заднего буфера - PullRequest
2 голосов
/ 22 января 2012

Я хочу прочитать пиксели из заднего буфера.Но все, что я получаю до сих пор, это черный экран (чистый цвет).

Дело в том, что мне не нужно окно для перенасыщения, чтобы рисовать.Когда у меня есть информация о пикселях, я передаю ее другой программе, которая нарисует для меня изображение.

Моя функция инициализации выглядит следующим образом:

// No main function, so no real argv argc
char fakeParam[] = "nothing"; 
char *fakeargv[] = { fakeParam, NULL }; 
int fakeargc = 1; 

glutInit( &fakeargc, fakeargv );
GLenum err = glewInit();

if (GLEW_OK != err)
{
    MessageBoxA(NULL, "Failed to initialize OpenGL", "ERROR", NULL);
}
else
{
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_DEPTH_TEST);

    // Not sure if this call is needed since i don't use a glut window to render too..
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

}

Затем в моей функции рендеринга яdo:

void DisplayFunc(void)
{
  /* Clear the buffer, clear the matrix */
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glLoadIdentity();

  // TEAPOT
  glTranslatef(0.0f, 0.0f, -5.0f); // Translate back 5 units
  glRotatef(rotation_degree, 1.0f, 1.0f, 0.0f); // Rotate according to our rotation_degree value

  glFrontFace(GL_CW);
  glutSolidTeapot(1.0f); // Render a teapot
  glFrontFace(GL_CCW);

  glReadBuffer(GL_BACK);
  glReadPixels(0, 0, (GLsizei)1024, (GLsizei)768, GL_RGB, GL_UNSIGNED_BYTE, pixels);

  int r = glGetError();
}

Это в основном все, что я делаю.В конце последней функции я пытаюсь прочитать все пиксели.Но на выходе просто чёрное изображение.glGetError () не выдает никаких ошибок.

Кто-нибудь знает, в чем может быть проблема ... ???

Ответы [ 2 ]

4 голосов
/ 22 января 2012

Я хочу прочитать пиксели из заднего буфера. Но все, что я пока получаю, это черный экран (чистый цвет).

Дело в том, что мне не нужно окно перенасыщения, чтобы рисовать. Как только у меня есть информация о пикселях, я передаю ее другой программе, которая нарисует для меня изображение.

Это не работает так. Backbuffer - это не какая-то область рендеринга вне экрана, это часть экранного окна. На самом деле, концепция двойного буфера имеет смысл только для экранных окон. Каждый пиксель окна с двойной буферизацией имеет два значения цвета, но только одну глубину, трафарет и т. Д .; при замене буфера меняются только указатель на заднюю и переднюю пиксельную плоскости. Но поскольку мы все еще говорим об окне, при растеризации все фрагменты проходят проверку владения пикселями, то есть проверяются, действительно ли они видны на экране. Если нет, они не отображаются.

Но ваши проблемы идут дальше: вы даже не создаете окно, поэтому у вас вообще нет контекста OpenGL. Ваш вызов команд OpenGL не имеет никакого эффекта. glReadPixels ничего вам не возвращает, потому что читать нечего.

Плохая новость заключается в том, что единственный способ получить контекст с GLUT - создать окно. Хорошая новость в том, что вам не нужно использовать GLUT . Люди, почему бы вам не получить это: GLUT не является частью OpenGL, это быстрый и грязный фреймворк для написания небольших учебных пособий, ничего более.

То, что вы хотите, это либо:

  • не окно, а PBuffer , то есть отрисовка за пределами экрана, которая не прошла тесты владения пикселями.

или

  • Скрытое окно с созданным контекстом OpenGL, и в этом контексте Объект буфера кадра для цели рендеринга за пределами экрана.
0 голосов
/ 22 января 2012

Попробуйте позвонить glFlush до glReadPixels.

Кроме того, где вы устанавливаете размер окна?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...