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

Текстура

< Лекция 9 || Лекция 10: 123 || Лекция 11 >
Аннотация: В лекции рассматривается создание двухмерных текстур в OpenGL и определение соответствия координат вершин и координат текстуры.

Цель лекции: Рассмотреть создание текстуры из файла формата 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.
< Лекция 9 || Лекция 10: 123 || Лекция 11 >
Владислав Нагорный
Владислав Нагорный

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

Спасибо!

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

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

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

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

 

Андрей Скурихин
Андрей Скурихин
Россия, Санкт-Петербург, Санкт-Петербургский государственный электротехнический университет (ЛЭТИ), 1997