Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки? Спасибо! |
Текстура
Цель лекции: Рассмотреть создание текстуры из файла формата BMP, реализацию команд инициализации текстуры, изменения свойств текстуры и определения координат текстуры на Object Pascal и на C# с использованием библиотеки OpenTK.
Примеры на C# (WinForms) и Object Pascal (Delphi)
Пример № 9.1 Пример демонстрирует наложение нескольких копий текстуры на квадрат.
Пример № 9.2 Пример демонстрирует наложение текстуры на поверхность сферы.
Пример № 9.3 Пример демонстрирует формирование изображения цилиндра с наложением текстуры на его поверхность.
Содержание лекции
Под текстурой обычно понимают растровое изображение, отображаемое на гранях примитивов.
Предварительно содержание текстуры должно быть передано в библиотеку OpenGL. Для этого передается указатель на массив с информацией о текстуре. Информация о текстуре представляет собой построчное представление изображения в формате:
RGB….RGB RGB….RGB RGB….RGB
Где RGB – это красная, зеленая и синяя составляющие цвета каждого пиксела текстуры.
Размер текстуры должен быть кратен степени двойки: 32x32, 32x64, 128x256 и т д. Текстура может быть подготовлена различным образом: может быть сформирована программно или, например, загружена из какого-либо файла.
Использование изображения в формате BMP в качестве текстуры
Одним из наиболее близких форматов к формату текстуры OpenGL является формат хранения графических изображений BMP. Отличие в хранении данных о пикселах между форматом BMP и форматом текстуры OpenGL заключается в различном порядке байт, описывающих составляющие цвета пиксела. В формате BMP данные о каждом пикселе хранятся в порядке: BGR. В формате текстуры OpenGL цветовые характеристики пикселов хранятся в противоположном порядке: RGB.
Загрузка файла BMP в память
Формат файла BMP кроме самого изображения содержит так же общую информацию о нем. Например, такую как, формат изображения (в файле формата BMP изображение может храниться в нескольких разных вариантах), ширину и высоту изображения и др.
В программе на C# для использования изображения в формате BMP в качестве текстуры можно использовать ниже приведенный метод класса ( пример 9.1).
public static void LoadTexture(Bitmap bmp) { BitmapData data = bmp.LockBits( new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadOnly, System.Drawing.Imaging.PixelFormat.Format24bppRgb); GL.TexImage2D(TextureTarget.Texture2D, 0, PixelInternalFormat.Rgb, data.Width, data.Height, 0, OpenTK.Graphics.OpenGL.PixelFormat.Bgr, PixelType.UnsignedByte, data.Scan0); bmp.UnlockBits(data); }Листинг 9.1. Метод класса для использования изображения формата BMP в качестве текстуры OpenGL на C#
В качестве параметра методу передается объект типа Bitmap, в который должно быть загружено изображение формата BMP, например, с помощью следующего фрагмента программы ( пример 9.2):
Bitmap bmpTex; bmpTex = new Bitmap("OGL64x64.bmp");Листинг 9.2. Загрузка файла формата BMP в объект типа Bitmap на C#
В методе LoadTexture сначала вызывается метод LockBits объекта Bitmap, который блокирует объект в системной памяти. Затем вызывается метод GL.TexImage2D, который передает изображение в библиотеку OpenGL в качестве текстуры. В конце метода LoadTexture вызывается метод UnlockBits объекта Bitmap, который разблокирует объект в памяти.
В Object Pascal для использования изображения в формате BMP выполняются аналогичные действия. В листинге 9.3 приведена процедура, выполняющая загрузку изображения из файла формата BMP и его преобразование в формат текстуры OpenGL на языке Object Pascal. Для хранения информации о текстуре используется структура TGLTexture, в котором изображение текстуры хранится в динамическом массиве. Поля Height и Width структуры хранят информацию о высоте и ширине изображения в пикселах. Информация о размере текстуры необходима для инициализации текстуры.
type TGLTexture = record Height: Integer; Width: Integer; Data: array of Byte; end; procedure LoadTextureFromBMP(const AFileName: String; var ATexture: TGLTexture); var i, j: Integer; bmp: TBitmap; begin bmp := TBitmap.Create; try bmp.LoadFromFile(AFileName); // загрузка текстуры из файла ATexture.Height := bmp.Height; ATexture.Width := bmp.Width; SetLength(ATexture.Data, bmp.Width* bmp.Height*3); // заполнение битового массива For i:=0 to bmp.Height-1 do For j:=0 to bmp.Width-1 do begin ATexture.Data[(i*bmp.Width+j)*3+0]:= GetRValue(bmp.Canvas.Pixels[j, i]); ATexture.Data[(i*bmp.Width+j)*3+1]:= GetGValue(bmp.Canvas.Pixels[j, i]); ATexture.Data[(i*bmp.Width+j)*3+2]:= GetBValue(bmp.Canvas.Pixels[j, i]); end; finally bmp.Free; end; end;Листинг 9.3. Процедура загрузки изображения формата BMP и его преобразования в формат текстуры OpenGL на языке Object Pascal
Инициализация текстуры
При формировании изображения используется текущая текстура. Для определения текущей текстуры и её параметров используется команда TexImage2D:
C#: void TexImage2D(TextureTarget target, int level, PixelInternalFormat internalformat, int width, int height, int border, PixelFormat format, PixelType type, IntPtr pixels); Object Pascal: procedure glTexImage2D (target: GLenum; level, components: GLint; width, height: GLsizei; border: GLint; format, _type: GLenum; pixels: Pointer);
Параметры команды:
- target – определяет тип текстуры, параметр должен быть равен значению TextureTarget.Texture2D при использовании библиотеки OpenTK на C# и значению GL_TEXTURE_2D на Object Pascal.
- level – уровень детализации текстуры, значение должно быть равно 0.
- components – определяет количество цветовых компонентов в данных о текстуре.
В C# значения этого параметра определяются перечислением PixelInternalFormat.
В Object Pascal параметр может принимать значения 1,2,3,4 и ряд специальных констант. При использовании команды в листингах 9.2 и 9.3 значение этого параметра равно 3, так как в файле формата BMP для каждого пиксела в массиве хранится три цветовых компонента.
- width – ширина текстуры в пикселах.
- height – высота текстуры в пикселах.
- border – размер "окантовки", значение должно быть равно 0.
- format - формат передаваемых данных о текстуре.
- В C# значения этого параметра определяются перечислением PixelFormat. В Object Pascal параметр может принимать ряд значений, например, GL_RGB, GL_RGBA.
- _type – определяет тип данных, используемый для передачи каждой составляющей цвета. В формате BMP для каждой составляющей цвета используется беззнаковое байтовое значение. Поэтому в C# для этого используется значение PixelType.UnsignedByte, а в Object Pascal –значение GL_UNSIGNED_BYTE.
- pixels - указатель на блок памяти с подготовленным изображением текстуры в формате OpenGL. В Object Pascal при использовании процедуры из листинга 9.3 это должен быть указатель на нулевой элемент динамического массива поля Data структуры TGLTexture.