2012-06-21 4 views
2

Я пытаюсь скопировать из FBO в фреймбуфер окна. Насколько мне известно, фреймбуфер окна имеет 8 бит для каждого из R, G, B и A и имеет буфер глубины (возможно, 24 бит). FBO имеет единственное прикрепление текстуры (формат RGBA8) и без рендеринга.glBlitFramebuffer, вызывающий нарушение доступа

Проблема в том, что когда я пытаюсь разжечь FBO на экране, я получаю нарушение доступа (термин Windows для SIGSEGV). Blit код:

//Earlier: const int screen_rect[4] = {0,0,512,512}; 

glBindFramebuffer(GL_READ_FRAMEBUFFER,fbo->framebuffer); 
glBindFramebuffer(GL_DRAW_FRAMEBUFFER,    0); 
glFinish(); 
//checking GL errors here gives no error 
glBlitFramebuffer(
    screen_rect[0],screen_rect[1],screen_rect[2],screen_rect[3], 
    screen_rect[0],screen_rect[1],screen_rect[2],screen_rect[3], 
    GL_COLOR_BUFFER_BIT, 
    GL_NEAREST //EDIT: I've also tried GL_LINEAR 
); 
glFinish(); 
//never reaches here 
glBindFramebuffer(GL_DRAW_FRAMEBUFFER,0); 
glBindFramebuffer(GL_READ_FRAMEBUFFER,0); 

FBO в это GL_FRAMEBUFFER_COMPLETE_EXT и никаких ошибок GL не происходит ни в одной точке. FBO и оконный фреймбуфер имеют одинаковый размер.

Работает на NVIDIA GeForce 580M GTX с драйвером 301.42 (на сегодняшний день, последний раз).

Любые идеи, почему это может произойти?

[EDIT: Я обнаружил, что проблема не возникает, когда блиттинг из FBO в другой FBO, хотя нет данных, кажется, скопированы]

+0

Вы уверены, что screen_rect переменная все еще указывает на достоверных данных при вызове функции glBlitFramebuffer? –

+0

Это хорошая проверка, но да, я проверял это с помощью отладчика. – imallett

ответ

1

кажется, что эта реализация ВЕСЬМА требовательна команда порядка выходит Я понял, что после обратного проектирования какой-то существующий код. Возможно, есть какая-то тайная причина, по которой они должны быть в таком порядке, но я не знаю, что.

В любом случае, я считаю, что поведение segfaulting является ошибкой в ​​реализации OpenGL от NVIDIA.

Не мудрствуя лукаво, основные команды, по порядку:

GLenum buffers1[] = {GL_BACK}; 
glBindFramebuffer(GL_DRAW_FRAMEBUFFER,0); 
glDrawBuffers(1,buffers1); 

glBindFramebuffer(GL_READ_FRAMEBUFFER,fbo->framebuffer); 
glReadBuffer(GL_COLOR_ATTACHMENT1); 

glBlitFramebuffer(...) 
+0

Я испытал аналогичное поведение на GTX 680 (версия драйвера 331.65), когда я копировал изображение из мультисэмплированного FBO в обычный, но blit не закончил нарушение прав доступа, скорее он скопировал содержимое основного фреймбуфера в FBO который я назвал «GL_DRAW_FRAMEBUFFER». Возможно, что привязка 'GL_FRAMEBUFFER' (возможно,' GL_DRAW_FRAMEBUFFER' обрабатывается одинаково внутренне) заменяет как 'GL_DRAW_FRAMEBUFFER', так и' GL_READ_FRAMEBUFFER', поэтому задавайте вопросы. –

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