|
| БЕСПЛАТНАЯ ежедневная online лотерея! Выигрывай каждый день БЕСПЛАТНО! |
|
|
OpenGL Correctness Tips
· Do not count on the error behavior of an OpenGL implementationѕit might change in a future release of OpenGL. For example, OpenGL 1.0 ignores matrix operations invoked between glBegin and glEnd commands, but OpenGL 1.1 might not. OpenGL error semantics may change between upward-compatible revisions.
· Use the projection matrix to collapse all geometry to a single plane. If the modelview matrix is used, OpenGL features that operate in eye coordinates (such as lighting and application-defined clipping planes) might fail. · Do not make extensive changes to a single matrix. For example, do not animate a rotation by continually calling glRotate with an incremental angle. Rather, use glLoadIdentity to initialize the given matrix for each frame, then call glRotate with the desired complete angle for that frame.
· Count on multiple passes through a rendering database to generate the same pixel fragments only if this behavior is guaranteed by the invariance rules established for a compliant OpenGL implementation. Otherwise, a different set of fragments might be generated. · Do not expect errors to be reported while a display list is being defined. The commands within a display list generate errors only when the list is executed. · Place the near frustum plane as far from the viewpoint as possible to optimize the operation of the depth buffer.
· Call glFlush to force all previous OpenGL commands to be executed. Do not count on glGet or glIs to flush the rendering stream. Query commands flush as much of the stream as is required to return valid data but don't guarantee to complete all pending rendering commands. · Turn dithering off when rendering predithered images (for example, when glCopyPixels is called). · Make use of the full range of the accumulation buffer. For example, if accumulating four images, scale each by one-quarter as it's accumulated.
· If exact two-dimensional rasterization is desired, you must carefully specify both the orthographic projection and the vertices of primitives that are to be rasterized. The orthographic projection should be specified with integer coordinates, as shown in the following example:
gluOrtho2D(0, width, 0, height);
where width and height are the dimensions of the viewport. Given this projection matrix, polygon vertices and pixel image positions should be placed at integer coordinates to rasterize predictably. For example, glRecti(0, 0, 1, 1) reliably fills the lower-left pixel of the viewport, and glRasterPos2i(0, 0) reliably positions an unzoomed image at the lower left of the viewport. Point vertices, line vertices, and bitmap positions should be placed at half-integer locations, however. For example, a line drawn from (x (1) , 0.5) to (x (2) , 0.5) will be reliably rendered along the bottom row of pixels int the viewport, and a point drawn at (0.5, 0.5) will reliably fill the same pixel as glRecti(0, 0, 1, 1).
An optimum compromise that allows all primitives to be specified at integer positions, while still ensuring predictable rasterization, is to translate x and y by 0.375, as shown in the following code fragment. Such a translation keeps polygon and pixel image edges safely away from the centers of pixels, while moving line vertices close enough to the pixel centers.
glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity( ); gluOrtho2D(0, width, 0, height); glMatrixMode(GL_MODELVIEW); glLoadIdentity( ); glTranslatef(0.375, 0.375, 0.0); /* render all primitives at integer positions */
· Avoid using negative w vertex coordinates and negative q texture coordinates. OpenGL might not clip such coordinates correctly and might make interpolation errors when shading primitives defined by such coordinates.
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
| Пригласи друзей и счет твоего мобильника всегда будет положительным! |
КОНЦЫ Правильности OpenGL
Не рассчитывать на поведение ошибки OpenGL implementationUit могло измениться в будущем выпуске OpenGL. Например, OpenGL 1.0 игнорирует матричные действия введенные между glBegin и команды glEnd, но OpenGL 1.1 не мог. СЕМАНТИКА ошибки OpenGL может измениться между вверх- совместимыми исправлениями.
Использование матрица прогноза, чтобы рушиться всю геометрию на единственную плоскость. Если матрица modelview использована, характеристики OpenGL, что действовать в координатах глаза (как например, освещение и определившее приложение, вырезать планы), могли потерпеть неудачу. Не делать расширенными изменениями в единственную матрицу. Например, не оживляйте вращение непрерывно вызывая glRotate с пошаговым углом. Предпочтительно, glLoadIdentity использования, чтобы инициализировать данную матрицу для каждого фрейма затем называть glRotate с желаемым полным углом для этого фрейма.
Рассчитывать на кратное проходит через предоставляющую базу данных, чтобы генерировать те же фрагменты пикселя только если это поведение гарантировано правилами инвариантности установленными для уступчивой реализации OpenGL. В противном случае, другая установка фрагментов могла быть сгенерирована. Не ожидать ошибки, которые нужно сообщать тогда как дисплейный список определяется. Команды в пределах дисплейного списка генерируют ошибки только когда список выполнен. Место near frustum плоскость как далеко с точки зрения по возможности, чтобы оптимизировать операцию глубинного буфера.
Вызов glFlush, чтобы заставлять предшествующие команды OpenGL, чтобы быть выполненн. Не рассчитывайте на glGet или glIs, чтобы сбрасывать предоставление потока. Команды Запроса сбрасывают столько потока сколько требуется, чтобы возвращал правильные данные но не гарантировался, чтобы завершать все незаконченное предоставление команд. Поворот dithering при предоставлении predithered образов (например, когда glCopyPixels назван). Использовать целый ряд накопления буферизоваться. Например, при накапливающих четырех образах, масштабируйте каждый одной-четвертью как это быть накопленное.
Если точная двумерная растеризация желательная, Вы должны тщательно определить как орфографический прогноз так и грани примитивов, которые должны rasterized. Орфографический прогноз должен быть определен координатами целого, как показано в следующем примере:
gluOrtho2D(0, ширина, 0, высота);
где ширина и высота - измерения viewport. Данная эта матрица прогноза, граней многоугольника и позиций образа пикселя должны быть установлены в координатах целого на rasterize предсказуемо. Например, glRecti(0, 0, 1, 1), надежно заполняет левый более низкий пиксель viewport, и glRasterPos2i(0, 0), надежно позиционирует unzoomed образ в более низком слева от viewport. Грани Точки, граней строки, и позиции побитового отображения должны быть установлены в половине-целом позиций, тем не менее. Например, строка вытащенная из (x (1) , 0.5), чтобы (x (2) , 0.5), надежно предоставят вдоль нижней колонки пикселей int viewport, и точка сделанные в (0.5, 0.5), надежно заполнит тот же пиксель как glRecti(0, 0, 1, 1).
Оптимальный компромисс, который допускает все примитивы, которые нужно определяться в позициях целого, при все еще обеспечении предсказуемой растеризации, должно переводиться x и y к 0.375, как показано на кодовом фрагменте следующего. Такой перевод держит многоугольник и образ пикселя изменяется благополучно прочь из центров пикселей, при перемещении граней строки закрываться достаточно в центры пикселя.
glViewport(0, 0, Ширина, высота); glMatrixMode(GL_PROJECTION); glLoadIdentity( ); gluOrtho2D(0, ширина, 0, высота); glMatrixMode(GL_MODELVIEW); glLoadIdentity( ); glTranslatef(0.375, 0.375, 0.0); /* предоставляйте все примитивы в позициях целого */
Избегать использовать отрицательные координаты w вершины и отрицательных координат q текстуры. OpenGL НЕ мог вырезать такие координаты правильно и мог сделать интерполяцию ошибками при затенении примитивов определенных такими координатами.
| |
|
|
| |