II после описания списков quadric-объекты больше не нужны gluDeleteQuadrlc (Quadric);
Это очень важно, поэтому хочу еще раз повторить: дисплейные списки в таких случаях являются крайне эффективным решением, иначе бы нам приходилось подготавливать и переключать образы текстуры многократно, для каждого кадра.
При описании списка мы обращаемся к процедуре чтения файла Preparelmage. Здесь мог бы быть и более обширный код, но в дисплейный список компилируется только одна единственная строка, строка с подготовкой текстуры. При вызове списка все промежуточные строки не вызываются, файл не считывается и, в принципе, вы можете его даже удалить, т. к. он больше не используется. Если у вас сломался телефон то отремонтировать его быстро и недорого можете тут: http://bimar.ru/.
По сценарию Земля вращается вокруг своей оси, а Луна вращается в противоположную Земле сторону:
glPushMatrix;
glRotatef {-10, 0.0, 1.0, 0-0);
glRotatef {Angle, 0.0, 0.0, 1.0); // поворот Земли вохруг своей оси glCallList(Earth); glPopMatrix;
U для Луны необходимо добавить вращение вокруг своей оси glPushMatrix;
glRotatef (-Angle, 0.0, 0.0, 1.0); // угол вращения противоположный glCallList{Moon); glPopMatrix;
Рис. 4.62. Только континенты непрозрачны
Переходим к следующему примеру, проекту из подкаталога Ех89, в котором показывается работа с полупрозрачной текстурой (рис. 4.62).
// !!! — при подготовке текстуры добавился альфа-компонент glTexImage2d(GL_TEXTURE_2D, 0, 3, biWidth, biHeight, 0,
GL_RGBA, // гдесь надо было скорректировать GL_UNSIGNED_BYTE, DataA);
При описании списка не забываем сортировать многоугольники, иначе появится ненужный узор:
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRCALPHA) ; glNewList (Earth, GLCCMPILE); Preparelmage ('..\earth.bmp');
ft оптимальнее включать режимы только при необходимости glEnabie (GL_BLEND);
glEnabie (GL__CULL_FACE) ; // сортировка многоугольников glCullFace(GL_FRONT); gluSphere Quadric, 1.0, 24, 24); glCullFace(GL_BACK); gluSphere (Quadric, 1.0, 24, 24); glDisable(GL_CULL_FACE); // отключаем режимы glDisable (GL_BLEND)i glEndList;
Думаю, здесь все понятно, и мы можем перейти к следующему примеру, чтобы научиться накладывать несколько текстур, что реализуется в проекте из подкаталога Ех90 (рис. 4.63)
Код процедуры подготовки текстуры ничем не отличается от предыдущего, только поверхность океанов сделана более "плотной".
|