Возможно, вы захотите использовать для своих проектов традиционную для демонстрационных программ текстуру в виде кирпичной кладки, тогда можете взять в качестве шаблона проект из подкаталога Ех85, где найдете все необходимые "стройматериалы".
Но чаще всего вы будете нуждаться в том. чтобы использовать текстуру, загружаемую из файла. Следующие примеры помогут нам разобраться, как это сделать.
Замечание
Поскольку я установил ограничение для примеров этой книги, содержащееся в том, что все они должны компилироваться в Delphi третьей версии, то буду использовать bmp-файлы. В старших версиях среды вы легко можете использовать другие формвты. что будет экономнее по отношению к дисковому про* странству.
Рис. 4.S9 показывает один из моментов работы примера из подкаталога Ех86, в котором образ текстуры загружается из Ьглр-файла.
Файл картинки я позаимствовал из дистрибутива С++ Builder 4.0.
/ красным на Селом For i:=0 to height-1 do
For j:=»0 to width - 1 do begin p := i*width+j;
if (texl[(height-i-l)*width+j])<>0 then begin
texlpl[01 tex[p)[1] texlp)[2]
end
255;
0,-
0;
else begin
textp]10] :- 255
texlp]II] :- 255
tex[p][2] :- 255 end
end;
//
glTexImage2D( GL_TEXTURE_2D, 0, 3, width, height, 0,
GL_RGB, GL_UNSIGNED_BYTE, Btex); glTexParameteri! GL__TEXTURE_2D, GL_TEXTURE_MI N_FI LTER, GLNEAREST); glTexParameteri { GL_TEXTURE_2D, GLJTEXTUREMAGFILTER, GLNEAREST) ; If not HaveTexObj then glEndList;
Перед рисованием примитивов вызывается нужный список: giPushMatrix;
glTranslatef! -1.0, 0.0, 0.0);
giRotatef! Angle, 0.0, 0.0, 1.0];
glTexCoord2f ( 0.0, 0.0) glTexCoord2f( 1.0, 0.0) glTexCoord2f( 1.0, glTexCoord2f( 0.0, glEnd; glPopMatrix;
if HaveTexObj // какой из типов списков вызывать then glBindTexture ( GL_TEXTURE_2D, TexObj[0J) else glCallList { TexObj [0]);//здесь хранятся только параметры
giBegin ( GL_POLYG0N) ,-
1.0) 1.0)
glVertex2f( -1.0, -1.0) glVertex2f( 1.0, -1.0] glVertex 1.0, 1.0) glVertex2f( -1.0, 1.0)
В конце работы, как это принято в среде культурных программистов, память освобождается:
if HaveTexObj
then glDeleteTextures { 2, GTexObj) // для текстурных спискоэ else glDeleteLists (TexObj[0], 2);
|