|
Подскажите, пожалуйста, планируете ли вы возобновление программ высшего образования? Если да, есть ли какие-то примерные сроки? Спасибо! |
Текстура
Цель лекции: Рассмотреть создание текстуры из файла формата 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.