Теоретическая часть

Для работы с текстурами и трехмерными объектами необходимо включить соответствующие режимы:

glEnable(GL_TEXTURES_2D);

glEnable(GL_DEPTH_TEST);

Для загрузки текстуры в память видеокарты можно использовать следующую функцию:

function CreateTexture: GLuint;

var i, j, texIndex: GLint;

_texture: array of GLubyte;

pb: PByteArray;

img: TBitmap;

begin

Result := 0;

// Регистрация текстуры

glGenTextures(1, @Result);

glBindTexture(GL_TEXTURE_2D, Result);

// Открытие изображения

img := TBitmap.Create;

img.LoadFromFile('');

// Считывание изображения

SetLength(_texture, img.Width * img.Height * 4);

texIndex := 0;

for j:=img.Height-1 downto 0 do

begin

pb := img.Scanline[j];

for i:=0 to img.Width-1 do

begin

_texture[texIndex] := pb[i*3+2];

_texture[texIndex+1] := pb[i*3+1];

_texture[texIndex+2] := pb[i*3+0];

_texture[texIndex+3] := 0;

texIndex := texIndex + 4;

end;

end;

// Настройка и загрузка изображения в текстуру

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, img.Width, img.Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, @_texture[0]);

SetLength(_texture, 0);

end;

 

 

Построение куба с указанием текстурных координат

glBegin(GL_QUADS);

glTexCoord2f(0, 0); glVertex3f(-1, -1, -1);

glTexCoord2f(1, 0); glVertex3f(1, -1, -1);

glTexCoord2f(1, 1); glVertex3f(1, 1, -1);

glTexCoord2f(0, 1); glVertex3f(-1, 1, -1);

 

glTexCoord2f(0, 0); glVertex3f(-1, -1, 1);

glTexCoord2f(1, 0); glVertex3f(1, -1, 1);

glTexCoord2f(1, 1); glVertex3f(1, 1, 1);

glTexCoord2f(0, 1); glVertex3f(-1, 1, 1);

 

glTexCoord2f(0, 0); glVertex3f(1, -1, -1);

glTexCoord2f(1, 0); glVertex3f(1, 1, -1);

glTexCoord2f(1, 1); glVertex3f(1, 1, 1);

glTexCoord2f(0, 1); glVertex3f(1, -1, 1);

 

glTexCoord2f(0, 0); glVertex3f(-1, -1, -1);

glTexCoord2f(1, 0); glVertex3f(-1, 1, -1);

glTexCoord2f(1, 1); glVertex3f(-1, 1, 1);

glTexCoord2f(0, 1); glVertex3f(-1, -1, 1);

 

glTexCoord2f(0, 0); glVertex3f(-1, -1, -1);

glTexCoord2f(1, 0); glVertex3f(1, -1, -1);

glTexCoord2f(1, 1); glVertex3f(1, -1, 1);

glTexCoord2f(0, 1); glVertex3f(-1, -1, 1);

 

glTexCoord2f(0, 0); glVertex3f(-1, 1, -1);

glTexCoord2f(1, 0); glVertex3f(1, 1, -1);

glTexCoord2f(1, 1); glVertex3f(1, 1, 1);

glTexCoord2f(0, 1); glVertex3f(-1, 1, 1);

glEnd();

 

Установка камеры и перспективы

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

gluPerspective(90, ClientWidth/ClientHeight, 0.01, 200);

gluLookAt(distance * sin(_angleB) * cos(_angleA),

distance * sin(_angleB) * sin(_angleA),

distance * cos(_angleB),

0, 0, 0, 0, 1, 0);