самый быстрый способ установить каждый пиксель

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

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

поэтому я в основном ищу самый быстрый способ отобразить изображение с трассировкой лучей в окне.

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

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

person bricklore    schedule 07.09.2013    source источник
comment
Вам не кажется, что трассировщик лучей здесь является узким местом ›?   -  person Michael IV    schedule 07.09.2013
comment
как я уже сказал, я получаю 4 кадра в секунду без трассировки лучей ... только буфер отображения и отключение отображения   -  person bricklore    schedule 07.09.2013
comment
Звучит странно. Ставь код как ты это делаешь.   -  person Michael IV    schedule 07.09.2013
comment
PBO наиболее полезны, если вы сопоставляете их, изменяете данные, отменяете сопоставление, а затем делаете что-то НЕ СВЯЗАННОЕ с OpenGL. Идея в том, что вам не нужно останавливать конвейер и синхронизировать GPU и CPU; Передача данных DMA может происходить, пока ваше приложение использует CPU для чего-то другого. Судя по вашему странному названию этого вопроса, glClear (...) - это самый быстрый способ установить каждый пиксель :)   -  person Andon M. Coleman    schedule 08.09.2013


Ответы (1)


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

Также не считывайте данные из графической памяти. Обычно это происходит медленно. Только пишите в ПБО.

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

person raggnic    schedule 07.09.2013
comment
Это должен быть комментарий. Судя по его текущему вопросу, невозможно понять, в чем проблема. - person Michael IV; 07.09.2013
comment
понял, я изменил порядок итерации цикла и теперь он работает, спасибо! - person bricklore; 07.09.2013