2012-01-22 2 views
2

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

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

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

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

} 

Тогда в моей визуализации функции я сделать:

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() не дает никаких ошибок.

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

+0

Лучше всего разместить полную программу. если вы визуализируете окно, вы видите изображение? –

ответ

4

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

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

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

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

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

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

  • не окно, а пиксельного буфер, т.е. вне экрана вытяжки, который не прошел испытания собственности пикселей.

или

  • Скрытое окно с контекстом OpenGL, созданный на ней, и в этом контексте Frame Buffer Object для выключенного экрана рендеринга цели.
+0

Спасибо, я понимаю проблему сейчас. Я также просто переключился на GLFW, который не нуждается в glutMainLoop. Это тоже вещь, которая мешала мне. Я также проверю вещь PBuffer, возможно, это то, на что я смотрю. – w00

+0

@ w00: Я не думаю, что GLFW - это то, что вы хотите. Вам все равно нужно открыть (видимое) окно с помощью GLFW, чтобы получить контекст. У вас, вероятно, не будет выбора, кроме как напрямую обращаться к API нижнего уровня, то есть к WGL или GLX. Создание чистого PBuffer с WGL - это немного tedios. С GLX нет никакой разницы в сложности между созданием окна или PBuffer. Какую ОС вы планируете? Если это тот, который использует X11/GLX (Linux, FreeBSD), то я готов использовать автономный код создания PBuffer, который я мог бы вам дать. – datenwolf

0

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

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

+0

Это не сработает, поскольку у него даже нет контекста. – datenwolf

+0

@ datenwolf: Тогда как НИЧЕГО работало? Я сам не использую GLUT, я думал, что 'g; utInitDisplayMode' собирался правильно настроить файл. –

Смежные вопросы