Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки? Спасибо! |
Выявление ошибок при работе с библиотекой OpenGL
Краткие итоги
Для выявления ошибок, связанных с некорректным использованием команд OpenGL и их параметров, может использоваться команда GetError.
Для выявления арифметических и логических ошибок в формировании изображения могут использоваться различные приемы: вывод изображения без освещения, использование параллельной проекции вместо перспективной, изменение области вывода изображения и количества примитивов, используемых для формирования каждого моделируемого объекта, изменение режима отображения примитивов, отображение отрезков, показывающих направление и размер нормалей и т.д.
Кроме того, для отладки приложений OpenGL могут использоваться дополнительные инструменты, такие как: GLIntercept ( http://glintercept.nutty.org), OpenGL debugging utility ( http://www.4crawler.com/Developer/VisualWorkstation/OpenGLdebug/index.shtml), программы GLExpert и DEBugger, входящие в состав NVPerfKit ( http://developer.nvidia.com/nvidia-perfkit).
Упражнения. Текстура
Пример выполнения задания
Задание: На поверхность изображения цилиндра, созданного в упражнении № 1 набора для практики № 2, наложите изображение текстуры, которое хранится на диске в файле формата BMP. Предварительно данный файл необходимо создать в каком-либо графическом редакторе.
Выполнение задания
Для загрузки изображения текстуры из файла формата BMP можно воспользоваться примерами из "Текстура" . Так же потребуется объявить глобальную переменную для хранения информации и текстуре:
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.
Задание
На поверхность вращения, полученную при выполнении задания из набора для практики № 2, наложите изображение текстуры, которое хранится на диске в файле формата BMP. Предварительно данный файл необходимо создать в каком-либо графическом редакторе.