Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
комп графика Лекции.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
200 Кб
Скачать
☆

Привязка координат текстуры к объекту

В 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;

{=========================================================}