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

Я запрограммировал небольшой 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);

1

Решение

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

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

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

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]