Chapter 2
Быстрый старт

2.2  Давайте что-нибудь изобразим

Самым простым объектом, с помощью которого можно увидеть всю мощь OpenGL, является сфера. Давайте попытаемся ее изобразить. Для этого надо создать новый проект в VisualC++, выполните следующие действия:

  1. Запустите MSVisualC++6.0
  2. Щелкните меню File->New->Win32 Console Application.
  3. Выберете каталог и имя проекта, впишите - sphere, щелкните OK.

    Я все свои проекты держу на диске D в каталоге Projects. Projects ветвится дальше на подкатологи с базами данных, утилитами, графикой и Java-приложениями. В общем, старайтесь присваивать разумные имена и вести разумную структуру каталогов. Это очень серьезная проблема.

  4. Выберете An Empty Project, щелкните Finish.
  5. Cкопируйте в каталог вашего проекта мой шаблон glaux.c и переименуйте его в sphere.c
  6. Присоедините его к проекту. Project->Add To Project->Files
  7. Щелкните Build->Set Active Configuration и установите тип проекта sphere - Win32 Release
  8. Далее, щелкайте Project->Settings->Link->Object/library modules и добавьте туда opengl32.lib, glu32.lib и glaux.lib
  9. Вставьте в функцию display следующий код:
          glColor3d(1,0,0);
          auxSolidSphere(1);
       
  10. Теперь откомпилируйте и запустите Вашу программу.
    Меню Build->Execute Sphere.exe


Исходный файл смотрите здесь. Исполняемый файл здесь.

     Тперь поясню назначение тех двух функций, что вы вставили в пункте 9. Функция glColor3d устанавливает текущий цвет, которым будут рисоваться фигуры. Тут нужно пояснить, как устанавливается цвет, и общую философию в названии функций OpenGL. Цвет устанавливается четырьмя параметрами: красный, синий, зеленый и прозрачность. Эти параметры вариируются в диапозоне от нуля до единицы. Четвертый параметр нам пока не нужен, поэтому мы вызвали glColor с тремя параметрами. В этом случае, значение четвертого параметра, прозрачности, по умолчанию считается равным единице, т.е. абсолютно непрозрачным, ноль - будет абсолютно прозрачным. Так как в языке Си нет перегрузки функций, то применяется следующий синтаксис вызова функций - FuncionName[n=число параметров][тип параметров]. Доступны следующие типы:

  • b - GLbyte байт
  • s - GLshort короткое целое
  • i - GLint целое
  • f - GLfloat дробное
  • d - GLdouble дробное с двойной точностью
  • ub - GLubyte беззнаковый байт
  • us - GLushort беззнаковое короткое целое
  • ui - GLuint беззнаковое целое
  • v - массив из n параметров указанного типа

     В нашем случае, glColor3d означает, что в функцию передаются три параметра типа GLdouble. Также можно было вызвать glColor3i, т.е. три параметра типа GLint. Если тип параметров короткое целое, целое, байт или длинное, то компонент цвета приводится к диапазону [0,1]. Приведение к этому диапазону осуществляется следующим образом. В случае беззнакового типа наибольшее возможное значение приводится к единице, ноль к нулю. В случае знакового типа максимальное значение приводится к единице или к минус единице, а минус единица будет приведена к единице. Мудрено, сразу и не поймешь. На практике вы будете пользоваться одним из трех случаев, рассмотренных в качестве примера ниже. Например, для беззнакового байта приведение будет осуществлено по следующей формуле: значение_переменной_хранимой_в_байте/255, т.к. 255 максимальное число, хранимое в одном байте. Функция glColor3dv означает, что в качестве параметров передается массив из трех элементов типа GLdouble. Например:

 double array[] = {0.5, 0.75, 0.3, 0.7};
 ...

 glColor3dv(array);
 glColor3ub(200,100,0);   // приводится к 200/256, 100/256, 0,256
 glColor3d(0.25,0.25,0);  // темно-желтый
 glColot3ub(0,100,0);     // темно-зеленый
 glColor3ub(0,0,255);     // синий

     Функция auxSolidSphere - рисует сферу в начале координат и единичным радиусом. Осещение, создание ламп и установку положения камеры мы рассмотрим чуть позже, а пока давайте по-лучше освоимся и почувствуем, насколько здесь все просто. Первую программу под моим руководством вы уже написали. Теперь выполните самостоятельные упражнения.