Теоретическая часть
Для работы с текстурами и трехмерными объектами необходимо включить соответствующие режимы:
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);