Продолжаем. На очереди текстуры.
Сначала под текстуру надо выделить место:
Код:
CREATE MyTexture[] 64 64 * CELLS ALLOT
Текстуру надо чем-то заполнить. Например, полноцветным (24 бита на пиксел) bmp-файлом. Это можно сделать и без отдельной библиотеки для работы с bmp, учитывая то, что заголовок занимает 54 байта, а дальше идут данные. Например, вот так (имеется в виду, что у нас уже есть файл размером 64 на 64):
Код:
: LoadHishnik
" avatar.bmp" OPEN TO HF-OUT
HF-OUT MyTexture[] 54 READFILE
HF-OUT MyTexture[] 64 64 * 3 * READFILE
HF-OUT CLOSE
;
Идем дальше. Теперь надо текстуру правильно разместить в пространстве, ну и заодно в каких-то размерах (ведь не 64 на 64 же?). Для этого создаем текстурные координаты:
Код:
CREATE TexPoint0 0.0 F, 0.0 F, 0.0 F,
CREATE TexPoint1 1.0 F, 0.0 F, 0.0 F,
CREATE TexPoint2 1.0 F, 1.0 F, 0.0 F,
CREATE TexPoint3 0.0 F, 1.0 F, 0.0 F,
Можно убедиться, что это координаты углов квадрата со стороной 1. Потом мы их будем использовать.
Код:
: PREPARE_TEXTURE
GL_TEXTURE_2D GL_TEXTURE_MAG_FILTER GL_LINEAR glTexParameteri
GL_TEXTURE_2D GL_TEXTURE_MIN_FILTER GL_LINEAR glTexParameteri
GL_TEXTURE_2D 0 3
64 64 0 GL_RGB GL_UNSIGNED_BYTE MyTexture[]
glTexImage2D
;
Вот тут, в слове PREPARE_TEXTURE, мы описываем, что это все означает. Первые две строчки задают тип масштабирования. Это нужно затем, чтобы понять, что делать с текстурой, которую надо отобразить, к примеру, в 37 на 25 пикселов. Тут написано GL_LINEAR, что означает линейную интерполяцию.
Дальше идет сложная функция glTexImage2D. У нее куча параметров. Можно заметить среди них размеры (64 64), и формат (GL_RGB GL_UNSIGNED_BYTE - то есть пикселы в формате RGB, каждый цвет - беззнаковый байт). Здесь проще сверяться с документацией.
Наконец, задаем саму текстуру. Во-первых, разрешаем ее использование (GL_TEXTURE_2D glEnable). Потом нужно будет его запретить, а то она будет рисоваться везде. Во-вторых, рисуем фигуру, на которой и будет текстура, это GL_QUADS
Код:
: TEXTURE
GL_TEXTURE_2D glEnable
GL_QUADS glBegin
TexPoint0 glTexCoord2dv TexPoint0 glVertex3dv
TexPoint1 glTexCoord2dv TexPoint1 glVertex3dv
TexPoint2 glTexCoord2dv TexPoint2 glVertex3dv
TexPoint3 glTexCoord2dv TexPoint3 glVertex3dv
glEnd
GL_TEXTURE_2D glDisable
;
Теперь делаем копипаст из предыдущего примера, чтобы все это так же вращалось.
Код:
: SHOW-TEXTURE
0 0 500 500 glViewPort
glPushMatrix
GL_DEPTH_TEST glEnable
GL_DEPTH_BUFFER_BIT glClear
GL_LIGHTING glEnable
GL_LIGHT0 glEnable
GL_LIGHT1 glEnable
GL_COLOR_MATERIAL glEnable
GL_LINE_SMOOTH glEnable
0 0x7FFFFFFF 0 glColor3i
NX F@ ROTATEANGLE SF!
1.0 glX SF!
0.0 glY SF!
0.0 glZ SF!
3DROTATE
NY F@ ROTATEANGLE SF! // -120
0.0 glX SF!
1.0 glY SF!
0.0 glZ SF!
3DROTATE
NZ F@ ROTATEANGLE SF! // 100
0.0 glX SF!
0.0 glY SF!
1.0 glZ SF!
3DROTATE
// начинается текстура:
// линии координат по трем осям
GL_LINES glBegin
Point1 glVertex3dv
Point2 glVertex3dv
glEnd
GL_LINES glBegin
Point3 glVertex3dv
Point4 glVertex3dv
glEnd
GL_LINES glBegin
Point5 glVertex3dv
Point6 glVertex3dv
glEnd
0x7FFFFFFF DUP DUP glColor3i
// рисуем
PREPARE_TEXTURE
TEXTURE
glPopMatrix
;
' SHOW-TEXTURE TO 3D
У меня, с учетом добавленной картинки, крутится вот такой оптимистичный кошак
Вложение:
quark9.gif [ 50.4 Кб | Просмотров: 20232 ]