2013-09-07 5 views
1

Я запрограммировал немного raytracer в C++,
и хочу показать изображение в окне.Самый быстрый способ установить каждый пиксель

Я попытался с помощью pixel buffer object в opengl,
затем отобразить буфер в памяти и манипулировать пикселей один за другим,
но в полноэкранном режиме разрешение 1920х1080, я получаю только 4 fps
без Raytracing и без изменения цвета пикселей
только отображение и размена!

, так что я в основном ищу самый быстрый способ отображения изображения в виде растрового изображения в окне.

я сейчас делаю так:

glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, pbo); 
glBufferDataARB(GL_PIXEL_UNPACK_BUFFER_ARB, width * height * 4, 0, GL_STREAM_DRAW_ARB); 
if (pixels = (uint*)glMapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, GL_WRITE_ONLY_ARB)) 
{ 
    //modify pixels 
    glUnmapBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB); 
} 
else 
    return; 


//copy from pbo to texture 
glBindTexture(GL_TEXTURE_2D, pbo_texture); 
glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, pbo); 
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GL_BGRA, GL_UNSIGNED_BYTE, 0); 

glEnable(GL_TEXTURE_2D); 

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 

//draw image 
glColor4f(1.0, 1.0, 1.0, 1.0); 
glBindTexture(GL_TEXTURE_2D, pbo_texture); 
glBegin(GL_QUADS); 
    glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, -1.0, 0.0); 
    glTexCoord2f(1.0, 1.0); glVertex3f(1.0, -1.0, 0.0); 
    glTexCoord2f(1.0, 0.0); glVertex3f(1.0, 1.0, 0.0); 
    glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, 1.0, 0.0); 
glEnd(); 

glutSwapBuffers(); 

glBindBufferARB(GL_PIXEL_UNPACK_BUFFER_ARB, 0); 
glBindTexture(GL_TEXTURE_2D, 0); 
+0

Не кажется ли вам, что трамвайчик является узким местом здесь>? –

+0

как я сказал, я получаю 4fps без raytracing ... только отображение буфера и unmapping – bricklore

+0

Звук странный. Поместите код, как вы это делаете. –

ответ

6

Проверь обход памяти, если вы используете петлю. Вы должны пройти свой буфер в правильном порядке, иначе вы можете пропустить кеш на каждой итерации. Если вы используете вложенные циклы, иногда вам нужно только переключить порядок итерации x/y.

Кроме того, не читайте данные из графической памяти. Он имеет тенденцию быть медленным. Только пишите в PBO.

Это похоже на проблему с синхронизацией. Я не уверен, что вам нужно отображать pbo в каждом кадре. Проверьте эту ссылку на OpenGL Pixel Buffer Object (PBO). Есть также обходной путь для киосков, которые могли бы улучшить ситуацию.

+1

Это должен быть комментарий. Основываясь на его текущем вопросе, невозможно понять, в чем проблема. –

+0

Я добавил код – bricklore

+0

получил его, я изменил порядок итераций цикла и теперь он работает, спасибо! – bricklore

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