Опубликован: 02.12.2011 | Доступ: свободный | Студентов: 980 / 117 | Оценка: 5.00 / 4.00 | Длительность: 09:26:00
Специальности: Программист
Теги: .net, open source, opengl
Лекция 13:

Выявление ошибок при работе с библиотекой OpenGL

< Лекция 12 || Лекция 13: 12 || Лекция 14 >
Аннотация: В лекции рассматриваются наиболее часто встречающиеся ошибки при построении изображений с помощью OpenGL и методы их предотвращения и исправления.

Цель лекции: Изучить команду GetError библиотеки OpenGL и познакомится с наиболее часто встречающимися проблемами и вариантами их решения при создании изображений с помощью OpenGL.

При работе с библиотекой OpenGL могут возникать различные ошибки, которые можно условно разделить на несколько групп:

  • ошибки формирования изображения;
  • некорректное использование команд OpenGL;
  • системные ошибки операционной системы.

Далее рассматривается более подробно каждая группа ошибок.

Ошибки формирования изображения

Эта группа ошибок связана с логическими ошибками, которые приводят к некорректному формированию изображения, например:

  • объекты находятся за областью сцены и поэтому не отображаются;
  • освещенность объектов не соответствует ожидаемой, например, из-за неправильных параметров источника света, свойств материала или нормалей;
  • формирование изображения объекта выполняется не правильно из-за ошибки в вычислениях.

В этих случаях выявление ошибки ложится в большей степени на разработчика программы.

Для выявления такого типа ошибок можно использовать некоторые приемы, которые в ряде случаев позволяют упростить поиск причины некорректного формирования изображения. Ниже рассмотрены некоторые типичные ситуации, вызванные такими ошибками, и возможные варианты поиска их причины.

Изображаемый объект не отображается

Причин такой ситуации может быть довольно большое количество.

Прежде всего, необходимо убедиться в том, что объект попадает в область видимости. Если используется перспективная проекция, можно попробовать изменить проекцию на ортогональную и затем увеличить область видимости таким образом, чтобы объект наверняка попал в неё.

Если используется освещение, то его можно попробовать отключить. Необходимо так же проверить, чтобы цвет объектов отличался от цвета фона.

Объект так же может не отображаться из-за его относительно малых размеров по сравнению с размерами отображаемой трехмерной области. Т.е. его размер на проекции может быть менее 1 пиксела. Для выявления этой ситуации можно попробовать увеличить размер объекта.

Сложный объект отображается не корректно

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

Если объект является объемным, то можно изменить режим отображения многоугольников чтобы их грани отображались в виде отрезков или точек.

Объект некорректно освещается

Одной из наиболее часто встречающихся причин является ошибочное направление или размер нормалей. Так как библиотека не предоставляет готовых средств для отображения нормалей, то это можно сделать самостоятельно при построении примитивов. Если необходимо проверить направление нормалей, то можно задать концам отрезков различные цвета. При этом должен быть включен режим аппроксимации цветов (он включен по умолчанию после инициализации библиотеки) и выключено освещение. В этом случае будет выполняться плавный переход цвета от одного конца отрезка к другому.

Некорректное использование процедур и функций OpenGL

К этой группе ошибок относятся, например, такие как: указание неправильных параметров процедуры или функции библиотеки OpenGL, некорректный порядок их вызова.

Для выявления такого типа ошибок библиотека OpenGL реализует команду GetError:

C#:
  ErrorCode GetError();
Object Pascal:
  function glGetError: GLenum

Команда возвращает целочисленный код ошибки. В C# коды ошибок представлены в перечислении ErrorCode, в Object Pascal коды ошибок представлены в виде констант, которые перечислены в модуле Opengl.pas. В таблице 12.1 перечислены наиболее часто встречающиеся на практике коды ошибок команды GetError.

Таблица 12.1. Некоторые значения команды GetError
Описание ошибки Возможные значения
C#, значение перечисления ErrorCode Object Pascal
Ошибка, возникает при недопустимом значении аргумента типа GLEnum.

В Object Pascal обычно в качестве такого значения выступают константы библиотеки. Примером такого типа ошибки является указание значения параметра для процедуры glBegin, которое не соответствует ни одному из допустимых примитивов.

В библиотеке OpenTK (C#) возможность возникновения таких ошибок довольно сильно уменьшена за счет того, что в большинстве случаев допустимые значения параметров представлены в виде перечислений.

InvalidEnum GL_INVALID_ENUM
Ошибка возникает при некорректном задании значения аргумента функции, тип которого отличается от типа GLEnum. InvalidValue GL_INVALID_VALUE
Oшибка информирует о вызове команды библиотеки, которая не может быть выполнена в текущем состоянии библиотеки. Например, когда не соблюдается "парность" команд End и Begin. InvalidOperation GL_INVALID_OPERATION
Эти ошибки возникают при работе с командами, которые используют стеки библиотеки OpenGL. Например, при работе со стеком матриц (команды PushMatrix, PopMatrix), стеком имен (команды PopName, PushName), стеком атрибутов. Ошибка StackOverflow/GL_STACK_OVERFLOW возникает при переполнении стека, ошибка StackUnderflow/GL_STACK_UNDERFLOW – при выходе за нижнюю границу стека.
StackOverflow,
StackUnderflo
GL_STACK_OVERFLOW, GL_STACK_UNDERFLO
Ошибка возникает в ситуации, когда для выполнения операции недостаточно оперативной памяти доступной для библиотеки OpenGL. OutOfMemory GL_OUT_OF_MEMORY
Ошибка информирует о большом размере одной из специальных таблиц OpenGL, например, таблицы цветов. TableTooLargeExt TABLE_TOO_LARGE
Данное значение информирует об успешном выполнении операции. NoError GL_NO_ERROR

Если возникает одна из перечисленных ошибок (значение NoError/GL_NO_ERROR не является кодом ошибки), то команда, вызвавшая её, игнорируется, последующие команды продолжают выполняться.

При возникновении ошибки OutOfMemory/GL_OUT_OF_MEMORY результат выполнения команды не определен, так как эта ошибка связана с отсутствием необходимых ресурсов для выполнения команды.

Библиотека сохраняет код возникшей ошибки, пока её значение не будет считано с помощью команды GetError. Если же после вызова команды библиотеки, вызвавшей ошибку, результат её работы не был проанализирован с помощью команды GetError, то библиотека будет сохранять код этой ошибки, пока она не будет считана с помощью команды GetError. Если при выполнении других команд библиотеки также будут возникать ошибки, то информация о них не будет сохранена библиотекой, так как результат первой ошибки не был проанализирован с помощью команды GetError.

Реализованный в библиотеке механизм обнаружения ошибок с помощью команды GetError предполагает, что должен проводиться анализ результата выполнения каждой команды библиотеки OpenGL. На практике такой вариант анализа возможных ошибок реализуется довольно редко, так как приводит к значительному увеличению количества кода программы. Довольно часто используют вариант, когда команда GetError вызывается не после каждой команды, а после каких-то блоков программы. Для своевременного обнаружения ошибок рекомендуется анализировать результат выполнения команд хотя бы при завершении формирования изображения.

< Лекция 12 || Лекция 13: 12 || Лекция 14 >
Владислав Нагорный
Владислав Нагорный

Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки?

Спасибо!

Лариса Парфенова
Лариса Парфенова

1) Можно ли экстерном получить второе высшее образование "Программная инженерия" ?

2) Трудоустраиваете ли Вы выпускников?

3) Можно ли с Вашим дипломом поступить в аспирантуру?