OpenGL правильности советов
Выполните проверку ошибок часто. Звоните glGetError (), по крайней мере один раз каждый раз становится ареной внести определенные условия, ошибку заметили.
Не рассчитывать на ошибку поведение OpenGL осуществление, - она может измениться в последующих версиях OpenGL. Например, OpenGL 1,1 игнорирует матричных операций ссылаться между glBegin () и glEnd () команд, но в будущем, возможно, не версия. Иначе говоря, OpenGL ошибка семантики между могут измениться в сторону повышения-совместимых изменений.
Если нужно, чтобы свернуть все в геометрию одной плоскости, использование проецирования матрицы. Если modelview матрицы используется, OpenGL функции, которые действуют в глаза координат (например, освещения и применения определенных обрезание самолеты) могут потерпеть неудачу.
Не делайте значительные изменения в одной матрицы. Например, не живой ротации постоянно призывая glRotate * () с дополнительными угол. Скорее, используйте glLoadIdentity () для инициализации данной матрицы для каждого кадра, а затем слово glRotate * () с желаемой полный угол для этого кадра.
Рассчитывайте на несколько проходит через оказание данных для генерации пикселя же фрагменты, если только такое поведение гарантирует инвариантности правил, установленных для совместимых OpenGL реализации. (См. Приложение H подробности об инвариантности правил.) Противном случае, разные наборы фрагментов могут быть сгенерированы.
Не ожидайте ошибок представлять отчетность в то время как отображать список в настоящее время определена. Команды в списке отображения порождают ошибки только тогда, когда список казнен.
Место возле frustum плоскости, что и вдали от точки зрения, как можно оптимизировать функционирование глубина буфера.
Звоните glFlush () в силу все предыдущие OpenGL команды должен быть казнен. Не рассчитывать на glGet * () или glIs * () для флеш делает поток. Запрос команды флеш как большая часть потока, как это требуется, чтобы вернуться в силе данных, но не гарантируют завершить все до оказания команд.
Поверните dithering покинуть при оказании predithered изображений (например, когда glCopyPixels () вызывается).
Используйте весь спектр накопления буфера. Например, если в накопительных четыре изображения, масштаб каждого на одну четверть, как это накоплен.
Если точные двумерные rasterization это нужно, Вы должны тщательно определить как orthographic проекции и вершин примитивов, которые должны быть rasterized. Orthographic прогноз должен быть указан с целыми координатами, как показано в следующем примере:
gluOrtho2D (0, ширину 0, высота), где ширина и высота размеров области просмотра. С учетом этого прогноза матрица, полигонов и вершин пиксел изображения позиций должна находиться в целое координаты rasterize предсказуемо. Например, glRecti (0, 0, 1, 1) надежно заполняет левого нижнего пиксела от просмотра, и glRasterPos2i (0, 0) надежно позиций unzoomed изображение в нижней левой части области просмотра. Точка вершин, линия вершин, и растровые позиции должны быть поставлены на половину-целое число мест, однако. Например, строка из (x1, 0,5) до (x2, 0,5), будут надежно оказанные вдоль нижней точек в области просмотра, а также обращено на точку (0,5, 0,5) будет достоверно заполнить же пиксела, как glRecti (0, 0, 1, 1).
Оптимальный компромисс, который позволяет всем примитивов, который будет определен на целое число позиций, в то же время обеспечивая предсказуемый rasterization, заключается в том, чтобы перевести х и 0,375 в год, как это показано в следующий фрагмент кода. Такой перевод держит полигона и пикселя изображения краев спокойно вдали от центров пикселей, в то время перехода линии вершин достаточно близко к пиксельных центров.
glViewport (0, 0, ширина, высота); glMatrixMode (GL_PROJECTION); glLoadIdentity (); gluOrtho2D (0, ширину 0, высота); glMatrixMode (GL_MODELVIEW); glLoadIdentity (); glTranslatef (0,375, 0,375, 0,0); / * Сделать все примитивы в целых позиции * /
Избегайте использования отрицательные ж вершинных координат и негативные q текстуры координат. OpenGL, возможно, не такой клип с координатами правильно и может привести к тому, интерполяция ошибки при закраске примитивов определяется такими координатами.
Не думайте, точность операций, основанных на данных типа параметров для OpenGL команд. Например, если вы используете glRotated (), вы не думайте, что геометрической обработки трубопровода работает с двойной точности с плавающей точкой. Не исключено, что параметры glRotated () преобразуются в различных типа данных перед обработкой.
OpenGL производительность советы
Используйте glColorMaterial (), когда только один материал собственности в настоящее время разнообразные быстро (на каждой вершины, например). Используйте glMaterial () для изменения нечасто, или когда более чем одного материала собственности в настоящее время разнообразные быстро.
Используйте glLoadIdentity () для инициализации матрицы, а не погрузки свой собственный экземпляр идентичность матрицы.
Использование матрицы конкретных вызовов, например, glRotate * (), glTranslate * (), и glScale * (), чем написание собственного вращения, перевод, или масштаб матриц и призывая glMultMatrix ().
Использование запроса функций, когда ваше приложение требует только несколько значений состояния для своих расчетов. Если ваше приложение требует нескольких значений состояния из одной и той же группы атрибутов, используйте glPushAttrib () и glPopAttrib (), чтобы сохранить и восстановить их.
Использование отображения списков включает потенциально дорогостоящие государственные изменения.
Использование отображения списков включает оказание требует жестких объектов, которые будет обращено неоднократно.
Использование текстур на объекты происходят текстуры данных. Место все glTexImage * () звонки (в том числе mipmaps) должна полностью указать текстуру и связанных glTexParameter * () звонки (которые определяют свойства текстуры) в текстуру объекта. Bind эту текстуру объекта для выбора текстуры.
Если ситуация позволяет ей использовать гл TexSubImage * () для замены всех или части существующих текстуру изображения, а не более дорогостоящих операций удаления и создания нового облика всего.
Если ваша реализация поддерживает OpenGL высокопроизводительных рабочих набор текстур резидентов, постараемся сделать все ваши текстуры резидентов, то есть сделать их вписываются в высокопроизводительных текстуры памяти. В случае необходимости уменьшения размеров или внутренний формат вашего разрешения текстур до тех пор, пока все они вписываются в памяти. Если такое снижение создает невыносимо нечеткой текстурированных объектов, можно привести некоторые текстуры с низким приоритетом, который будет, Когда начинается серьезная заварушка, оставьте их из рабочего набора.
Используйте оценке, даже для простых поверхности tessellations к минимуму сетевой трафик в клиент-серверных сред.
Представьте единицу длины нормалей, если можно сделать это и избежать накладные GL_NORMALIZE. Избегайте использования glScale * () при выполнении освещения, поскольку он почти всегда требует, чтобы иметь возможность GL_NORMALIZE.
Установить glShadeModel () для GL_FLAT плавного затенения, если это не требуется.
Использование единого glClear () вызова на фрейм, если это возможно. Не используйте glClear () для очистки небольших субрегионах буферами, поэтому используйте его только для полного или почти полного очищает.
Использование одного звонка на glBegin (GL_TRIANGLES) использовать несколько независимых треугольников, а не требующие glBegin (GL_TRIANGLES) несколько раз, или позвонив glBegin (GL_POLYGON). Даже если только один треугольник, который можно сделать, используйте GL_TRIANGLES, а не GL_POLYGON. Использование одного звонка на glBegin (GL_QUADS) в том же порядке, а не требующие glBegin (GL_POLYGON) повторно. Кроме того, использование одного звонка на glBegin (GL_LINES) использовать несколько независимых отрезков, а не требующие glBegin (GL_LINES) несколько раз.
Некоторые реализации OpenGL выгоды от хранения вершинных данных в вершинных массивов. Использование вершинных массивах уменьшает накладные расходы вызова функции. В некоторых реализациях может повысить производительность, пакетной обработки или повторного использования обработанных вершин.
В целом, использование векторных форм команды precomputed передачи данных и использования скалярной формы команд для передачи ценностей, которые вычисляются возле время вызова.
Избегать излишней режиме изменения, такие как установление цвет же значение в диапазоне от каждой вершине плоского затенены многоугольник.
Не забудьте отключить дороже rasterization и за-фрагмент операций при взятии или копирования изображений. OpenGL будет даже применять текстуры на пиксел изображения, если попросят!
Если абсолютно необходимо, избежать различных передних и задних полигон режимах.
<A Name=name3>
GLX Советы
Используйте glXWaitGL () вместо glFinish (), чтобы заставить X делает команды для оказания последующей GL команд.
Кроме того, используйте glXWaitX (), а не XSync (), чтобы заставить GL делает команды для последующей X оказания команд.
Будьте осторожны при использовании glXChooseVisual (), потому что логическое выбор подбираются точно. Поскольку некоторые реализаций не будет экспортировать изображения со всеми сочетаниями логическое возможностями, вы должны позвонить glXChooseVisual () несколько раз с разными булевы значения, прежде чем бросить. Например, если ни один буферный-визуальное с требуемыми характеристиками можно ознакомиться, проверить, дважды буферизованные визуальный с теми же возможностями. Может быть, и она проста в использовании



Reply With Quote



