Я запрограммировал небольшой raytracer на C ++,
и хочу показать изображение с трассировкой лучей в окне.
Я пытался с помощью pixel buffer object
в opengl
,
затем отобразите буфер в память и поочередно управляйте пикселями,
но при разрешении экрана 1920×1080 я получаю только 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);
Проверьте обход памяти, если вы используете циклы. Вы должны обходить свой буфер в правильном порядке, в противном случае у вас может быть потеря кэша на каждой итерации. Если вы используете вложенные циклы, иногда вам нужно только изменить порядок итераций x / y.
Также не читайте данные из графической памяти. Это имеет тенденцию быть медленным. Пишите только в ПБО.
Это похоже на проблему синхронизации. Я не уверен, что вам нужно отображать pbo на каждом кадре. Проверьте эту ссылку на OpenGL Pixel Buffer Object (PBO). Есть также обходной путь для киосков, которые могли бы улучшить вещи
Других решений пока нет …