2010-03-25 3 views
2

Я интересно, если есть более быстрый (время 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(); 

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

+0

Ни одна из функций вы называемые здесь являетесь OpenGL функции. Возможно, вы имеете в виду префикс «gl»? –

+2

Это своего рода псевдокод –

ответ

1

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

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

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

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

glBegin(GL_TRIANGLES); 
glVertex(-1,-1,0); glVertex(3,-1,0); Vertex(-1,3,0); 
glEnd(); 
+0

Спасибо, но каково влияние производительности GPU, если треугольник больше, чем область просмотра? –

+0

@Soubok: одна из двух вещей, либо она обрезается, и вы вернулись на круги своя (потому что обрезка будет генерировать больше треугольников), или она находится внутри защитного диапазона GPU, а дополнительные пиксели просто не растрируются. Охрана-группы огромны в эти дни, поэтому этот размер 2x обычно хорош. – Bahbar

0

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

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

Edit: с тем, что вы добавили, это очевидно, что не будет работать. Это оставляет несколько вопросов: «самым быстрым» вы считаете, что лучше всего писать (т. Е. Вам нужен более простой код) или быстрее всего выполнить?

Простота

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

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

где «образ» будет только блок данных инициализируется в желаемый цвет.

Скорость

Для повышения скорости выполнения, вы можете:

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

за ответ. Я просто добавил небольшую точность к вопросу: пиксели будут фильтроваться буфером трафарета. –

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