- •Лекция 1 Основные понятия OpenGl
- •1.2 Однородные координаты и матрицы
- •1.3 Поворот точки вокруг прямой заданной точкой а(a,b,c) и направляющим вектором e(l,m,n), , на угол φ.
- •1.4 Система координат
- •1.5 Вершины
- •Лекция 2 Освещение объектов
- •2.1Основные понятия
- •2.2 Задание цвета объекта
- •2.3 Освещение объектов
- •2.3.1 Свойства диффузного отражения
- •2.3.2 Свойства зеркального отражения
- •Лекция 3
- •3.1 Контекст воспроизведения
- •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 Вывод текста на экран
- •Литература
Подготовка текстуры из bmp файла, для случая, когда размеры файла известны
procedure TfrmGL.BmpTexture(name:string); // name –имя файла
var
i, j,i1,i2: Integer;
begin
bitmap := TBitmap.Create;
try
bitmap.LoadFromFile(name); // загрузка текстуры из файла
{--- заполнение битового массива ---}
For i := 0 to 127 do // 127 размер текстуры по х
For j := 0 to 127 do //127 размер текстуры по y
begin
bits [i, j, 0] := GetRValue(bitmap.Canvas.Pixels[i,j]);
bits [i, j, 1] := GetGValue(bitmap.Canvas.Pixels[i,j]);
bits [i, j, 2] := GetBValue(bitmap.Canvas.Pixels[i,j]);
end;
finally
bitmap.Free;
end;
// glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_LINEAR_MIPMAP_LINEAR, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
128,128, // здесь задается размер текстуры 127 размер текстуры по х
0, GL_RGB, GL_UNSIGNED_BYTE, @Bits);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
// glEnable(GL_TEXTURE_2D);
end;
Пример инициализации двухмерной текстуры
{=======================================================================
Инициализация}
procedure TfrmGL.Init;
var
i, j, k : Integer;
texImage : Array [0..63, 0..63, 0..2] of GLUbyte;
begin
For i := 0 to 63 do
For j := 0 to 63 do begin
k := ((i shr 2) and 1) xor ((j shr 3) and 1);
texImage [i][j][0] := 255 * k;
texImage [i][j][1] := 255*(1 - k);
texImage [i][j][2] := 0;
end;
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glTexImage2D (GL_TEXTURE_2D, 0, 3, 64, 64, 0, GL_RGB, GL_UNSIGNED_BYTE, @texImage);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
// glEnable(GL_TEXTURE_2D);
end;
Лекция 6. Буфер трафарета
6.1 Тест трафарета
Многие специальные эффекты, такие как:
вырезание объектов;
отбеливание;
оконтуривание;
стерео восприятие,
реализуется с помощью теста трафарета. Наложение трафарета разрешает или блокирует рисование на пиксельном уровне.
Тест трафарета позволяет отбросить фрагмент, базируясь на результате сравнения значения в буфере трафарета с заданным ссылочным значением.
Тест разрешается и блокируется командами
glEnable(GL_STENCIL_TEST);
glDisable(GL_DEPTH_TEST);
Для проведения этого тестирования предусмотрены две команды. Одна из которых (glStencilFunc) описывает, как надо проводить сравнение цвета, находящегося в буфере кадра с цветом вновь водимого объекта, а другая (glStencilOp) – что надо делать по результатам сравнения.
GlStencilFunc(
(GLenum func,
GLint ref,
Glunit mask);
func – задает функцию сравнения значений хранящихся в буфере трафарета с некоторым заданным параметром ref, но сравнение осуществляется посредством некоторой маски mask. Функция сравнения может принимать одно из следующих значений.
Константа |
Тест завершается положительно |
GL_NEVER GL_LESS GL_EQUAL GL_LEQUAL GL_GREATE GL_NOTEQUAL GL_GEQUAL GL_ALWAYS |
Никогда Если (ref & mask) < (stencill & mask) Если (ref & mask) = (stencill & mask) Если (ref & mask) (stencill & mask) Если (ref & mask) > (stencill & mask) Если (ref & mask) (stencill & mask) Если (ref & mask) (stencill & mask) Всегда |
Параметр ref задает число для тестирования трафарета и может принимать любое значение из диапазона [0-2n-1], где n – разрядность буфера трафарета. Параметр mask задает маску.
Если тест принимает значение true, то цветом вновь водимого объекта записывается в буфер кадра.
По результатам тестирования, выполняемых функцией GlStencilFunc,
функция glStencilOp для каждого пикселя в буфере трафарета выполняет следующие действия
glStencilOp(
GLenum fail, - имя действия, для случая, если тест трафарета fail;
GLenum zfail, - имя действия, если тест трафарета true, а z тест fail;
GLenum zpass); - имя действия, если тест трафарета true, и z тест true;
Действия, выполняемее для каждого из трех (fail, zfail, zfail) случаев, приведены следующей таблице
Имя действия |
Дйствия |
GL_KEEP GL_ZERO GL_REPLACE GL_INCR GL_DECR GL_INVERT |
Сохранить текущие значение в буфере трафарета; Установить значение в буфере трафарета равным 0; Установить значение в буфере трафарета равным ref; Увеличить значение в буфере трафарета до 2n-1; Уменьшить значение в буфере трафарета до 0; Поразрядно инвертировать содержимое буфера трафарета; |
Например, программа создания прямоугольного выреза в круге.
В процедуре создание окна
procedure TfrmGL.FormCreate(Sender: TObject);
begin
….
GlClearStencil($1); // чистим буфер трафарета, для фона кадра
GlStencilMask($FF); // определяем значение маски трафарета
end;
В процедуре перерисовки сцены
….
glEnable(GL_STENCIL_TEST); // инициализируем функцию трафарета
// При рисовании квадрата в буфер трафарета заносим 3=00000011
glPushMatrix;
gluQuadricDrawStyle (quadObj, GLU_FILL);
glColor3f (1.0, 0.0, 0.0);
// ref mask
glStencilFunc(GL_never, $03, $FF); // Тест не выполняется – квадрат не отображается
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);//в буфер трафарета заносится $03
glBegin(GL_QUADS); //определяем область квадратного отверстие
glNormal3f(0.0, 0.0, 1.0);
glVertex3f(-1.0, -1.0, 0.0);
glVertex3f(1.0, -1.0, 0.0);
glVertex3f(1.0, 1.0, 0.0);
glVertex3f(-1.0, 1.0, 0.0);
glEnd;
glPopMatrix;
// Там где круг должен прорисовываться в буфер трафарета следует занести число
// отличное от $03, например$02.
// ref mask
glStencilFunc(GL_NOTEQUAL, $03, $FF);
glStencilOp(GL_ZERO, GL_KEEP,GL_KEEP);
gluDisk (quadObj, 0.0, 1.0, 20, 20);
// Прорисовка круга осуществляется только там, где в буфере трафарета нет $03
