самый дешевый способ нарисовать полноэкранный квад - PullRequest
2 голосов
/ 25 марта 2010

Мне интересно, есть ли более быстрый (время GPU) способ рисовать полноэкранный квад в OpenGL:

NewList();
PushMatrix();
LoadIdentity();
MatrixMode(PROJECTION);
PushMatrix();
LoadIdentity();
Begin(QUADS);
Vertex(-1,-1,0);  Vertex(1,-1,0);  Vertex(1,1,0);  Vertex(-1,1,0);
End();
PopMatrix();
MatrixMode(MODELVIEW);
PopMatrix();
EndList();

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

Ответы [ 2 ]

1 голос
/ 25 марта 2010

Быстрее где? на процессоре? Объем работы для полноэкранного четырехъядерного процессора незначителен по сравнению с работой, необходимой для работы на графическом процессоре.

Так что в данном случае важнее всего, как правило, оптимизировать сторону графического процессора, и, верите вы этому или нет, есть одна вещь, которая довольно важна. Все известные мне графические процессоры конвертируют четырехугольник в 2 треугольника. Каждый из этих треугольников растеризуется отдельно. Так получилось, что в итоге вы не используете графический процессор в полном объеме, потому что на диагонали между двумя треугольниками графический процессор должен будет работать дважды (это потому, что графический процессор работает обычно на 16 или 32 пикселях одновременно, в форме квадрат или прямоугольник. Минимум 4, что уже делает дополнительную работу).

Как избежать этой дополнительной работы на грани? Нарисуйте один треугольник над всей областью и ножницами в области, в которую хотите нарисовать.

Что-то вроде (хотя я обычно иду от 0 до 1, а не от -1 до 1 ...):

glBegin(GL_TRIANGLES);
glVertex(-1,-1,0);  glVertex(3,-1,0);  Vertex(-1,3,0);
glEnd();
0 голосов
/ 25 марта 2010

Если вы просто хотите нарисовать весь видовой экран указанным цветом, вы можете использовать glClear:

glClearColor(/* specify color here*/);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

Изменить: с тем, что вы добавили, очевидно, что не будет работать. Это оставляет немного вопроса: под «самым быстрым» вы подразумеваете самый быстрый для написания (то есть вы хотите более простой код) или самый быстрый для выполнения?

Простота

Если вы хотите простоты, glDrawPixels должно работать:

glRasterPos2i(-1,-1);
glDrawPixels(width, height, GL_RGBA, GL_UNSIGNED_BYTE, image);

где 'image' будет просто блоком данных, инициализированным желаемым цветом.

Скорость

Чтобы повысить скорость выполнения, вы можете:

  1. поместить вызовы в список отображения и выполнить его при необходимости. Насколько это поможет, сильно зависит от оборудования и драйвера. Более полезно с nVidia, чем ATI, например.
  2. Используйте текстуру. Аналогично glDrawPixels, но сохранение текстуры в памяти текстур может немного увеличить скорость.
  3. Теоретически, вы бы также набрали некоторую скорость, позвонив glDrawArrays вместо использования glBegin / glVertex / glend. В действительности, учитывая, что у вас есть только четыре вершины, это, вероятно, не будет иметь достаточного значения, чтобы о них заботиться.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...