Цель лекции: Изучить команду GetError библиотеки OpenGL и познакомится с наиболее часто встречающимися проблемами и вариантами их решения при создании изображений с помощью OpenGL.
При работе с библиотекой OpenGL могут возникать различные ошибки, которые можно условно разделить на несколько групп:
OpenGL;Далее рассматривается более подробно каждая группа ошибок.
Эта группа ошибок связана с логическими ошибками, которые приводят к некорректному формированию изображения, например:
В этих случаях выявление ошибки ложится в большей степени на разработчика программы.
Для выявления такого типа ошибок можно использовать некоторые приемы, которые в ряде случаев позволяют упростить поиск причины некорректного формирования изображения. Ниже рассмотрены некоторые типичные ситуации, вызванные такими ошибками, и возможные варианты поиска их причины.
Причин такой ситуации может быть довольно большое количество.
Прежде всего, необходимо убедиться в том, что объект попадает в область видимости. Если используется перспективная проекция, можно попробовать изменить проекцию на ортогональную и затем увеличить область видимости таким образом, чтобы объект наверняка попал в неё.
Если используется освещение, то его можно попробовать отключить. Необходимо так же проверить, чтобы цвет объектов отличался от цвета фона.
Объект так же может не отображаться из-за его относительно малых размеров по сравнению с размерами отображаемой трехмерной области. Т.е. его размер на проекции может быть менее 1 пиксела. Для выявления этой ситуации можно попробовать увеличить размер объекта.
Одной из причин может быть ошибка в расчетах расположения вершин примитивов, из которых состоит объект. В ряде случаев такие ошибки становятся более заметными при уменьшении количества примитивов, из которых формируется объект.
Если объект является объемным, то можно изменить режим отображения многоугольников чтобы их грани отображались в виде отрезков или точек.
Одной из наиболее часто встречающихся причин является ошибочное направление или размер нормалей. Так как библиотека не предоставляет готовых средств для отображения нормалей, то это можно сделать самостоятельно при построении примитивов. Если необходимо проверить направление нормалей, то можно задать концам отрезков различные цвета. При этом должен быть включен режим аппроксимации цветов (он включен по умолчанию после инициализации библиотеки) и выключено освещение. В этом случае будет выполняться плавный переход цвета от одного конца отрезка к другому.
К этой группе ошибок относятся, например, такие как: указание неправильных параметров процедуры или функции библиотеки OpenGL, некорректный порядок их вызова.
Для выявления такого типа ошибок библиотека OpenGL реализует команду GetError:
C#: ErrorCode GetError(); Object Pascal: function glGetError: GLenum
Команда возвращает целочисленный код ошибки. В C# коды ошибок представлены в перечислении ErrorCode, в Object Pascal коды ошибок представлены в виде констант, которые перечислены в модуле Opengl.pas. В таблице 12.1 перечислены наиболее часто встречающиеся на практике коды ошибок команды GetError.
| Описание ошибки | Возможные значения | |
|---|---|---|
C#, значение перечисления ErrorCode | Object Pascal | |
Ошибка, возникает при недопустимом значении аргумента типа GLEnum.
В Object Pascal обычно в качестве такого значения выступают константы библиотеки. Примером такого типа ошибки является указание значения параметра для процедуры В библиотеке 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 вызывается не после каждой команды, а после каких-то блоков программы. Для своевременного обнаружения ошибок рекомендуется анализировать результат выполнения команд хотя бы при завершении формирования изображения.
Для выявления ошибок, связанных с некорректным использованием команд OpenGL и их параметров, может использоваться команда GetError.
Для выявления арифметических и логических ошибок в формировании изображения могут использоваться различные приемы: вывод изображения без освещения, использование параллельной проекции вместо перспективной, изменение области вывода изображения и количества примитивов, используемых для формирования каждого моделируемого объекта, изменение режима отображения примитивов, отображение отрезков, показывающих направление и размер нормалей и т.д.
Кроме того, для отладки приложений ), ), программы ).
Задание: На поверхность изображения цилиндра, созданного в упражнении № 1 набора для практики № 2, наложите изображение текстуры, которое хранится на диске в файле формата BMP. Предварительно данный файл необходимо создать в каком-либо графическом редакторе.
Для загрузки изображения текстуры из файла формата BMP можно воспользоваться примерами из лекции 9. Так же потребуется объявить глобальную переменную для хранения информации и текстуре:
C#:
Bitmap bmpTex;
Object Pascal:
var
tex: TGLTexture;
Инициализацию текcтуры можно выполнить в обработчике события формы Load в программе на C# и в обработчике события формы OnCreate в программе на Object Pascal:
C#:
bmpTex = new Bitmap("OGL64x64.bmp");
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMinFilter,
(int)TextureMinFilter.Linear);
GL.TexParameter(TextureTarget.Texture2D, TextureParameterName.TextureMagFilter,
(int)TextureMagFilter.Linear);
GLTexture.LoadTexture(bmpTex);
GL.Enable(EnableCap.Texture2D);
Object Pascal:
LoadTextureFromBMP('OGL64x64.bmp ', tex);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tex.Width, tex.Height,
0, GL_RGB, GL_UNSIGNED_BYTE, @tex.Data[0]);
glEnable(GL_TEXTURE_2D);
В выше приведенном варианте инициализации текстуры выполняется загрузка изображения из файла, определение алгоритмов масштабирования текстуры (TexParameter), определение изображения в качестве текущей текстуры (TexImage2D) и включение режима отображения текстуры (Enable).
Фрагмент программы, формирующий изображение цилиндра, необходимо дополнить заданием координат текстуры для каждой формируемой вершины с помощью команды TexCoord:
C#:
GL.Color3(0.9f, 0.9f, 0.9f);
GL.PolygonMode(MaterialFace.FrontAndBack, mode);
GL.Begin(BeginMode.QuadStrip);
double r = 0.5;
int n = 20;
for (int i = 0; i <= n; ++i)
{
double a = 2 * Math.PI/n * i;
double x = r * Math.Cos(a);
double y = r * Math.Sin(a);
GL.TexCoord2((double)i / n, 1); GL.Vertex3(x, y, -0.5);
GL.TexCoord2((double)i / n, 0); GL.Vertex3(x, y, 0.5);
}
GL.End();
GL.Disable(EnableCap.Texture2D);
Object Pascal:
glColor3f(0.9, 0.9, 0.9);
glPolygonMode(GL_FRONT_AND_BACK, mode);
glBegin(GL_QUAD_STRIP);
r := 0.5;
n := 20;
for i := 0 to n do
begin
a := 2*pi/n * i;
x := r * Cos(a);
y := r * Sin(a);
glTexCoord2f(i/n, 1); glVertex3d(x, y, -0.5);
glTexCoord2f(i/n, 0); glVertex3d(x, y, 0.5);
end;
glEnd;
Пример наложения текстуры на поверхность цилиндра приведен на рис 12.1.
(рис 12.1) Пример наложения текстуры на цилиндр
На поверхность вращения, полученную при выполнении задания из набора для практики № 2, наложите изображение текстуры, которое хранится на диске в файле формата BMP. Предварительно данный файл необходимо создать в каком-либо графическом редакторе.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.