- •Лекция 1 Основные понятия OpenGl
- •1.2 Однородные координаты и матрицы
- •1.3 Поворот точки вокруг прямой заданной точкой а(a,b,c) и направляющим вектором e(l,m,n), , на угол φ.
- •1.4 Система координат
- •1.5 Вершины
- •Лекция 2 Освещение объектов
- •2.1Основные понятия
- •2.2 Задание цвета объекта
- •2.3.1 Свойства диффузного отражения
- •2.3.2 Свойства зеркального отражения
- •Лекция 3
- •3.1 Контекст воспроизведения
- •2.3 Освещение объектов
- •3.2 Стандартные функции библиотеки OpenGl
- •3.3 Функции библиотеки glu
- •3.4 Рекомендации по созданию графических приложений
- •Лекция 4
- •Свойства материалов
- •Установка источников света
- •Модель освещения
- •Смешение цветов
- •4.5 Задание теста глубины
- •Лекция 5 Наложение текстуры на объект
- •Задание параметров текстуры
- •Задание параметров текстуры
- •Взаимодействие текстуры с объектом
- •Привязка координат текстуры к объекту
- •Подготовка текстуры из bmp файла, для случая, когда размеры файла известны
- •Пример инициализации двухмерной текстуры
- •Лекция 6. Буфер трафарета
- •6.1 Тест трафарета
- •6.2 Логические операции с графическими объектами
- •6.2.1 Описание метода вычитания графических объектов
- •Лекция 7. Сплайновые поверхности
- •7.1 Кривые Безье
- •7.2 Отображение кривых Безье в OpenGl
- •7.3 Отображение поверхностей Безье в OpenGl
- •Лекция 8. Выбор графических объектов на экране
- •8.1 Идея метода
- •Лекция 9. Экспорт трехмерных изображений из 3d Studio max
- •9.1 Формат файла gms
- •9.2 Импортирование изображений объектов в программу
- •9.3 Загрузка файла формата gms в Delphi
- •Лекция 10 Вспомогательные функции
- •10.1.Работа с таймером
- •10.2 Обработка нажатия клавиши
- •10.3 Вывод текста на экран
- •Литература
Привязка координат текстуры к объекту
В OpenGL привязку текстуры к объекту можно выполнить разными способами. Один из них заключается в явной привязки координат текстуры к соответствующим вершинам четырехугольника поверхности объекта. Этот способ реализуется командой
void glTexCoord[1 2 3 4][s i f d] (type coord);
void glTexCoord[1 2 3 4][s i f d]v (type* coord);
glTexCoord1 ассоциирует координаты со значениями текстуры (s,0,0,1).
glTexCoord2 ассоциирует координаты со значениями текстуры (s,t,0,1).
glTexCoord3 ассоциирует координаты со значениями текстуры (s,t,r,1).
glTexCoord4 ассоциирует координаты со значениями текстуры (s,t,r,a).
t
y
z
s x
(0,1) (1,1) (1,1,0)
(0,0) (1,0) (-1,-1,0)
Например.
CtextureView.BuildCube(Glfload size);
begin
glNewList(cube,GL_COMPILE);
glBegin(GL_QUAD_STRIP);
glTexCoord2d (0,size); glVertex3f(-1,1,1); //1
glTexCoord2d (0,0); glVertex3f(-1,-1,1); //2
glTexCoord2d (size,size); glVertex3f(1,1,1); //3
glTexCoord2d (size,0); glVertex3f(1,-1,1); //4
glTexCoord2d (0,size); glVertex3f(-1,1,-1); //5
glTexCoord2d (0,0); glVertex3f(-1,-1,-1); //6
glTexCoord2d (size,size); glVertex3f(1,1,-1); //7
glTexCoord2d (size,0); glVertex3f(1,-1,-1); //8
glEnd;
. . .
glEndList;
end;
Для наложения текстуры на сложные объекты (например сферу) можно воспользоваться функциям из библиотеки GLU32.LIB, в которой реализована поддержка построения дисков, цилиндров, сфер и многих других гладких объектов.
Пример наложения текстуры на сферу.
В процедуре Init
Quadric := gluNewQuadric; // Создаем объект
gluQuadricTexture (Quadric, TRUE); // Разрешаем наложение текстуры
// Задаем параметры
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glEnable(GL_TEXTURE_2D);
. . .
// В процедуре View вызываем функцию построения списка изображения
glNewList (sphere, GL_COMPILE);
PrepareImage ('..\earth.bmp'); // процедура подготовки текстуры
gluSphere (Quadric, 1.0, 24, 24);
glEndList;
{===================================================}
Подготовка текстуры.
procedure TfrmGL.PrepareImage(bmap: string);
type
PPixelArray = ^TPixelArray;
TPixelArray = array [0..0] of Byte;
var
Bitmap : TBitmap;
Data, DataA : PPixelArray; // образ текстуры, размер заранее не определен
BMInfo : TBitmapInfo; // заголовок файла
I, ImageSize : Integer; // вспомогательные переменные
Temp : Byte; // для перестановки переменных
MemDC : HDC; // вспомогательный идентификатор
begin
Bitmap := TBitmap.Create;
Bitmap.LoadFromFile (bmap); // считываем образ из файла
with BMinfo.bmiHeader do begin
FillChar (BMInfo, SizeOf(BMInfo), 0); // считываем заголовок
biSize := sizeof (TBitmapInfoHeader);
biBitCount := 24;
biWidth := Bitmap.Width;
biHeight := Bitmap.Height;
ImageSize := biWidth * biHeight;
biPlanes := 1;
biCompression := BI_RGB;
MemDC := CreateCompatibleDC (0);
GetMem (Data, ImageSize * 3);
GetMem (DataA, ImageSize * 4); // создаем динамический мааив
try
GetDIBits (MemDC, Bitmap.Handle, 0, biHeight, Data, //считываем
BMInfo, DIB_RGB_COLORS); //в DIB форматрастр
// битового массива
For I := 0 to ImageSize - 1 do begin // переставляем цвета
Temp := Data [I * 3];
Data [I * 3] := Data [I * 3 + 2];
Data [I * 3 + 2] := Temp;
end;
For I := 0 to ImageSize - 1 do begin
DataA [I * 4] := Data [I * 3];
DataA [I * 4 + 1] := Data [I * 3 + 1];
DataA [I * 4 + 2] := Data [I * 3 + 2];
If (Data [I * 3 + 2] > 50) and
(Data [I * 3 + 1] < 200) and
(Data [I * 3] < 200)
then DataA [I * 4 + 3] := 127
else DataA [I * 4 + 3] := 255;
end;
glTexImage2d(GL_TEXTURE_2D, 0, 3, biWidth, // создаем образ
biHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, DataA);
finally
FreeMem (Data); // освобождаем память
FreeMem (DataA);
DeleteDC (MemDC);
Bitmap.Free;
end;
end;
end;
{=========================================================}
