Основы компьютерной графики для программистов. Казанцев А.В. - 89 стр.

UptoLike

Составители: 

Основы компьютерной графики для программистов 89
____________________________________________________________________________________________________________________
http://www.ksu.ru/persons/9134.ru.html
GL_GREEN, GL_BLUE, GL_ALPHA, GL_RGB, GL_RGBA, GL_LUMINANCE,
GL_LUMINANCE_ALPHA.
Предпоследний, восьмой параметр определяет значение
типа данных для каждой пиксельной компоненты:
GL_UNSIGNED_BYTE, GL_BYTE,
GL_BITMAP, GL_UNSIGNED_SHORT, GL_SHORT, GL_UNSIGNED_INT, GL_INT,
GL_FLOAT
. Последний параметр представляет собой указатель на начало области
данных текстуры. В нашем случае это переменная
bits, описана как указатель на массив
байт. Возможно, вас смутил тип данных
TBits = Array [0..0] of GLUbyte;
Действительно, такое описание выглядит как ошибка в программе. Однако, это сделано
специально. Данная функция должна компилироваться с выключенной опцией на
проверку допустимых диапазонов {$R-}. Тогда блок памяти
bits в программе мы можем
рассматривать как массив байт произвольной длины, и использовать обычный
синтаксис Object Pascal для доступа к его элементам. Конечно, контроль выхода за
пределы области памяти такого массива мы должны полностью брать на себя.
После загрузки образа текстуры в память следует указать грань или грани трехмерных
объектов, на которые будет
осуществляться наложение текстуры. Здесь мы подходим к
определению
координат текстуры. Необходимо установить соответствие между
вершинами граней трехмерного объекта и местом на текстуре, которое каждой вершине
соответствует. Начало системы координат текстуры расположено в левом нижнем углу
прямоугольного рисунка текстуры. Ось s, подобно оси абсцисс направлена слева
направо по нижней кромке рисунка, а ось t, аналогично оси ординат направлена снизу
вверх. Границы прямоугольника изображения
текстуры задают диапазон изменения
значений координат
s и t от 0 до 1.
Рассмотрим пример создания прямоугольника в трехмерном пространстве и наложение
на него изображения корабля из файла
Ship.bmp размером 64х64 пиксела. Здесь
используется возможность создания так называемых
дисплейных списков OpenGL,
которые позволяют объединить длинные последовательности команд OpenGL под
одним названием и запускать их на выполнение. Дисплейные списки позволяют между
командами OpenGL выполнять и другие операторы, но, в отличие от обычных
процедур и функций, запоминаются в списке только команды OpenGL. При
последующем выполнении команд дисплейного списка обычные операторы не
выполняются.
Const
Quad: GLInt=1;//идентификатор дисплейного списка
Ship: pointer;
. . .
glNewList(Quad,GL_COMPILE);//создаем новый дисплейный список
Ship:= LoadBmpTexture(64,64,'Ship.bmp');//загружаем текстуру в
//память
glBegin (GL_QUADS);//задаем тип примитива - четырехугольники
glTexCoord2d (0.0, 0.0);//левый нижний угол текстуры
glVertex3f (-8.0, -8.0, 15.0);
glTexCoord2d (1.0, 0.0); //правый нижний угол текстуры
glVertex3f (8.0, -8.0, 22.0);
glTexCoord2d (1.0,0.8);//верхняя часть изображения будет слегка
//приплюснута
Основы компьютерной графики для программистов                                                                  89
____________________________________________________________________________________________________________________



GL_GREEN, GL_BLUE, GL_ALPHA, GL_RGB, GL_RGBA, GL_LUMINANCE,
GL_LUMINANCE_ALPHA. Предпоследний, восьмой параметр определяет значение
типа данных для каждой пиксельной компоненты: GL_UNSIGNED_BYTE, GL_BYTE,
GL_BITMAP, GL_UNSIGNED_SHORT, GL_SHORT, GL_UNSIGNED_INT, GL_INT,
GL_FLOAT. Последний параметр представляет собой указатель на начало области
данных текстуры. В нашем случае это переменная bits, описана как указатель на массив
байт. Возможно, вас смутил тип данных

             TBits = Array [0..0] of GLUbyte;

Действительно, такое описание выглядит как ошибка в программе. Однако, это сделано
специально. Данная функция должна компилироваться с выключенной опцией на
проверку допустимых диапазонов {$R-}. Тогда блок памяти bits в программе мы можем
рассматривать как массив байт произвольной длины, и использовать обычный
синтаксис Object Pascal для доступа к его элементам. Конечно, контроль выхода за
пределы области памяти такого массива мы должны полностью брать на себя.
После загрузки образа текстуры в память следует указать грань или грани трехмерных
объектов, на которые будет осуществляться наложение текстуры. Здесь мы подходим к
определению координат текстуры. Необходимо установить соответствие между
вершинами граней трехмерного объекта и местом на текстуре, которое каждой вершине
соответствует. Начало системы координат текстуры расположено в левом нижнем углу
прямоугольного рисунка текстуры. Ось s, подобно оси абсцисс направлена слева
направо по нижней кромке рисунка, а ось t, аналогично оси ординат направлена снизу
вверх. Границы прямоугольника изображения текстуры задают диапазон изменения
значений координат s и t от 0 до 1.
Рассмотрим пример создания прямоугольника в трехмерном пространстве и наложение
на него изображения корабля из файла Ship.bmp размером 64х64 пиксела. Здесь
используется возможность создания так называемых дисплейных списков OpenGL,
которые позволяют объединить длинные последовательности команд OpenGL под
одним названием и запускать их на выполнение. Дисплейные списки позволяют между
командами OpenGL выполнять и другие операторы, но, в отличие от обычных
процедур и функций, запоминаются в списке только команды OpenGL. При
последующем выполнении команд дисплейного списка обычные операторы не
выполняются.


Const
             Quad: GLInt=1;//идентификатор дисплейного списка
             Ship: pointer;
. . .
glNewList(Quad,GL_COMPILE);//создаем новый дисплейный список
 Ship:= LoadBmpTexture(64,64,'Ship.bmp');//загружаем текстуру в
//память
    glBegin (GL_QUADS);//задаем тип примитива - четырехугольники
         glTexCoord2d (0.0, 0.0);//левый нижний угол текстуры
         glVertex3f (-8.0, -8.0, 15.0);
     glTexCoord2d (1.0, 0.0); //правый нижний угол текстуры
         glVertex3f (8.0, -8.0, 22.0);
     glTexCoord2d (1.0,0.8);//верхняя часть изображения будет слегка
//приплюснута

http://www.ksu.ru/persons/9134.ru.html