void spinner(void)
{
// alter angles by small amount
8.5. Добавление текстуры к граням
// изменяем углы на малую величину
xAngle +- xSpeed: уAngle +- ySpeed: displayO;
)
//««««««««««« main »»»>»»»»»»»»»»»»
void main(int arge, char **argv)
{
glutlnitC&argc, argv):
glutInitDisplayMode(GLUT_DOUBLE | GLUTJGB | GLUT_DEPTH) ; glutInitwindowSize(640.480): glutlnitwindowPositiondO, 10): glutCreateWindowCrotating textured cube"): // «вращающийся текстурированный куб» glutOisplayFuncCdi splay): mylnitO:
glutldleFunc(spinner): glutMainLoopO:
}
Для отображения текстуры можно применять различные вариации показанных здесь параметров. Приведенная версия программы работает хорошо, однако тщательной настройкой некоторых параметров (руководствуясь документацией по OpenGL) можно улучшить качество изображений или повысить эффективность алгоритма. Мы рассмотрим только суть основных подпрограмм.
При добавлении текстуры к изображению одной из первых задач является создание «пиксельной карты» (pixmap) этой текстуры в памяти. Подробно пиксельные карты рассматриваются в главе 10, там же определяется класс RGBpixmap, который предоставляет инструменты для создания пиксельных карт и управления ими. Здесь же мы будем рассматривать пиксельную карту как простой массив значений пикселов, каждый элемент которого является тройкой байт для хранения значений красного, зеленого и синего цветов:
class RGB{
// holds a color triple-each with 256 possible values // хранит цветовую тройку - каждая с 256 допустимыми значениями public: unsigned char r.g.b:
}:
Класс RGBpixmap хранит количество строк и стобцов пиксельной карты, а также адрес первого пиксела в памяти:
class RGBpixmap{ public:
int nRows.nCols: // dimensions of the pixmap // размерности пиксельной карты
RGB* pixel; // array of pixels // массив пикселов
int readBMPFileCchar * fname): // read BMP file into this pixmap // читаем BMP-файл в данную пиксельную карту