Графическое программирование OPENGL
OPENGL — это библиотека трехмерной графики и моделей. Благодаря своей выдающейся производительности в трехмерной графике многие языки высокого уровня в настоящее время предоставляют интерфейсы с OPENGL, такие как: VC, DELPHI, C++Builder и т. д. Использование OPENGL может значительно упростить пользователям разработку графики и изображений, позволяя пользователям создавать коммерческую рекламу высокого уровня, графические САПР, трехмерную анимацию, графическое моделирование, а также коллекции фильмов и телепередач.
1. Функции OPENGL
OPENGL изначально представляла собой библиотеку графического программного обеспечения для рабочих станций. Благодаря ее широкому применению в коммерческой, военной, медицинской, аэрокосмической и других областях графика, отвечающая требованиям пользователей, теперь может разрабатываться на компьютерах начального уровня. OPENGL может не только рисовать базовые изображения, но также предоставляет большое количество функций и процедур для обработки графических изображений.
1. Графическое преобразование
Это основа графического отображения и производства. Анимационный дизайн и отображение анимации неотделимы от графического преобразования. Графическое преобразование математически реализуется путем умножения прямоугольников. Преобразование обычно включает в себя перемещение, вращение и масштабирование. В соответствии со свойствами отображения графики: преобразование точки обзора, преобразование модели, преобразование проекции, преобразование обрезки, преобразование видового экрана и т. д.
2. Эффект освещения
Цвет несветящегося объекта обусловлен тем, что объект отражает внешний свет, то есть освещение. В трехмерной графике, если освещение используется неправильно, трехмерная графика потеряет свой истинный трехмерный смысл. OPENGL делит освещение на: лучистый свет, рассеянный свет, рассеянный свет, отраженный свет и т. д.
3. Наложение текстур
Наложение текстур позволяет добавлять реальные текстуры к трехмерным поверхностям. Например: прямоугольник не может представлять объект в реальном мире. Если он заполнен «необходимой» текстурой, он станет реалистичным.
4. Графические спецэффекты
Функция смешивания, функция сглаживания и функция тумана могут обрабатывать прозрачность и полупрозрачность трехмерной графики, делать объект гладким, использовать сегменты линий для сглаживания и создания эффекта тумана.
5. Спецэффекты изображения
Основные функции обработки растровых изображений: рисование изображений, копирование и хранение изображений, картографирование и перенос, масштабирование изображений и т. д. Функция растровой операции может объяснить процесс формирования китайских иероглифов на нижнем уровне исходного рисунка.
2. Создайте приложение OPENGL.
1. Общие принципы
A. Добавьте модуль поддержки OPENGL в список использования: OpenGL;
B инициализировать OPENGL во время события OnCreate формы;
C инициализирует OPENGL во время события OnPaing окна;
D инициализирует OPENGL во время события OnResize окна;
E инициализирует OPENGL во время события OnDestroy окна;
2. Простой пример
A Создать проект ФАЙЛ->Новое приложение.
Б. Добавьте код в событие OnCreate:
PROcedure TfrmMain.FormCreate(Отправитель: TObject);
вар
pfd:TPixelFormatDescriptor //Установить таблицу описания;
Формат пикселей: целое число;
начинать
ControlStyle:=ControlStyle+[csOpaque];
FillChar(pfd,sizeof(pfd),0);
с пфд сделать
начинать
nSize:=sizeof(TPixelFormatDescriptor);
нВерсия:=1;
dwFlags:=PFD_DRAW_TO_WINDOW или
PFD_SUPPORT_OPENGL или PFD_DOUBLEBUFFER;
iPixelType:=PFD_TYPE_RGBA;
cColorBits:=24;
cDepthBits:=32;
iLayerType:=PFD_MAIN_PLANE;
конец;
PixelFormat:=ВыбратьPixelFormat(Canvas.Handle,@pfd);
SetPixelFormat(Canvas.Handle,PixelFormat,@pfd);
hrc:=wglCreateContext(Canvas.Handle);
ш:=КлиентВидс;
ч:=Высота Клиента;
конец;
Код C в событии OnDestroy
процедура TfrmMain.FormDestroy(Отправитель: TObject);
начинать
wglDeleteContext (HRC);
конец;
Код D в событии OnPaint
процедура TfrmMain.FormPaint(Отправитель: TObject);
начинать
wglMakeCurrent (Canvas.Handle, hrc);
glClearColor (1,1,1,1);
glColor3f(1,0,0);
glClear(GL_COLOR_BUFFER_BIT или GL_DEPTH_BUFFER_BIT);
MyDraw;
глФлеш;
SwapBuffers(Canvas.Handle);
конец;
E-код в событии OnResize
процедура TfrmMain.FormResize(Отправитель: TObject);
начинать
glMatrixMode (GL_PROJECTION);
glLoadIdentity;
glFrustum(-1.0,1.0,-1.0,1.0,3.0,7.0);
glViewPort (0,0, ClientWidth, ClientHeight);
MyDraw;
конец;
F-код в функции MyDraw (объявленный пользователем в классе окна)
процедура TfrmMain.MyDraw;
начинать
глПушМатрикс;
Сфера:=gluNewQuadric;
gluQuadricDrawStyle (Сфера, GLU_LINE);
gluSphere(Сфера,0.5,25,25);
глПопМатрикс;
SwapBuffers(Canvas.handle);
gluDeleteQuadric (Сфера);
конец;
Во вложении исходный код этой программы:
модуль MainFrm;
интерфейс
использует
Windows, сообщения, SysUtils, варианты, классы, графика, элементы управления, формы,
Диалоги, OpenGL;
тип
TfrmMain = класс (TForm)
процедура FormCreate (Отправитель: TObject);
процедура FormDestroy (Отправитель: TObject);
процедура FormPaint (Отправитель: TObject);
процедура FormResize (Отправитель: TObject);
частный
{Частные заявления}
час:HGLRC;
ш,ч:glFloat;
Сфера:GLUquadricObj;
общественный
{Публичные заявления}
процедура MyDraw;
конец;
вар
ФрмМейн: ТфрмМайн;
выполнение
{$R *.dfm}
процедура TfrmMain.FormCreate(Отправитель: TObject);
вар
pfd:TPixelFormatDescriptor;
Формат пикселей: целое число;
начинать
ControlStyle:=ControlStyle+[csOpaque];
FillChar(pfd,sizeof(pfd),0);
с пфд сделать
начинать
nSize:=sizeof(TPixelFormatDescriptor);
нВерсия:=1;
dwFlags:=PFD_DRAW_TO_WINDOW или
PFD_SUPPORT_OPENGL или PFD_DOUBLEBUFFER;
iPixelType:=PFD_TYPE_RGBA;
cColorBits:=24;
cDepthBits:=32;
iLayerType:=PFD_MAIN_PLANE;
конец;
PixelFormat:=ВыбратьPixelFormat(Canvas.Handle,@pfd);
SetPixelFormat(Canvas.Handle,PixelFormat,@pfd);
hrc:=wglCreateContext(Canvas.Handle);
ш:=КлиентВидс;
ч:=Высота Клиента;
конец;
процедура TfrmMain.FormDestroy(Отправитель: TObject);
начинать
wglDeleteContext (HRC);
конец;
процедура TfrmMain.FormPaint(Отправитель: TObject);
начинать
wglMakeCurrent (Canvas.Handle, hrc);
glClearColor (1,1,1,1);
glColor3f(1,0,0);
glClear(GL_COLOR_BUFFER_BIT или GL_DEPTH_BUFFER_BIT);
MyDraw;
глФлеш;
SwapBuffers(Canvas.Handle);
конец;
процедура TfrmMain.MyDraw;
начинать
глПушМатрикс;
Сфера:=gluNewQuadric;
gluQuadricDrawStyle (Сфера, GLU_LINE);
gluSphere(Сфера,0.5,25,25);
глПопМатрикс;
SwapBuffers(Canvas.handle);
gluDeleteQuadric (Сфера);
конец;
процедура TfrmMain.FormResize(Отправитель: TObject);
начинать
glMatrixMode (GL_PROJECTION);
glLoadIdentity;
glFrustum(-1.0,1.0,-1.0,1.0,3.0,7.0);
glViewPort (0,0, ClientWidth, ClientHeight);
MyDraw;
конец;
конец.
3. Соглашения о переменных и функциях OPENGL
1. Соглашения библиотеки OPENGL
Всего в нем три библиотеки: базовая, практическая и вспомогательная. В DELPHI базовая библиотека реализована модулем OpenGL. В среде Windows вспомогательные библиотеки обычно не используются.
2. Соглашение о константах OPENGL
В константах OPENGL используются заглавные буквы, начинающиеся с «GL», и символы подчеркивания для разделения слов, например: GL_LINES, что означает использование базовой библиотеки для рисования прямых линий.
3. Соглашение об именах функций OPENGL
О. Первая часть начинается с gl или wgl, как gl в glColor3f.
B Вторая часть — это функция, выраженная на английском языке, причем первая буква слова пишется с заглавной буквы.
Третья часть C — это число, представляющее параметры функции.
Четвертая часть D — это строчная буква, обозначающая тип функции.
b9-битное целое число
s16-битное целое число
i32-битное целое число
f32-битное число с плавающей запятой
d64-битное число с плавающей запятой
ub9-битное целое число без знака
Пример: glVertex2f(37,40); {два 32-битных числа с плавающей запятой в качестве параметров}
glVertex3d(37,40,5); {Три 64-битных числа с плавающей запятой в качестве параметров}
p[1..3]:массив glFloat;
glVertes3fv(p); {3f представляет три числа с плавающей запятой, v представляет вызов массива в качестве входных координат вершины}
4. Инициализация OPENGL.
1. Структура PIXELFORMATDESCRIPTOR
В основном он описывает свойства пикселей, такие как цветовой режим пикселей и состав красного, зеленого и синего цветов.
tagPIXELFORMATDESCRIPTOR = упакованная запись
nРазмер: Слово;
nВерсия: Word;
двфлагс: ДВОРД;
iPixelType: Байт;
cColorBits: Байт;
cRedBits: Байт;
cRedShift: Байт;
cGreenBits: Байт;
cGreenShift: Байт;
cBlueBits: Байт;
cBlueShift: Байт;
cAlphaBits: Байт;
cAlphaShift: Байт;
cAccumBits: Байт;
cAccumRedBits: Байт;
cAccumGreenBits: Байт;
cAccumBlueBits: Байт;
cAccumAlphaBits: Байт;
cDepthBits: Байт;
cStencilBits: Байт;
cAuxBuffers: Байт;
iLayerType: Байт;
bЗарезервировано: Байт;
dwLayerMask: DWORD;
dwVisibleMask: DWORD;
dwDamageMask: DWORD;
конец;
TPixelFormatDescriptor = tagPIXELFORMATDESCRIPTOR;
dwFlags представляет атрибуты формата точек:
Графика PFD_DRAW_TO_WINDOW рисуется на экране или поверхности устройства.
PFD_DRAW_TO_BITMAP рисует растровое изображение в памяти.
PFD_SUPPORT_GDI поддерживает рисование GDI.
PFD_SUPPORT_OPENGL поддерживает функции OPENGL.
PFD_DOUBLEBUFFER использует двойную буферизацию.
Стереокеш PFD_STEREO
PFD_NEED_PALLETTE использует палитру RGBA.
PFD_GENERIC_FORMAT выбирает формат чертежа, поддерживаемый GDI.
PFD_NEED_SYSTEM_PALETTE использует аппаратную палитру, поддерживаемую OPENGL.
iPixelType устанавливает цветовой режим пикселя: PFD_TYPE_RGBA или PFD_TYPE_INDEX..
cColorBits устанавливает биты цвета. Если оно равно 9, это означает, что существует 256 цветов для представления цвета точки.
cRedBits, cGreenBits, cBlueBits При использовании RGBA — количество битов, используемых для трех основных цветов.
cRedShitfs, cGreenShifts, cBlueShifts При использовании RGBA — количество цифр, которое можно настроить для трех основных цветов.
cAlphaBits, cAlphaShifts При использовании RGBA — количество битов, используемых Alpha, и количество настраиваемых битов.
cAccumBits устанавливает общее количество битов в области буфера накопления.
cAccumRedBits, cAccumGreenBits и cAccumBlueBits задают общее количество трех плоскостей основного цвета в области буфера накопления.
cAccumAlphaBits устанавливает общее количество альфа-битов в буфере накопления.
cDepthBits устанавливает глубину буфера концентрации.
cStencilBits устанавливает глубину кэша трафарета.
cAuxBuffers относится к размеру вспомогательного буфера.
iLayerType указывает тип слоя.
bReserved не используется и должен быть равен нулю.
dwLayerMask определяет маску наложения.
dwDamageMask определяет, используется ли один и тот же режим пикселей в одном и том же кэше кадров.
2. Этапы инициализации OPENGL
Используйте Canvas.Handle для получения дескриптора окна.
B Создайте переменную TPixelFormatDescriptor для определения формата пикселей.
C Используйте функцию ChoosePixelFormat, чтобы выбрать формат пикселей.
D Используйте функцию SetPixelFormat, чтобы применить формат пикселей.
E Используйте функцию wglCreateContext для создания таблицы описания перевода.
F Используйте функцию wglMakeCurrent, чтобы использовать созданную таблицу описания перевода в качестве текущей таблицы описания перевода.
3. Высвобождение ресурсов
A Используйте процедуру wglDeleteContext для удаления таблицы контекста пикселя.
B Используйте процедуру ReleaseDC, чтобы освободить оконную память.
В событии OnDestroy окна:
начинать
если hrc<>null тогда
wglDeleteCurrent (HRC);
если hdc<>null тогда
ReleaseDC(дескриптор,hdc);
конец;
5. Отрисовка базовой графики OPENGL.
1. Цвет графики
Обратите внимание на настройку цвета фона. Настройка цвета обычно связана с переменной описания пикселя, то есть с элементом iPixelType в определении TPixelFormatDescriptor.
iPixelType:=PFD_TYPE_COLORINDEX;
Тогда для установки цвета графики вы сможете использовать только процедуры glIndexd, glIndexf, glIndexi, glIndexs, glIndexv, glIndexfv, glIndexiv, glIndexsv.
iPixelType:=PFD_TYPE_RGBA;
Тогда вы можете использовать только glColor3b, glColor3f, glColor4b, glColor4f, glColor4fv для установки цвета графики.
Цвет фона графики: цвет экрана и окна, то есть цвет цветового буфера. Чтобы изменить цвет фона графики, сначала следует использовать процедуру glClearColor для установки цвета фона, а затем использовать процедуру glClear для обновления окна и экрана с использованием этого цвета фона.
процедура glClearColor(красный:GLClampf,зеленый:GLClampf,синий:GLClampf,альфа:GLClampf);
процедура glClear(маска:GLBitField);
красный, зеленый, синий и альфа — это цвета фона, которые нужно установить, их значения от 0 до 1. Маска — это способ обновить цвет фона.
Пример: установите зеленый цвет окна окраски.
glClearColor (0,1,0,1);
glClear (GL_COLOR_BUFFER_BIT);
Значение и значение маски:
GL_COLOR_BUFFER_BIT устанавливает текущий буфер цвета.
GL_DEPTH_BUFFER_BIT устанавливает текущий буфер глубины.
GL_ACCUM_BUFFER_BIT устанавливает текущий буфер накопления
GL_STENCIL_BUFFER_BIT устанавливает текущий буфер STENCIL (шаблон).
Окно рисования имеет серый цвет.
glClearColor(0.3,0.3,0.3,1);
glClear (GL_COLOR_BUFFER_BIT);
B графический цвет
Используйте glClear3f и glClear4f, чтобы установить цвет рисования графики. Если используются три параметра, это означает установку трех цветов красного, синего и зеленого света соответственно. Если используются четыре параметра, четвертый представляет значение RGBA.
Пример установки синего цвета текущего рисунка:
glColor3f (0,0,1);
Установите цвет графика на белый:
glColor3f(1,1,1);
2. Рисование простой графики
Рисуйте простую графику, такую как точки, линии, многоугольники и т. д., между процедурами glBegin и glEnd.
glBegin(mode:GLenum);{Процесс рисования}glEnd;
Значение режима:
GL_POINTS рисует несколько точек
GL_LINES рисует несколько линий, рисуя прямую линию через каждые две точки.
GL_LINE_STRIP рисует ломаную линию
GL_LINE_LOOP рисует замкнутые многоугольники, соединенные встык.
GL_TRIANGLES рисует треугольники
GL_TRIANGLE_STRIP рисует треугольник, рисуя треугольник через каждые три точки.
GL_TRIANGLE_FAN рисует треугольники
GL_QUADS рисует четырехугольники
GL_QUAD_STRIP рисует четырехугольные полосы, на каждые четыре точки рисуется одна четырехугольная полоса.
GL_POLYGON рисует полигоны
Пример нанесения трех точек:
начинать
глПушМатрикс;
glBegin (GL_POINT);
glVertex2f(0.1,0.1);
glVertex2f(0,5,0,5);
glVertex2f(0.1,0.3);
гЛЭнд;
SwapBuffers(Canvas.Handle);
конец;
Если вы измените GL_POINT на GL_LINES, вы нарисуете линию. Третья точка недействительна. Выполнение glColor3f(0,0,1) до glVertex2f изменит цвет линии на зеленый. Если вы измените GL_LINES на GL_LINE_STRIP, вы сможете рисовать. два Прямая линия.
Используйте процедуру glPointSize для установки размера точки; используйте процедуру glLineWidth для установки ширины линии.
Используйте процедуру glLineStipple, чтобы установить шаблон для пунктирных линий, и используйте процедуру glEnable(GL_LINE_STIPPLE) и соответствующие параметры, чтобы включить рисование для рисования пунктирных линий. Процедура glDisable(GL_LINE_STIPPLE) и соответствующие параметры отключают пунктирные линии.
процедура glLineStipple (фактор: GLint, шаблон: GLushort);
Параметр Factor представляет собой количество повторений шаблона штрих-пунктирной линии. Значение коэффициента равно 1255. Шаблон представляет собой двоичную последовательность.
glLineStipple(1,0,0x11C);{0x11C представлен как 10001110, 0 означает не рисовать точки, 1 означает рисовать точки}
Пример: начать
glColor3f(1,0,0);
glLineWidth (2);
glLineStipple(1,$11C);
glEnable (GL_LINE_STIPPLE);
glBegin (GL_LINES);
glVertex2f(-0,9,0,3);
glVertex2f(0.9,0.3);
гЛЭнд;
glDisable (GL_LINE_STIPPLE);
glColor3f(1,0,1);
glLineStipple(2,$11C);
glEnable (GL_LINE_STIPPLE);
glBegin (GL_LINES);
glVertex2f(-0.9,0.1);
glVertex2f(0.9,0.1);
гЛЭнд;
glDisable (GL_LINE_STIPPLE);
SwapBuffers(Canvas.Handle);
конец;
Рисование многоугольника похоже на рисование точечных линий. Вам необходимо изменить параметры на GL_POLYGON, GL_QUADS, GL_TRANGLES. На что следует обратить внимание при рисовании.
Стороны многоугольника пересекаются только в вершинах
Многоугольник B должен быть выпуклым многоугольником. Если это вогнутый многоугольник, пользователь может только сложить его в выпуклый многоугольник, чтобы ускорить рисование.
Пример: glBegin(GL_POLYGON);
glVertex2f(-0,9,0,3);
glVertex2f(0.9,0.3);
glVertex2f(0,9,-0,6);
glVertex2f(0,5,-0,6);
glVertex2f(-0,9,-0,2);
гЛЭнд;
Многоугольники имеют лицевую и обратную стороны, и связанные с ними процессы таковы:
glPolygonMode управляет режимами рисования передней и задней части многоугольника.
glFrontface определяет переднюю грань многоугольника.
glCullFace отображает полигоны, настроенные на удаление граней.
glPolygonStripple формирует стиль заливки многоугольника.
3. Простая квадратичная поверхность.
Цилиндры, кольца и сферы представляют собой квадратичные поверхности.
Цилиндр
gluCylinder(qobj:GLUquadricObj,baseRadius:GLdouble,topRadius:GLdouble,height:GLdouble,
срезы:GLint,стеки:GLint);
qobj определяет квадратичную поверхность, baseRadius — радиус основания цилиндра; topRadius — верхний радиус нарисованного цилиндра; высота — высота срезов цилиндра — количество разделительных линий вокруг оси Z; разделительные линии по оси Z.
Если baseRadius и topRadius не равны, вы можете нарисовать усеченную пирамиду и конус.
процедура TfrmMain.MyDraw;
вар
qObj:GLUQuadricObj;
начинать
глПушМатрикс;
glClear(GL_COLOR_BUFFER_BIT или GL_DEPTH_BUFFER_BIT);
glColor3f(1,0,0);
qObj:=gluNewQuadric;
gluQuadricDrawStyle (qObj, GLU_LINE);
gluCylinder(qObj,0.5,0.1,0.2,10,10);
конец;
Приносить
gluDisk(qobj:GLUquadricObj,innerRadius:GLdouble,outerRadius:GLdouble,slices:GLint,
циклы:GLint);
процедура TfrmMain.MyDraw;
вар
qObj:GLUQuadricObj;
начинать
глПушМатрикс;
glClear(GL_COLOR_BUFFER_BIT или GL_DEPTH_BUFFER_BIT);
glColor3f(1,0,0);
qObj:=gluNewQuadric;
gluQuadricDrawStyle (qObj, GLU_LINE);
gluDisk(qObj,0.2,0.5,10,5);
SwapBuffers(Canvas.Handle);
конец;
полукруг С
gluPartialDisk(qobj:GLUquadricObj,innerRadius:GLdouble,outerRadius:GLdouble,slices:GLint,
циклы:GLint,startAngle:GLdouble,sweepAngle:GLdouble);
startAngle, SweepAngle — начальный и конечный углы полукруга.
процедура TfrmMain.MyDraw;
вар
qObj:GLUQuadricObj;
начинать
глПушМатрикс;
glClear(GL_COLOR_BUFFER_BIT или GL_DEPTH_BUFFER_BIT);
glColor3f(1,0,0);
qObj:=gluNewQuadric;
gluQuadricDrawStyle (qObj, GLU_LINE);
gluPartialDisk(qObj,0.2,0.5,10,5,90,190);
SwapBuffers(Canvas.Handle);
конец;
D-сфера
функция gluSphere(qObj:GLUquadricObj,radius:GLdouble,slices:GLint,stacks:GLint);
процедура TfrmMain.MyDraw;
вар
qObj:GLUQuadricObj;
начинать
глПушМатрикс;
glClear(GL_COLOR_BUFFER_BIT или GL_DEPTH_BUFFER_BIT);
glColor3f(1,0,0);
qObj:=gluNewQuadric;
gluQuadricDrawStyle (qObj, GLU_LINE);
{ силуэт[ силу(:)5et ]n силуэт, контур}
gluSphere(qObj,0.5,20,20);
SwapBuffers(Canvas.Handle);
конец;
E О процессе квадратичной поверхности
gluNewQuadric создает новый объект квадратичной поверхности.
gluDeleteQuadric удаляет объект квадратной поверхности
gluQuadricDrawStyle определяет тип квадратичной поверхности для рисования.
gluQuadricNormal устанавливает вектор нормали квадратичной поверхности.
gluQuadricOrientation определяет, повернута ли квадратичная поверхность внутрь или наружу.
gluQuadricTexture определяет, использует ли квадратичная поверхность текстуру.
F Общие шаги по рисованию квадратичных поверхностей
Сначала определите объект GLUquadricObj;
Во-вторых, создайте объект поверхности gluNewQuadric;
Снова установите свойства квадратичной поверхности (gluQuadricDrawStyle, gluQuadricTexture)
Рисование квадратичных поверхностей (gluCylinder, gluSphere, gluDisk, gluPartialDisk)
6. Трансформация в OPENGL
Трансформация — это основа анимационного дизайна, включающая графический перевод, вращение, масштабирование и другие операции, которые математически реализуются с помощью матриц.
1 процесс glLoadIdentity
Способен преобразовать текущую матрицу в единичную матрицу.
2 процесс glLoadMatrix
Возможность установить указанную матрицу в качестве текущей.
процедура glLoadmatrixd(m:GLdouble);
процедура glLoadmatrixf(m:GLfloat);
m представляет матрицу 4X4, следующий код определяет и делает ее текущей матрицей
M:array[1..4,1..4] из GLfloat;
glLoadMatrix(@M);
3 процесс glMultMatrix
Возможность умножить текущий момент на указанную матрицу и использовать результат как текущий момент.
процедура glMultMatrixd(M:GLdouble);
процедура glMultMatrixf(M:GLfloat);
4 glPushMatrix и glPopmatrix
glPushMatrix может поместить текущий момент в стек матриц, а glPopMatrix может извлечь текущий момент из стека матриц.
glPushMatrix может запомнить текущую позицию матрицы, а glPopmatrix может вернуть предыдущую позицию.
Примечание. glPushMatrix и glPopMatrix должны быть размещены вне glBegin и glEnd.
5 Преобразование проекции
glOrtho может создать матрицу ортогональной проекции, умножить текущий момент на матрицу ортогональной проекции и использовать результат в качестве текущей матрицы.
функция glOrtho(слева:GLdouble,справа:GLdouble,снизу:GLdouble,сверху:GLdouble,
рядом: GLdouble, далеко: GLdouble);
процедура TfrmMain.FormResize(Отправитель: TObject);
вар
nRange:GLfloat;
начинать
нДиапазон:=50,0;
ш:=clientWidth;
ч:=clientHeight;
если h=0, то
ч:=1;
glViewPort (0,0, ш, ч);
если w<=h, то
glOrtho(-nRange,nRange,-nRange*h/w,nRange*h/w,
-нДиапазон, нДиапазон)
еще
glOrtho(-nRange*h/w,nRange*h/w,-nRange,nRange,
-нДиапазон, нДиапазон);
перекрасить;
конец;
B glOrtho2D определяет только переднюю, заднюю, левую и правую части орфографического объема просмотра.
процедура glOrtho(слева:GLdouble,справа:GLdouble,снизу:GLdouble,сверху:GLdouble);
Процедура C glMatrixMode
Возможность установки типа текущей матрицы операций
процедура glMatrixMode (режим: GLenum);
Значение режима:
GL_MODELVIEW указывает, что последующие матричные операции представляют собой стеки матриц модели.
GL_PROJECTION указывает, что последующие матричные операции представляют собой стеки матриц проекции.
GL_TEXTURE указывает, что последующие матричные операции представляют собой стеки матриц текстур.
Процесс D glFrustum
Создайте матрицу перспективной наклонной проекции и умножьте текущую матрицу на матрицу наклонной проекции. Результатом является текущая матрица.
процедура glFrustum(слева:GLdouble,справа:GLdouble,снизу:GLdouble,сверху:GLdouble,
следующий:GLdouble,far:GLdouble);
Эти параметры определяют левую, правую, верхнюю, нижнюю, переднюю и заднюю плоскости отсечения наклонной проекции.
E gluПерспективный процесс
Возможность определить объем просмотра четырехсторонней пирамиды с осью Z в качестве центральной линии.
процедура gluPerspetive(fovy:GLdouble,aspect:GLdouble,zNear:GLdouble,zFar:GLdouble);
fovy определяет перспективу плоскости xoz, аспект определяет соотношение в направлениях x и y, zNear и zFar определяют расстояния от точки обзора до плоскости отсечения и задней плоскости отсечения соответственно.
процедура TfrmMain.FormResize(Отправитель: TObject);
вар
аспект:GLfloat;
начинать
ш:=КлиентВидс;
ч:=Высота Клиента;
если h=0, то
ч:=1;
glViewPort (0,0, clientWidth, Clienttheight);
glMatrixMode (GL_PROJECTION);
glLoadIdentity;
аспект:=ш/ч;
gluPerspective(30.0,аспект,1.0,50.0);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity;
конец;
6 Матрица геометрического преобразования
Преобразование позы движения трехмерного объекта относится к перемещению, вращению и масштабированию объекта.
Процесс glTranslate может переместить начало координат в (x, y, z), синтаксис его объявления:
процедура glTranslated(x:GLdouble,y:GLdouble,z:GLdouble);
процедура glTranslatef(x:GLdouble,y:GLdouble,z:GLdouble);
B glRotate может поворачивать объект на определенный угол. Синтаксис его объявления:
процедура glRotated(угол:GLdouble,x:GLdouble,y:GLdouble,z:GLdouble);
процедура glRotatef(angle:GLdouble,x:GLdouble,y:GLdouble,z:GLdouble);
Среди них угол — это угол поворота, а центральная ось вращения — это линия, соединяющая две точки (0,0,0) и (x,y,z).
C glScale может масштабировать систему координат, синтаксис его объявления следующий:
процедура glScaled(x:GLdouble,y:GLdoble,z:GLdouble);
процедура glScalef(x:GLdouble,y:GLdoble,z:GLdouble);
Значения x, y и z больше 1 представляют собой увеличение, а значения меньше 1 — уменьшение.
Пример исходного кода:
модуль MainFrm;
интерфейс
использует
Windows, сообщения, SysUtils, варианты, классы, графика, элементы управления, формы,
Диалоги, OpenGL, ExtCtrls;
тип
TfrmMain = класс (TForm)
Таймер1: ТТаймер;
процедура FormCreate (Отправитель: TObject);
процедура FormDestroy (Отправитель: TObject);
процедура FormPaint (Отправитель: TObject);
процедура FormKeyDown (Отправитель: TObject; var Key: Word;
Сдвиг: TShiftState);
процедура FormResize (Отправитель: TObject);
процедура Timer1Timer (Отправитель: TObject);
процедура FormClose (Отправитель: TObject; вар Действие: TCloseAction);
частный
{Частные заявления}
час:HGLRC;
ш, ч: целое число;
широта, долгота: GLfloat;
радиус:GLdouble;
общественный
{Публичные заявления}
процедура MyDraw;
процедура InitializeGL (вар ширина: GLsizei; высота: GLsizei);
конец;
вар
ФрмМейн: ТфрмМайн;
выполнение
{$R *.dfm}
процедура TfrmMain.FormCreate(Отправитель: TObject);
вар
pfd:TPixelFormatDescriptor;
Формат пикселей: целое число;
начинать
ControlStyle:=ControlStyle+[csOpaque];
FillChar(pfd,sizeof(pfd),0);
с пфд сделать
начинать
nSize:=sizeof(TPixelFormatDescriptor);
нВерсия:=1;
dwFlags:=PFD_DRAW_TO_WINDOW или
PFD_SUPPORT_OPENGL или PFD_DOUBLEBUFFER;
iPixelType:=PFD_TYPE_RGBA;
cColorBits:=24;
cDepthBits:=32;
iLayerType:=PFD_MAIN_PLANE;
конец;
PixelFormat:=ВыбратьPixelFormat(Canvas.Handle,@pfd);
SetPixelFormat(Canvas.Handle,PixelFormat,@pfd);
hrc:=wglCreateContext(Canvas.Handle);
w:=ClientRect.Right;
h:=ClientRect.Bottom;
ИнициализироватьGL (ш, ч);
конец;
процедура TfrmMain.FormDestroy(Отправитель: TObject);
начинать
wglDeleteContext (HRC);
конец;
процедура TfrmMain.FormPaint(Отправитель: TObject);
начинать
wglMakeCurrent (Canvas.Handle, hrc);
glClearColor (1,1,1,1);
glColor3f(1,0,0);
glClear(GL_COLOR_BUFFER_BIT или GL_DEPTH_BUFFER_BIT);
MyDraw;
глФлеш;
конец;
процедура TfrmMain.MyDraw;
вар
qObj:GLUQuadricObj;
начинать
глПушМатрикс;
glClear(GL_COLOR_BUFFER_BIT или GL_DEPTH_BUFFER_BIT);
glColor3f(1,0,0);
glRotated(0.5,0.0,1.0,0.0);
glRotated(-широта,1.0,0.0,0.0);
glrotated(долгота,0.0,0.0,1.0);
qObj:=gluNewQuadric;
gluQuadricDrawStyle (qObj, GLU_LINE);
gluSphere(qObj,0.5,20,20);
SwapBuffers(Canvas.Handle);
конец;
{процедура TfrmMain.FormResize(Отправитель: TObject);
вар
nRange:GLfloat;
начинать
нДиапазон:=50,0;
ш:=clientWidth;
ч:=clientHeight;
если h=0, то
ч:=1;
glViewPort (0,0, ш, ч);
glMatrixMode (GL_PROJECTION);
glLoadIdentity;
если w<=h, то
glOrtho(-nRange,nRange,-nRange*h/w,nRange*h/w,
-нДиапазон, нДиапазон)
еще
glOrtho(-nRange*h/w,nRange*h/w,-nRange,nRange,
-нДиапазон, нДиапазон);
glMatrixMode (GL_MODELVIEW);
glLoadidentity;
перекрасить;
конец;
}
процедура TfrmMain.FormKeyDown (Отправитель: TObject; var Key: Word;
Сдвиг: TShiftState);
начинать
если Ключ=VK_ESCAPE, то
Закрывать;
если Ключ=VK_UP тогда
glRotatef(-5,1.0,0.0,0.0);
если Key=VK_DOWN, то
glRotatef(5,1.0,0.0,0.0);
если Ключ=VK_LEFT, то
glRotatef(-5,0.0,1.0,0.0);
если Key=VK_RIGHT, то
glRotatef(5.0,0.0,1.0,0.0);
перекрасить;
конец;
процедура TfrmMain.FormResize(Отправитель: TObject);
начинать
glMatrixMode (GL_PROJECTION);
glLoadIdentity;
glFrustum(-1.0,1.0,-1.0,1.0,3.0,7.0);
glViewPort (0,0, clientWidth, clientHeight);
перекрасить;
признать недействительным;
конец;
процедура TfrmMain.InitializeGL (ширина var: GLsizei; высота: GLsizei);
вар
maxObjectSize, аспект: GLfloat;
Near_plane:GLdouble;
начинать
глКлеариндекс (0);
glClearDepth (1.0);
glEnable (GL_DEPTH_TEST);
glMatrixMode (GL_PROJECTION);
аспект:=1.0;
gluPerspective(45.0,аспект,3.0,7.0);
glmatrixMode (GL_MODELVIEW);
Near_plane: = 0,3;
МаксОбъектСизе:=0,3;
радиус:=near_plane+maxObjectSize/2.0;
широта: = 0,3;
долгота:=0,6;
конец;
процедура TfrmMain.Timer1Timer(Отправитель: TObject);
начинать
таймер1.Включено:=ложь;
MyDraw;
Урожай;
Таймер1.Включено:=истина;
конец;
процедура TfrmMain.FormClose (Отправитель: TObject; var Action: TCloseAction);
начинать
таймер1.Включено:=ложь;
если hrc<>null тогда
wglDeleteContext (HRC);
конец;
конец.
7. Освещение и текстуры OPENGL.
Все они являются средством усиления трехмерного эффекта и цветового эффекта. Освещение может увеличить яркость и трехмерный эффект графики, а текстура может сделать графику более реалистичной. Благодаря использованию освещения внешний вид объекта может быть ярко выражен, а текстуры могут придать объекту разнообразный внешний вид.
1 Процессы и приложения освещения и источников света
Процедура glIndex делает цвет в таблице индексов цветов текущим цветом.
процедура glIndexd(c:GLdouble);
процедура glIndexf(c:GLdouble);
процедура glIndexi(c:GLdouble);
процедура glIndexs(c:GLdouble);
Параметр C — это значение индекса. Если используется процедура glIndex, члену iPixelType в структуре TPiexlFormatDescriptor присваивается значение PFD_TYPE_COLORINDEX.
Процедура glShadeModel B.
Процесс glShadeModel устанавливает режим заливки, значение: GL_SMOOTH.
процедура glShadeModel (режим: GLenum);
Примечание. Два вышеуказанных процесса можно использовать только вне glBegin....glEnd.
Процедура C glLight определяет источник света
процедура glLightf(light:GLenum,pname:GLenum,param:GLfloat);
процедура glLighti(light:GLenum,pname:GLenum,param:GLfloat);
Параметр Light определяет источник света, его значение может быть: GL_LIGHT0....GL_LIGHTN, значение N меньше GL_MAX_LIGHT.
Параметр pname определяет параметры источника света:
GL_AMBIENT интенсивность компонента окружающего света
GL_DIFFUSE интенсивность компонента рассеянного света
GL_SPECULAR интенсивность компонента отраженного света
GL_POSITION положение источника света
GL_SPOT_DIRECTION Направление фокуса источника света.
Индекс источника света GL_SPOT_EXPONENT
GL_SPOT_CUTOFF направление источника света
GL_CONSTANT_ATTENUATION коэффициент затухания постоянной освещенности
GL_LINEAR_ATTENUATION легкий вторичный коэффициент ослабления
Включайте и выключайте источники света с помощью процедур glEnable() и glDisable().
glEnable(GL_LIGHTING); //Включаем источник света
glDisable(GL_LIGHTING); //Выключаем источник света
glEnable(GL_LIGHT0); //Включаем 0-й источник света
glDisable(GL_LIGHT0); //Выключаем 0-й источник света
Пример настройки источника света:
вар
sdirection:Array[1..4] of GLfloat:={0.0,1.0,0.0,0.0};
glLightfv(GL_LIGHT0,GL_SPOT_CUTOFF,60);
glLightfv (GL_LIGHT0, GL_SPOT_DIRECTION, sdirection);
2 Материал и модель освещения
Процедура glMaterial устанавливает параметры материала.
процедура glMaterialf(face:GLenum,pname:GLenum,param:GLfloat);
процедура glMateriali(face:GLenum,pname:GLenum,param:GLfloat);
процедура glMaterialfv(face:GLenum,pname:GLenum,param:GLfloat);
процедура glMaterialiv(face:GLenum,pname:GLenum,param:GLfloat);
Параметр face определяет поверхность объекта, а его значения: GL_FRONT, GL_BACK, GL_FRONT_BACK.
pname,param в этом материале не представлены.
B процесс glLightModel
процедура glLightModelf(pname:GLenum,param:GLfloat);
Параметр pname — это параметр модели источника света, который может принимать значение GL_LIGHT_MODEL_AMBIENT,
GL_LIGHT_MODEL_LOCAL_VIEWER,GL_LIGHT_MODEL_TWO_SIDE.
Пример кода:
процедура TfrmMain.SetLighting;
вар
MaterialAmbient:array[1..4] из GLfloat;
MaterialDiffuse:Array[1..4] из GLfloat;
MaterialSpecular:Array[1..4] из GLfloat;
AmbientLightPosition:Array[1..4] из GLfloat;
LightAmbient:Array[1..4] из GLfloat;
МатериалБлеск:GLfloat;
начинать
МатериалАмбиент[1]:=0,5;
МатериалАмбиент[2]:=0,8;
МатериалАмбиент[1]:=0,2;
МатериалАмбиент[1]:=1.0;
МатериалДиффус[1]:=0,4;
МатериалДиффус[2]:=0,8;
МатериалDiffuse[3]:=0,1;
МатериалДиффус[4]:=1.0;
МатериалSpecular[1]:=1.0;
МатериалЗекулярный[2]:=0,5;
МатериалЗекулярный[3]:=0,1;
МатериалSpecular[4]:=1.0;
материалБлеск:=50,0;
AmbientLightPosition[1]:=0,5;
AmbientLightPosition[2]:=1.0;
AmbientLightPosition[3]:=1.0;
AmbientLightPosition[4]:=0.0;
LightAmbient[1]:=0,5;
LightAmbient[2]:=0,2;
LightAmbient[3]:=0,8;
LightAmbient[4]:=1,0;
glMaterialfv(GL_FRONT,GL_AMBIENT,@MaterialAmbient);
glMaterialfv(GL_FRONT,GL_DIFFUSE,@MaterialDiffuse);
glMaterialfv(GL_FRONT,GL_SPECULAR,@MaterialSpecular);
glMaterialfv(GL_FRONT,GL_SHININESS,@MaterialShininess);
glLightfv(GL_LIGHT0,GL_POSITION,@AmbientLightPosition);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,@LightAmbient);
glEnable (GL_LIGHTING);
glEnable (GL_LIGHT0);
GLShadeModel (GL_SMOOTH);
конец;
3 Нанесение текстуры
glTexImage1D определяет одномерную карту текстуры.
процедура glTexImage1D(цель:GLenum,уровень:GLint,компоненты:GLint,ширина:GLsizei,
граница:GLint,формат:GLenum,тип:GLenum,пиксели:GLvoid);
Целевое значение параметра — GL_TEXTURE_1D, которое определяется как отображение текстуры, уровень — уровень изображения текстуры с многоуровневым разрешением, ширина — ширина текстуры, значение — 2n, а значение n — 32, 64, 129. и т. д. Border — граница текстуры, ее значение — 0 или 1, Pixel — расположение текстуры в памяти. Компонент определяет смешивание и настройку RGBA:
1Выберите ингредиент Б.
2Выберите ингредиенты B и A.
3Выберите ингредиенты R, G, B.
4Выберите ингредиенты R,G,B,A.
B glTexImage2D определяет двумерное наложение текстур.
процедура glTexImage2D(цель:GLenum,уровень:GLint,компоненты:GLint,ширина:GLsizei,
граница:GLint,формат:GLenum,тип:GLenum,пиксели:GLvoid);
Если целью параметра является GL_TEXTURE_2D, значением является двумерное отображение текстуры, высота — это высота текстуры, а другие параметры в функции такие же, как glTexImage1D. Значение параметра компонента такое же, как указано выше.
Пример кода:
процедура TfrmMain.SetTextures;
вар
биты: Массив [1..64,1..64,1..64] из GLubyte;
bmp:TBitmap;
я, j: целое число;
начинать
bmp:=TBitmap.Create;
bmp.LoadFromFile('d:/dsoft/1119/01/logon.bmp');
для i:= от 1 до 64 сделать
для j:= от 1 до 64 сделать
начинать
bits[i,j,1]:=GLbyte(GetRValue(bmp.Canvas.Pixels[i,j]));
bits[i,j,2]:=GLbyte(GetRValue(bmp.Canvas.Pixels[i,j]));
bits[i,j,3]:=GLbyte(GetRValue(bmp.Canvas.Pixels[i,j]));
биты[i,j,4]:=255;
конец;
{0 представляет собой один уровень затенения цвета, GL_RGBA представляет собой смешанное значение.
64X64 представляет высоту и ширину текстуры, 0 — отсутствие границы,
GL_RGBA представляет тип текстуры, GL_UNSIGNED_TYPE представляет тип данных, адрес объекта @Generation}
glteximage2d (gl_texture_2d, 0, gl_rgba, 64,64,0, gl_rgba,
Gl_unsigned_byte,@bits);
glenable (gl_texture_2d);
конец;
C GLTEXPARAMETER Процедура Устанавливает параметры текстуры
Процедура GLTEXPARAMETERF (Цель: Гленум, PNAME: GLENUM, PARAM: GLFLOAT);
Процедура GLTEXPARAMETERI (цель: Гленум, PNAME: GLENUM, PARAM: GLFLOAT);
Цель параметра представляет GL_TEXTURE_1D или GL_TEXTURE_2D, а PARAM - это значение текстуры.
D gltexenv Устанавливает параметры среды текстуры
Функция gltexenvf (цель: glenum, pname: glenum, param: glfloat);
Функция gltexenvi (цель: glenum, pname: glenum, param: glfloat);
Целью параметра является gl_texture_env,
Параметр PNAME - это значение параметра текстуры, а значение - GL_TEXTURE_ENV_MODE
Параметр параметров - это значение среды, а его значения - GL_Modulate, GL_DECAL и GL_BLEND.
Пример кода для этой программы:
единица mainfrm;
интерфейс
использует
Windows, сообщения, SysUtils, варианты, классы, графика, элементы управления, формы,
Диалоги, OpenGl, Extctrls;
тип
TfrmMain = класс (TForm)
Таймер1: ТТаймер;
процедура FormCreate (Отправитель: TObject);
процедура FormDestroy (Отправитель: TObject);
Процедура Formpaint (отправитель: tobject);
Процедура FormKeyDown (отправитель: tobject; var Key: Word;
Сдвиг: TshiftState);
процедура FormReSize (отправитель: tobject);
процедура Timer1Timer (Отправитель: TObject);
процедура FormClose (Отправитель: TObject; вар Действие: TCloseAction);
частный
{Частные заявления}
HRC: HGLRC;
W, H: целое число;
Широта, долгота: GLFLAT;
радиус: Gldouble;
общественный
{Публичные заявления}
Процедура подсветка;
процедура setTextures;
процедура myDraw;
Процедура инициализировать) (var width: glsizei; высота: glsizei);
конец;
вар
Frmmain: tfrmmain;
выполнение
{$R *.dfm}
Процедура tfrmmain.formcreate (отправитель: tobject);
вар
PFD: tpixelformatdescriptor;
Pixelformat: целое число;
начинать
CONTROLSTYLE: = CONTROLSTYLE+[CSOPAQUE];
Fillchar (pfd, sizeof (pfd), 0);
с PFD DO
начинать
nsize: = sizeof (tpixelformatdescriptor);
nversion: = 1;
dwflags: = pfd_draw_to_window или
Pfd_support_opengl или pfd_doublebuffer;
ipixelType: = pfd_type_rgba;
Ccolorbits: = 24;
cdepthbits: = 32;
ilayertype: = pfd_main_plane;
конец;
Pixelformat: = choosepixelformat (canvas.handle,@pfd);
SetPixelformat (canvas.handle, pixelformat,@pfd);
hrc: = wglcreatecontext (canvas.handle);
W: = clientRect.right;
H: = clientRect.bottom;
Инициализированное) (w, h);
конец;
Процедура tfrmmain.formDestroy (отправитель: tobject);
начинать
wgldeleteContext (HRC);
конец;
Процедура tfrmmain.formpaint (отправитель: tobject);
начинать
WglmakeCurrent (Canvas.Handle, HRC);
glclearcolor (1,1,1,1);
GLCOLOR3F (1,0,0);
glclear (gl_color_buffer_bit или gl_depth_buffer_bit);
SetTextures;
Mydraw;
Подсветка;
glflush;
конец;
Процедура tfrmmain.mydraw;
вар
QOBJ: GluquadricObj;
начинать
glpushmatrix;
glclear (gl_color_buffer_bit или gl_depth_buffer_bit);
GLCOLOR3F (1,0,0);
Glrotated (0,5,0,0,1,0,0,0);
Glrotated (-latitude, 1,0,0,0,0,0);
Glrotated (долгота, 0,0,0,0,0,1,0);
qobj: = Glunewquadric;
gluquadricdrawstyle (qobj, glu_line);
Глуповое (QOBJ, 0,5,20,20);
Swapbuffers (Canvas.Handle);
Подсветка;
SetTextures;
конец;
{Процедура tfrmmain.formresize (отправитель: tobject);
вар
nrange: glfloat;
начинать
nrange: = 50,0;
w: = клиентская Whidth;
H: = clientHeight;
Если h = 0, то
H: = 1;
Glviewport (0,0, W, H);
glmatrixmode (gl_procection);
Glluctidentity;
Если w <= h, то
Glortho (-nrange, nrange, -nrange*h/w, nrange*h/w,
-nrange, nrange)
еще
glortho (-nrange*h/w, nrange*h/w, -nrange, nrange,
-nrange, nrange);
glmatrixmode (gl_modelview);
Glluctidentity;
перекрасить;
конец;
}
Процедура tfrmmain.formkeydown (отправитель: tobject; var Key: Word;
Сдвиг: TshiftState);
начинать
Если key = vk_escape тогда
Закрывать;
Если key = vk_up, тогда
Glrotatef (-5,1,0,0,0,0,0,0);
Если key = vk_down then
Glrotatef (5,1,0,0,0,0,0,0);
Если key = vk_left тогда
Glrotatef (-5,0,0,1,0,0,0,0);
Если key = vk_right тогда
glrotatef (5,0,0,0,1,0,0,0,0);
перекрасить;
конец;
Процедура tfrmmain.formresize (отправитель: tobject);
начинать
glmatrixmode (gl_procection);
Glluctidentity;
glfrustum (-1,0,1,0, -1,0,1,0,3,0,7,0);
Glviewport (0,0, ClientWidth, ClientHeight);
перекрасить;
недействителен;
конец;
Процедура tfrmmain.initializegl (var width: glsizei; height: glsizei);
вар
maxobjectsize, аспект: Glfloat;
Near_plane: Gldouble;
начинать
glclearindex (0);
glcleardepth (1.0);
glenable (gl_depth_test);
glmatrixmode (gl_procection);
аспект: = 1,0;
Glupersperive (45,0, аспект, 3,0,7,0);
glmatrixmode (gl_modelview);
neal_plane: = 0,3;
maxobjectsize: = 0,3;
радиус: = neal_plane+maxobjectsize/2.0;
широта: = 0,3;
долгота: = 0,6;
конец;
Процедура tfrmmain.timer1timer (отправитель: tobject);
начинать
таймер1.Включено:=ложь;
Mydraw;
Урожай;
Timer1.enabled: = true;
конец;
Процедура tfrmmain.formClose (отправитель: tobject; var action: tcloseaction);
начинать
таймер1.Включено:=ложь;
Если hrc <> null, тогда
wgldeleteContext (HRC);
конец;
Процедура tfrmmain.setlighting;
вар
Материал: массив [1..4] из Glfloat;
MateriAldiffuse: Array [1..4] Glfloat;
Material Specular: массив [1..4] Glfloat;
AmbientlightPosition: массив [1..4] Glfloat;
Lightambient: массив [1..4] Glfloat;
Материал -утешитель: GLFLOAT;
начинать
MaterialMabient [1]: = 0,5;
MaterialMabient [2]: = 0,8;
MaterialMam [1]: = 0,2;
MaterialMabient [1]: = 1,0;
MateriAldiffuse [1]: = 0,4;
MateriAldiffuse [2]: = 0,8;
MateriAldiffuse [3]: = 0,1;
MateriAldiffuse [4]: = 1,0;
Material Specular [1]: = 1,0;
Material Specular [2]: = 0,5;
Material Specular [3]: = 0,1;
Material Specular [4]: = 1,0;
Материал -утешитель: = 50,0;
AmbientlightPosition [1]: = 0,5;
AmbientlightPosition [2]: = 1,0;
AmbientlightPosition [3]: = 1,0;
AmbientlightPosition [4]: = 0,0;
Lightambient [1]: = 0,5;
Lightambient [2]: = 0,2;
Lightambient [3]: = 0,8;
Lightambient [4]: = 1,0;
glmaterialfv (gl_front, gl_ambient,@materialmbient);
glmaterialfv (gl_front, gl_diffuse,@materialdiffuse);
glmaterialfv (gl_front, gl_specular,@materialspecular);
glmaterialfv (gl_front, gl_shininess,@materialshininess);
gllightfv (gl_light0, gl_position,@ambientlightposition);
gllightmodelfv (gl_light_model_ambient,@lightambient);
glenable (gl_lighting);
glenable (gl_light0);
Glshademodel (gl_smooth);
конец;
Процедура tfrmmain.settextures;
вар
Биты: массив [1..64,1..64,1..64] Глубита;
BMP: TBITMAP;
я, J: целое число;
начинать
bmp: = tbitmap.create;
bmp.loadfromfile ('d: /dsoft/1119/02/logon.bmp');
для i: = от 1 до 64
для j: = от 1 до 64
начинать
биты [i, j, 1]: = glbyte (getrvalue (bmp.canvas.pixels [i, j]));
биты [i, j, 2]: = glbyte (getrvalue (bmp.canvas.pixels [i, j]));
биты [i, j, 3]: = glbyte (getrvalue (bmp.canvas.pixels [i, j]));
Биты [i, J, 4]: = 255;
конец;
glpixelstorei (gl_unpack_alenment, 4);
gltexparameteri (gl_texture_2d, gl_texture_wrap_s, gl_clamp);
gltexparameteri (gl_texture_2d, gl_texture_mag_filter, gl_nearest);
gltexparameteri (gl_texture_2d, gl_texture_min_filter, gl_nearest);
{0 представляет один уровень затенения цвета, GL_RGBA представляет смешанное значение
64x64 представляет высоту и ширину текстуры, 0 не представляет границы,
GL_RGBA представляет тип текстуры, GL_UNSIGNED_TYPE представляет тип данных, адрес объекта @Generation}
glteximage2d (gl_texture_2d, 0, gl_rgba, 64,64,0, gl_rgba,
Gl_unsigned_byte,@bits);
glenable (gl_texture_2d);
gltexenvf (gl_texture_env, gl_texture_env_mode, gl_decal);
конец;
конец.