Визуальные эффекты
Использование искажения координат текстуры открывает перед нами столь широкие возможности, что единственным ограничением является только наша фантазия.
Я бы мог привести еще массу примеров на использование текстуры в OpenGL, однако чувствую потребность остановиться, чтобы дать вам возможность самим попробовать свои силы. Если вы ищете прикольные http://ruapple.net/ringtony_dlya_iphone.html то скачать их бесплатно можете тут: ruapple.net.
Рис. 4.70. В качестве образа текстуры можно взять часть экрана
Нет, все-таки не удержусь и приведу еше один (последний) пример, проект из подкаталога Ех96, иллюстрирующий, как подготовить текстуру на основе образа, считанного прямо с экрана, чтобы получить эффект увеличения (рис. 4.70).
В примере на экране находится лупа, которая передвигается с помощью клавиш управления курсором.
Собственно лупа представляет собой полусферу. Обратите внимание, что кривизну сферы можно менять для варьирования величины искажений:
const
eqn : Array [0..3] of GLdouble = (0.0, -1.0, 0.0, 0.0);
glNewList (Zoom, GL_COMPILE);
glClipPlane (GL_CLIP_PLANE0, @eqn); glEnabie (GL_CLIP_PLANE0);
glScalef (1.0, 0.15, 1.0); // уменьшаем кривизну полусферы glEnabie(GL_TEXTURE_2D); gluSphere (Quadric, 0.5, 24, 24);
glDisable(GL_TEXTURE_2D); glDisable (GL_CLIP_PLANEOj; glEndList;
После воспроизведения основного объекта, планеты, считываем в массив часть экрана, затем используем этот массив в качестве образа для текстуры, накладываемой на полусферу
glReadPixels (posX, posY, 128, 128, GLRGB, GLUNSIGNEDBYTE, GPixels); glPushMatrix;
gITranslatef (AddX, -5.0, AddZ);
glTexImage2d(GL_TEXTURE_2D, 0, 3, 128, 128,
0, GL_RGB, GL_UNSIGNED__BYTE, SPixels) ;
glCallList(Zoom); glPopMatrix.
На этом примере главу 4 действительно можно считать законченной |