Софт-Архив

Установить Opengl img-1

Установить Opengl

Рейтинг: 4.8/5.0 (1877 проголосовавших)

Описание

Chapter 2

Chapter 2. Быстрый старт 2.1 Устанавливаем OpenGL

Начнем с самого главного, установим необходимое программное обеспечение. Я предполагаю, что Windows у Вас уже установлен и работает, в противном случае вы купили не ту книгу. Во-первых, установите MSVisualC++6.0 и jdk113 или выше, если вам интересно узнать о написание java-апплетов с использованием OpenGL. Впрочем java понадобится вам только в седьмой главе. Во-вторых, нам понадобится реализация библиотеки OpenGL. Она входит в поставку Windows95/NT - это библиотеки opengl32.dll & glu32.dll. Вы также можете взять библиотеки OpenGL от Silicon Graphics. Инструкция по установке там прилагается. Вам придется скопировать opengl.dll и glu.dll в windows\system и положить opengl.lib, glu.lib в подкаталог Lib, где установлено MSVisualC++. В-третьих, вам понадобятся четыре моих программы-шаблона, которые представляют собой начальный скелет, который мы потом будем наполнять функциональностью. Где взять OpenGL от Silicon Graphics, Magician, jdk и мои программы-шаблоны, смотри в приложение 'А'.

2.2 Давайте что-нибудь изобразим Самым простым объектом, с помощью которого можно увидеть всю мощь OpenGL, является сфера. Давайте попытаемся ее изобразить. Для этого надо создать новый проект в VisualC++, выполните следующие действия:
  1. Запустите MSVisualC++6.0
  2. Щелкните меню File->New->Win32 Console Application.
  3. Выберете каталог и имя проекта, впишите - sphere, щелкните OK.
Я все свои проекты держу на диске D в каталоге Projects. Projects ветвится дальше на подкаталоги с базами данных, утилитами, графикой и Java-приложениями. В общем, старайтесь присваивать разумные имена и вести разумную структуру каталогов. Это очень серьезная проблема.
  • Выберете An Empty Project, щелкните Finish.
  • Cкопируйте в каталог вашего проекта мой шаблон glaux.c и переименуйте его в sphere.c
  • Присоедините его к проекту. Project->Add To Project->Files
  • Щелкните Build->Set Active Configuration и установите тип проекта sphere - Win32 Release
  • Далее, щелкайте Project->Settings->Link->Object/library modules и добавьте туда opengl32.lib, glu32.lib и glaux.lib
  • Вставьте в функцию display следующий код:
  • Теперь откомпилируйте и запустите Вашу программу.

    Меню 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. Например:

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

    2.3 Упражнение: "Трехмерные фигуры" Замените функцию auxSolidSphere на функцию, из указанных ниже с соответствующими параметрами. Значения параметров устанавливайте порядка единицы - 0.5-1.7. Если вы укажете слишком маленький размер, фигуру будет плохо видно; если слишком большой, то она получится урезанной. Это связано с тем, что ее край, как бы вылезет из монитора.
    • auxSolidCube(width) // куб
    • auxSolidBox(width, height, depth) // коробка
    • auxSolidTorus(r,R) // тор
    • auxSolidCylinder(r,height) // цилиндр
    • auxSolidCone(r,height) // конус
    • auxSolidIcosahedron(width) // многогранники
    • auxSolidOctahedron(width)
    • auxSolidTetrahedron(width)
    • auxSolidDodecahedron(width)
    • auxSolidTeapot(width) // рисует чайник

    С помощью выше указанных функций вы можете рисовать сплошные фигуры. Если вам надо нарисовать проволочную, то вместо Solid пишите Wire.

    2.4 Переход к новым координатам Продолжим рисовать трехмерные фигуры. В предыдущем параграфе вы научились рисовать примитивные трехмерные объекты. Но проблема в том, что они рисуются только в начале координат, т.е. в точке (0,0,0). Для того чтобы изобразить сферу в точке ( x0 ,y0 ,z0 ), надо переместить начало координат в эту точку, т.е. надо перейти к новым координатам. Эта процедура довольно распространенная при программировании графики и анимации. Часто, бывает очень удобно, сместить координаты в новую точку и повернуть их на требуемый угол, и ваши расчеты резко упростятся. Конкретный пример мы рассмотрим ниже, когда научимся программировать анимацию. А пока вы узнаете, как переходить к новым координатам. Для перехода к новым координатам в OpenGL есть две функции:
    • glTranslated( D x, D y, D z )
    • glRotated( j ,x0 ,y0 ,z0 )
    Первая функция сдвигает начало системы координат на ( D x, D y, D z ). Вторая - поворачивает на угол j против часовой стрелки вокруг вектора (x0,y0,z0). Теперь, стоит сказать еще о двух очень важных функциях:
    • glPushMatrix()
    • glPopMatrix()

    Они предназначены для сохранения и восстановления текущих координат. Я не стал здесь приводить пример на то, как неудобно переходить от одной системы координат к другой и помнить все ваши переходы. Гораздо удобнее с помощью glPushMatrix() сохранить текущие координаты, потом сдвигаться, вертеться, как вам угодно, а после, вызовом glPopMatrix вернуться к старым координатам. Итак, настало время поэкспериментировать. Создайте новый проект, повторив пункты из раздела 2.2. Только назовите его sphere2. Сначала мы рассмотрим сдвиг координат. Вставьте в функцию display следующий код:

    Теперь откомпилируйте и запустите вашу программу.

    Меню Build->Execute Sphere.exe

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

    В общем-то, из комментариев многое понятно. Обращаю ваше внимание только на два последних вызова auxSolidSphere. Перед вызовом glPopMatrix сфера рисуется в точке (2,0,0), а после, в точке (0,0,0).

    2.5 Упражнение: "Cписок трехмерных фигур"

    Используя список функций из предыдущего упражнения, нарисуйте эти фигуры в два столбца. Слева проволочные. Справа сплошные.

    Примечание: тут хочу заметить, что в версии glaux.lib от фирмы Microsoft имеется следующий баг: цилиндр и конус рисуются всегда либо проволочными, либо сплошными. Если вы первый цилиндр/конус в программе нарисовали проволочным, то далее все цилиндры/конусы будут проволочными. Соответственно, если первой была сплошная фигура, то далее все будут сплошные. Поэтому, не стоит паниковать. Это ошибка Microsoft. Могу также вас порадовать, что ниже я расскажу, как обойти эту проблему.

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

    2.6 Поворот координат

    Теперь рассмотрим вращение координат. Создайте новый проект с именем Rotate. Переименуйте glaux.c в rotate.c В функцию display вставьте следующий код:

    Как видите, конус повернулся в абсолютных координатах. Так что, для того, чтобы нарисовать фигуру не в начале координат, надо:
    1. сохранить текущие координаты
    2. сдвинуть(glTranslated), повернуть(glRotated)
    3. нарисовать то, что хотели
    4. вернуться к старым координатам

    Вызовы glPushMatrixglPopMatrix могут быть вложенными, т.е.

    Естественно число вызовов glPopMatrix должно соответствовать числу вызовов glPushMatrix, иначе у вас сцена улетит в неизвестном направление. Максимально допустимая глубина вложенности glPushMatrix/glPopMatrix определяется следующим образом:

    Спецификация на OpenGL гарантирует, что глубина стека не может быть меньше 32.

    2.7 Упражнение: "Снеговик"

    Используя функцию glRotate, нарисуйте снеговика. Три сферы, шапка - конус, нос - тоже конус, глаза - сфера, рот можно квадратным сделать - glBox.

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

    Примечание: Имеется еще один баг в glaux.lib от Microsoft. Кажется, последний из обнаруженных мной. Функция aux[Solid/Wire]Cylinder прежде, чем нарисовать цилиндр, сдвигает и поворачивает координаты. Так что, если вы уже сместили и повернули координаты, то цилиндр нарисуется совсем не там, где вы рассчитывали. Люди из Microsoft, конечно же, будут уверять, что это особенность, и предложат вам скачать очередной ServicePack.;-) А я ниже расскажу, как более правильно рисовать цилиндры и конусы. Если вам некогда ждать, то далее приведен исправленный код этих функций. Большинство из вас сейчас пропустят его и перейдут к следующему очень интересному разделу - "Анимация". И правильно сделаете. К исправлению ошибок вернетесь, когда немного освоитесь. Но я все же решил привести код по исправлению ошибок Microsoft именно здесь. Можете пересобрать glaux.lib, заменив соответствующий код в файле shapes.c. Где взять исходники, смотрите в приложение 'A'. По-моему, они есть в MSDN.

    2.8 Анимация

    Давайте оживим нашего снеговика и добавим интерактивность. Для этого надо отрисовывать кадры и реагировать на внешние события от клавиатуры или мыши. Для отрисовки кадров их надо как-то различать. Для этого мы в функции display вводим переменную time типа int с модификатором static. Создайте новый проект и в функцию display введите следующее: "static int time=0;". Модификатор static означает, что значение переменной будет сохраняться при выходе из функции. Начальное значение мы устанавливаем в ноль. Если функция display не зависит от времени, то счетчик кадров можно и не вести. Теперь добавьте следующие строчки:

    Запустив приложение, вы увидите, что снеговик пополз вдоль оси Х. Вот так вы можете делать анимацию. Т.е. теперь координаты объектов вычисляются в зависимости от времени. Я привел простой пример. Вообще говоря, для программирования сложной графики вам понадобится вычислять координаты каждого отдельного объекта в зависимости от времени.

    Далее мы рассмотрим пример с более сложной анимацией. Здесь вращается тор и его ось вращения. Я приведу исходный текст с подробными комментариями. Пример программы "Гироскоп":

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

    Как вы, наверное, догадались, надо создать очередной проект, скопировать туда мой шаблон, добавить его в проект, указать библиотеки opengl32.lib glu32.lib glaux.lib в Project->Setting->Link->Settings->Link->Object/library modules. вставить этот код в функцию display. Еще вам нужно в начале функции display вставить строку static int time=0; и закомментировать строчку glEnable(GL_LIGHTING) в функции main.

    Запустив это приложение, вы увидите, как оно работает. Теперь закомментируйте соответствующие друг другу вызовы glPushMatrix и glPopMatrix и посмотрите на результат. Я бы рекомендовал такой способ для изучения и понимания работы программы: вы комментируете куски кода и смотрите, что получается.

    Для того, чтобы реагировать на клавиатуру или мышь, вы должны определить функцию, которая будет вызываться при поступление событий от клавиатуры или мыши. Для кнопки клавиатуры вы определяете функцию со следующим прототипом void CALLBACK FunctionName(void) и устанавливаете ее как обработчик определенной кнопки - auxKeyFunc(key_code, FunctionName); key_code смотри в glaux.h. Пример: auxKeyFunc(AUX_LEFT, FunctionName) Здесь вы устанавливаете FunctionName как функцию, которая будет вызываться при нажатии на клавиатуре клавиши "стрелка влево".

    Для мыши вы устанавливаете свою функцию обработки событий мыши вызовом функции auxMouseFunc(int button,int action,AUXMOUSEPROC). Переменная button может принимать значения - AUX_LEFTBUTTON, AUX_MIDDLEBUTTON, AUX_RIGHTBUTTON. Переменная action принимает следующие значения - AUX_MOUSEDOWN, AUX_MOUSEUP, AUX_MOUSELOC. Функция AUXMOUSEPROC должна иметь прототип - void CALLBACK FunctionName(AUX_EVENTREC *event), где AUX_EVENTREC определено как

    Для более детальной информации смотрите справочные руководства и исходные тексты библиотеки OpenGL Auxiliary library. Эта книга об OpenGL, а не о программировании интерфейсов пользователя. Поэтому, за подобной информацией вам придется лезть в соответствующие справочные руководства по Win API, MFC, Java и т.п.

    В FunctionName вы можете изменить какую-нибудь глобальную переменную, и, соответственно, функция display будет рисовать кадры в зависимости от этой переменной.

    2.9 Упражнение:" Игра Арканоид"

    Напишите игру "Arconoid" - летающий шарик, снизу подставка, пользователь стрелками или мышкой управляет подставкой и отбивает шарик.

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

    2.10 Резюме

    На этом эта глава книги закончена. Вы научились рисовать трехмерные объекты и делать интерактивную анимацию, используя эти объекты. Этого, в общем-то, достаточно для написания примитивных программ. В следующей главе мы научимся рисовать примитивные объекты: точки, линии, ломаные и многоугольники.

    Другие статьи, обзоры программ, новости

    ATI Catalyst 10

    Каталог драйверов

    [ · Скачать драйвер (182.87 Mb) ]

    ATI Catalyst 10.7 Beta OpenGL ES 2.0 Это драйвера для видеокарт ATI Radeon с поддержкой стандарта WebGL, от компании ATI / AMD. В этот пакет драйверов, также входят набор для аудио чипов этой фирмы (ATI Function Driver for High Definition Audio). Драйвера предназначен для работы в операционных системах Windows 7, Windows Vista и Windows XP.

    Подробнее о пакете:

    Название: ATI Catalyst 10.7 Beta OpenGL ES 2.0

    (AMD Драйвер с поддержкой OpenGL ES 2.0 - стандарт WebGL)

    Дата выпуска: 18.07.2010.

    Версия Display Driver: 8.753.2.0000

    Верстя HD Audio Driver: 5.18.0.5504

    Операционная система: Windows Vista, Windows 7, Windows XP (32 / 64 бита)

    Поддерживаемые видеокарты Radeon: (VEN & DEV)

    "ATI All-in-Wonder HD" = PCI\VEN_1002&DEV_9598&SUBSYS_B3831002

    "ATI Radeon HD 2400 Pro" = PCI\VEN_1002&DEV_94C1&SUBSYS_10021002

    "ATI Radeon HD 2400 PRO" = PCI\VEN_1002&DEV_94C3&SUBSYS_03421002

    "ATI Radeon HD 2400 XT" = PCI\VEN_1002&DEV_94C1&SUBSYS_0D021002

    "ATI Radeon HD 2900 PRO" = PCI\VEN_1002&DEV_9400&SUBSYS_30001002

    "ATI Radeon HD 2900 XT" = PCI\VEN_1002&DEV_9400&SUBSYS_25521002

    "ATI Radeon HD 3690" = PCI\VEN_1002&DEV_9501&SUBSYS_30001002

    "ATI Radeon HD 3690" = PCI\VEN_1002&DEV_9505&SUBSYS_30001002

    "ATI Radeon HD 3850" = PCI\VEN_1002&DEV_9505&SUBSYS_25421002

    "ATI Radeon HD 3870" = PCI\VEN_1002&DEV_9501&SUBSYS_25421002

    "ATI Radeon HD 2350 Series" = PCI\VEN_1002&DEV_94C3&SUBSYS_30001025

    "ATI Radeon HD 2400" = PCI\VEN_1002&DEV_94C3&SUBSYS_04021028

    "ATI Radeon HD 2400 Pro" = PCI\VEN_1002&DEV_94C1&SUBSYS_0D021028

    "ATI Radeon HD 2400 PRO" = PCI\VEN_1002&DEV_94C3&SUBSYS_03021028

    "ATI Radeon HD 2400 PRO" = PCI\VEN_1002&DEV_94C3&SUBSYS_04021028

    "ATI Radeon HD 2400 XT " = PCI\VEN_1002&DEV_94C1&SUBSYS_0D021028

    "ASUS ARES" = PCI\VEN_1002&DEV_689C&SUBSYS_03521043

    "ATI Radeon HD 4570" = PCI\VEN_1002&DEV_9598&SUBSYS_30011043

    "ATI Radeon HD 4730" = PCI\VEN_1002&DEV_9505&SUBSYS_30011043

    "ATI Radeon HD 4800 Series" = PCI\VEN_1002&DEV_944A&SUBSYS_30001043

    "HD3730" = PCI\VEN_1002&DEV_9598&SUBSYS_30001043

    "RV610" = PCI\VEN_1002&DEV_94C0&SUBSYS_14B210CF

    "ATI Radeon HD 2400 PRO" = PCI\VEN_1002&DEV_94C3&SUBSYS_216A1458

    "ATI Radeon HD 2400 PRO" = PCI\VEN_1002&DEV_94C3&SUBSYS_21721458

    "ATI Radeon HD 2400 XT " = PCI\VEN_1002&DEV_94C1&SUBSYS_21741458

    "ATI Radeon HD 4800 Series" = PCI\VEN_1002&DEV_944A&SUBSYS_30001458

    "ATI Radeon HDG 4670" = PCI\VEN_1002&DEV_9498&SUBSYS_21CF1458

    "ATI Radeon HD 2400 " = PCI\VEN_1002&DEV_94C3&SUBSYS_11041462

    "ATI Radeon HD 2400 " = PCI\VEN_1002&DEV_94C3&SUBSYS_10411462

    "ATI Radeon HD 2400 " = PCI\VEN_1002&DEV_94C3&SUBSYS_11051462

    "ATI Radeon HD 2400 PRO" = PCI\VEN_1002&DEV_94C3&SUBSYS_10321462

    "ATI Radeon HD 2400 XT " = PCI\VEN_1002&DEV_94C1&SUBSYS_10401462

    "ATI Radeon HD 2400 XT " = PCI\VEN_1002&DEV_94C1&SUBSYS_10331462

    "ATI Radeon HD 2400 XT " = PCI\VEN_1002&DEV_94C1&SUBSYS_10331462

    "ATI Radeon HD 2400 XT " = PCI\VEN_1002&DEV_94C1&SUBSYS_11101462

    "ATI Radeon HD 3610" = PCI\VEN_1002&DEV_9589&SUBSYS_30001462

    "ATI Radeon HD 4800 Series" = PCI\VEN_1002&DEV_944A&SUBSYS_30001462

    "ATI Radeon HD 2350 Series" = PCI\VEN_1002&DEV_94C3&SUBSYS_3000148C

    "ATI Radeon HD 2400 LE" = PCI\VEN_1002&DEV_94C3&SUBSYS_2247148C

    "ATI Radeon HD 3450" = PCI\VEN_1002&DEV_95C5&SUBSYS_3000148C

    "ATI Radeon HD 3550" = PCI\VEN_1002&DEV_95C0&SUBSYS_3000148C

    "ATI Radeon HD 3550" = PCI\VEN_1002&DEV_95C5&SUBSYS_3001148C

    "ATI Radeon HD 3600 Series" = PCI\VEN_1002&DEV_9591&SUBSYS_2303148C

    "ATI Radeon HD 3730" = PCI\VEN_1002&DEV_9598&SUBSYS_3000148C

    "ATI Radeon HD 3850" = PCI\VEN_1002&DEV_9505&SUBSYS_3000148C

    "ATI Radeon HD 4230" = PCI\VEN_1002&DEV_95C5&SUBSYS_3002148C

    "ATI Radeon HD 4230" = PCI\VEN_1002&DEV_95C5&SUBSYS_3033148C

    "ATI Radeon HD 4250" = PCI\VEN_1002&DEV_95C5&SUBSYS_3003148C

    "ATI Radeon HD 4250" = PCI\VEN_1002&DEV_95C5&SUBSYS_3032148C

    "ATI Radeon HD 4570" = PCI\VEN_1002&DEV_9598&SUBSYS_3031148C

    "ATI Radeon HD 4580" = PCI\VEN_1002&DEV_9598&SUBSYS_3001148C

    "ATI Radeon HD 4730" = PCI\VEN_1002&DEV_9505&SUBSYS_3002148C

    "ATI Radeon HD 4730" = PCI\VEN_1002&DEV_9505&SUBSYS_3001148C

    "ATI Radeon HD 4750" = PCI\VEN_1002&DEV_9505&SUBSYS_3003148C

    "ATI Radeon HD 4750" = PCI\VEN_1002&DEV_9505&SUBSYS_3004148C

    "ATI Radeon HD 4800 Series " = PCI\VEN_1002&DEV_944A&SUBSYS_30001545

    "VisionTek Radeon HD 2600 Pro" = PCI\VEN_1002&DEV_9598&SUBSYS_30011545

    "VisionTek Radeon HD 2600 XT" = PCI\VEN_1002&DEV_9598&SUBSYS_30001545

    "ATI Radeon HD 2400 PRO" = PCI\VEN_1002&DEV_94C3&SUBSYS_37161642

    "ATI Radeon HD 3610" = PCI\VEN_1002&DEV_9589&SUBSYS_30001642

    "ATI Radeon HD 4550" = PCI\VEN_1002&DEV_954F&SUBSYS_29201682

    "ATI Radeon HD 4550" = PCI\VEN_1002&DEV_954F&SUBSYS_29211682

    "ATI Radeon HD 4650" = PCI\VEN_1002&DEV_9498&SUBSYS_24511682

    "ATI Radeon HD 4650" = PCI\VEN_1002&DEV_9498&SUBSYS_24521682

    "ATI Radeon HD 4650" = PCI\VEN_1002&DEV_9498&SUBSYS_24541682

    "ATI Radeon HD 4670" = PCI\VEN_1002&DEV_9498&SUBSYS_29331682

    "ATI Radeon HD 4670" = PCI\VEN_1002&DEV_9498&SUBSYS_29341682

    "ATI Radeon HD 4770" = PCI\VEN_1002&DEV_94B3&SUBSYS_29001682

    "ATI Radeon HD 4800 Series" = PCI\VEN_1002&DEV_944A&SUBSYS_30001682

    "ATI Radeon HD 4830" = PCI\VEN_1002&DEV_944C&SUBSYS_24801682

    "ATI Radeon HD 4830" = PCI\VEN_1002&DEV_944C&SUBSYS_24811682

    "ATI Radeon HD 4850" = PCI\VEN_1002&DEV_9442&SUBSYS_24701682

    "ATI Radeon HD 4850" = PCI\VEN_1002&DEV_9442&SUBSYS_24711682

    "ATI Radeon HD 4870" = PCI\VEN_1002&DEV_9440&SUBSYS_24401682

    "ATI Radeon HD 4870" = PCI\VEN_1002&DEV_9440&SUBSYS_24411682

    "ATI Radeon HD 4870" = PCI\VEN_1002&DEV_9440&SUBSYS_24441682

    "ATI Radeon HD 4870" = PCI\VEN_1002&DEV_9440&SUBSYS_24451682

    "ATI Radeon HD 4870 X2" = PCI\VEN_1002&DEV_9441&SUBSYS_24401682

    "XFX Radeon HD 4570" = PCI\VEN_1002&DEV_954F&SUBSYS_30901682

    "ATI Radeon HD 2350 Series" = PCI\VEN_1002&DEV_94C3&SUBSYS_3000174B

    "ATI Radeon HD 2400 PRO" = PCI\VEN_1002&DEV_94C3&SUBSYS_E400174B

    "ATI Radeon HD 2400 PRO" = PCI\VEN_1002&DEV_94C3&SUBSYS_E370174B

    "ATI Radeon HD 2400 PRO" = PCI\VEN_1002&DEV_94C3&SUBSYS_E400174B

    "ATI Radeon HD 2400 PRO" = PCI\VEN_1002&DEV_94C3&SUBSYS_E370174B

    "ATI Radeon HD 2400 PRO" = PCI\VEN_1002&DEV_94C3&SUBSYS_E400174B

    "ATI Radeon HD 3570" = PCI\VEN_1002&DEV_95C0&SUBSYS_3002174B

    "ATI Radeon HD 3600 Series" = PCI\VEN_1002&DEV_9589&SUBSYS_0E41174B

    "ATI Radeon HD 4250" = PCI\VEN_1002&DEV_95C5&SUBSYS_3010174B

    "ATI Radeon HD 4250" = PCI\VEN_1002&DEV_95C0&SUBSYS_3020174B

    "ATI Radeon HD 4250" = PCI\VEN_1002&DEV_95C5&SUBSYS_4250174B

    "ATI Radeon HD 4450" = PCI\VEN_1002&DEV_954F&SUBSYS_4450174B

    "ATI Radeon HD 4520" = PCI\VEN_1002&DEV_954F&SUBSYS_3000174B

    "ATI Radeon HD 4570" = PCI\VEN_1002&DEV_9598&SUBSYS_4570174B

    "ATI Radeon HD 4580" = PCI\VEN_1002&DEV_9598&SUBSYS_4580174B

    "ATI Radeon HD 4590" = PCI\VEN_1002&DEV_9540&SUBSYS_4590174B

    "ATI Radeon HD 4610" = PCI\VEN_1002&DEV_9598&SUBSYS_4610174B

    "ATI Radeon HD 4710" = PCI\VEN_1002&DEV_9490&SUBSYS_4710174B

    "ATI Radeon HD 4730" = PCI\VEN_1002&DEV_9505&SUBSYS_4730174B

    "ATI Radeon HD 4750" = PCI\VEN_1002&DEV_9505&SUBSYS_3010174B

    "ATI Radeon HD 4750" = PCI\VEN_1002&DEV_9501&SUBSYS_4750174B

    "ATI Radeon HD 4750" = PCI\VEN_1002&DEV_9505&SUBSYS_3001174B

    "ATI Radeon HD 4800 Series" = PCI\VEN_1002&DEV_944A&SUBSYS_3000174B

    "ATI Radeon HD 4810 Series" = PCI\VEN_1002&DEV_944E&SUBSYS_3260174B

    "ATI Radeon HD 4810 series" = PCI\VEN_1002&DEV_944E&SUBSYS_3261174B

    "ATI Radeon HD 5470" = PCI\VEN_1002&DEV_68F9&SUBSYS_5470174B

    "ATI Radeon HD 5490" = PCI\VEN_1002&DEV_68F9&SUBSYS_5490174B

    "ATI Radeon HD 5530" = PCI\VEN_1002&DEV_68F9&SUBSYS_5530174B

    "ATI Radeon HD 5630" = PCI\VEN_1002&DEV_68DA&SUBSYS_5630174B

    "ATI Radeon HD 5690" = PCI\VEN_1002&DEV_68D8&SUBSYS_5690174B

    "ATI Radeon HD 5730" = PCI\VEN_1002&DEV_68D8&SUBSYS_5730174B

    "Sapphire Radeon HD 3550" = PCI\VEN_1002&DEV_95C0&SUBSYS_3000174B

    "Sapphire Radeon HD 3690" = PCI\VEN_1002&DEV_9501&SUBSYS_3000174B

    "Sapphire Radeon HD 3690" = PCI\VEN_1002&DEV_9505&SUBSYS_3000174B

    "Sapphire Radeon HD 3730" = PCI\VEN_1002&DEV_9598&SUBSYS_3000174B

    "Sapphire Radeon HD 3750" = PCI\VEN_1002&DEV_9598&SUBSYS_3001174B

    "Sapphire Radeon HD4570" = PCI\VEN_1002&DEV_954F&SUBSYS_4570174B

    "ATI Radeon HD 2350 Series" = PCI\VEN_1002&DEV_94C3&SUBSYS_30001787

    "ATI Radeon HD 2400 LE" = PCI\VEN_1002&DEV_94C3&SUBSYS_22471787

    "ATI Radeon HD 3600 Series" = PCI\VEN_1002&DEV_9589&SUBSYS_30001787

    "ATI Radeon HD 3690" = PCI\VEN_1002&DEV_9501&SUBSYS_30001787

    "ATI Radeon HD 3690" = PCI\VEN_1002&DEV_9505&SUBSYS_30001787

    "ATI Radeon HD 4250" = PCI\VEN_1002&DEV_95C5&SUBSYS_30501787

    "ATI Radeon HD 4450" = PCI\VEN_1002&DEV_954F&SUBSYS_30501787

    "ATI Radeon HD 4520" = PCI\VEN_1002&DEV_954F&SUBSYS_31001787

    "ATI Radeon HD 4590" = PCI\VEN_1002&DEV_9540&SUBSYS_30501787

    "ATI Radeon HD 4610" = PCI\VEN_1002&DEV_9598&SUBSYS_30501787

    "ATI Radeon HD 4700" = PCI\VEN_1002&DEV_9498&SUBSYS_30501787

    "ATI Radeon HD 4710" = PCI\VEN_1002&DEV_9490&SUBSYS_30501787

    "ATI Radeon HD 4720" = PCI\VEN_1002&DEV_9498&SUBSYS_31001787

    "ATI Radeon HD 4730 Series" = PCI\VEN_1002&DEV_944E&SUBSYS_30001787

    "ATI Radeon HD 4800 Series" = PCI\VEN_1002&DEV_944A&SUBSYS_30001787

    "ATI Radeon HD 4810 Series" = PCI\VEN_1002&DEV_944E&SUBSYS_30101787

    "ATI Radeon HD 4820" = PCI\VEN_1002&DEV_944E&SUBSYS_31001787

    "ATI Radeon HD 5470" = PCI\VEN_1002&DEV_68F9&SUBSYS_30001787

    "ATI Radeon HD 5490" = PCI\VEN_1002&DEV_68F9&SUBSYS_30021787

    "ATI Radeon HD 5530" = PCI\VEN_1002&DEV_68F9&SUBSYS_30011787

    "ATI Radeon HD 5630" = PCI\VEN_1002&DEV_68DA&SUBSYS_30001787

    "ATI Radeon HD 5730" = PCI\VEN_1002&DEV_68D8&SUBSYS_30001787

    "ATI Radeon HD 2400" = PCI\VEN_1002&DEV_94C3&SUBSYS_203817AF

    "ATI Radeon HD 4230" = PCI\VEN_1002&DEV_95C5&SUBSYS_301017AF

    "ATI Radeon HD 4450" = PCI\VEN_1002&DEV_954F&SUBSYS_301017AF

    "ATI Radeon HD 4570" = PCI\VEN_1002&DEV_9598&SUBSYS_301017AF

    "ATI Radeon HD 4580" = PCI\VEN_1002&DEV_9598&SUBSYS_301117AF

    "ATI Radeon HD 4710" = PCI\VEN_1002&DEV_9490&SUBSYS_300017AF

    "ATI Radeon HD 4750" = PCI\VEN_1002&DEV_9505&SUBSYS_301017AF

    "ATI Radeon HD 4800 Series" = PCI\VEN_1002&DEV_944A&SUBSYS_300017AF

    "ATI Radeon HD 5470" = PCI\VEN_1002&DEV_68F9&SUBSYS_301317AF

    "ATI Radeon HD 5470" = PCI\VEN_1002&DEV_68F9&SUBSYS_301117AF

    "ATI Radeon HD 5490" = PCI\VEN_1002&DEV_68F9&SUBSYS_301217AF

    "ATI Radeon HD 5630" = PCI\VEN_1002&DEV_68DA&SUBSYS_301017AF

    "ATI Radeon HD 5630" = PCI\VEN_1002&DEV_68D9&SUBSYS_301017AF

    "ATI Radeon HD 5690" = PCI\VEN_1002&DEV_68D8&SUBSYS_301117AF

    "ATI Radeon HD 5730" = PCI\VEN_1002&DEV_68D8&SUBSYS_301017AF

    "ATI Radeon HD3750" = PCI\VEN_1002&DEV_9598&SUBSYS_300117AF

    "AMD FireStream 9170" = PCI\VEN_1002&DEV_9519

    "AMD FireStream 9250" = PCI\VEN_1002&DEV_9452

    "AMD FireStream 9270" = PCI\VEN_1002&DEV_9450

    "ATI FireGL V3600" = PCI\VEN_1002&DEV_958D

    "ATI FireGL V5600" = PCI\VEN_1002&DEV_958C

    "ATI FireGL V7600" = PCI\VEN_1002&DEV_940F

    "ATI FireGL V7700" = PCI\VEN_1002&DEV_9511

    "ATI FireGL V8600" = PCI\VEN_1002&DEV_940B

    "ATI FireGL V8650" = PCI\VEN_1002&DEV_940A

    "ATI FirePro (FireGL) Graphics Adapter" = PCI\VEN_1002&DEV_68E9

    "ATI FirePro (FireGL) Graphics Adapter" = PCI\VEN_1002&DEV_68C8

    "ATI FirePro (FireGL) Graphics Adapter" = PCI\VEN_1002&DEV_68A9

    "ATI FirePro (FireGL) Graphics Adapter" = PCI\VEN_1002&DEV_6889

    "ATI FirePro (FireGL) Graphics Adapter" = PCI\VEN_1002&DEV_6888

    "ATI FirePro (FireGL) Graphics Adapter" = PCI\VEN_1002&DEV_68F1

    "ATI FirePro (FireGL) Graphics Adapter" = PCI\VEN_1002&DEV_68C9

    "ATI FirePro 2260" = PCI\VEN_1002&DEV_95CE

    "ATI FirePro 2260" = PCI\VEN_1002&DEV_95CF

    "ATI FirePro 2450" = PCI\VEN_1002&DEV_95CD

    "ATI FirePro M7740" = PCI\VEN_1002&DEV_94A3

    "ATI FirePro V3700 (FireGL)" = PCI\VEN_1002&DEV_95CC

    "ATI FirePro V3750 (FireGL)" = PCI\VEN_1002&DEV_949F

    "ATI FirePro V5700 (FireGL)" = PCI\VEN_1002&DEV_949E

    "ATI FirePro V7750 (FireGL)" = PCI\VEN_1002&DEV_949C

    "ATI FirePro V8700 (FireGL)" = PCI\VEN_1002&DEV_9456

    "ATI FirePro V8750 (FireGL)" = PCI\VEN_1002&DEV_9444

    "ATI Mobility Radeon 4100" = PCI\VEN_1002&DEV_9713

    "ATI Mobility Radeon HD 2400" = PCI\VEN_1002&DEV_94C9

    "ATI Mobility Radeon HD 2400 XT" = PCI\VEN_1002&DEV_94C8

    "ATI Mobility Radeon HD 2600" = PCI\VEN_1002&DEV_9581

    "ATI Mobility Radeon HD 2600 XT" = PCI\VEN_1002&DEV_9583

    "ATI Mobility Radeon HD 3400 Series" = PCI\VEN_1002&DEV_95C4

    "ATI Mobility Radeon HD 3430" = PCI\VEN_1002&DEV_95C2

    "ATI Mobility Radeon HD 3650" = PCI\VEN_1002&DEV_9591

    "ATI Mobility Radeon HD 3670" = PCI\VEN_1002&DEV_9593

    "ATI Mobility Radeon HD 3850" = PCI\VEN_1002&DEV_9504

    "ATI Mobility Radeon HD 3850 X2" = PCI\VEN_1002&DEV_9506

    "ATI Mobility Radeon HD 3870" = PCI\VEN_1002&DEV_9508

    "ATI Mobility Radeon HD 3870 X2" = PCI\VEN_1002&DEV_9509

    "ATI Mobility Radeon HD 4200 Series" = PCI\VEN_1002&DEV_9712

    "ATI Mobility Radeon HD 4300 Series" = PCI\VEN_1002&DEV_9552

    "ATI Mobility Radeon HD 4300/4500 Series" = PCI\VEN_1002&DEV_9555

    "ATI Mobility Radeon HD 4330" = PCI\VEN_1002&DEV_955F

    "ATI Mobility Radeon HD 4500/5100 Series" = PCI\VEN_1002&DEV_9553

    "ATI Mobility Radeon HD 4650" = PCI\VEN_1002&DEV_9480

    "ATI Mobility Radeon HD 4650" = PCI\VEN_1002&DEV_9480

    "ATI Mobility Radeon HD 4670" = PCI\VEN_1002&DEV_9488

    "ATI Mobility Radeon HD 4830" = PCI\VEN_1002&DEV_94A0

    "ATI Mobility Radeon HD 4850" = PCI\VEN_1002&DEV_944A

    "ATI Mobility Radeon HD 4850 X2" = PCI\VEN_1002&DEV_944B

    "ATI Mobility Radeon HD 4860" = PCI\VEN_1002&DEV_94A1

    "ATI Mobility Radeon HD 4870" = PCI\VEN_1002&DEV_945A

    "ATI Mobility Radeon HD 5400 Series" = PCI\VEN_1002&DEV_68E0

    "ATI Mobility Radeon HD 5400 Series" = PCI\VEN_1002&DEV_68E1

    "ATI Mobility Radeon HD 5600/5700 Series" = PCI\VEN_1002&DEV_68C1

    "ATI Mobility Radeon HD 5700 Series" = PCI\VEN_1002&DEV_68C0

    "ATI Mobility Radeon HD 5800 Series" = PCI\VEN_1002&DEV_68A0

    "ATI Mobility Radeon HD 5800 Series" = PCI\VEN_1002&DEV_68A1

    "ATI Radeon 3000 Graphics" = PCI\VEN_1002&DEV_9616

    "ATI Radeon 3100 Graphics" = PCI\VEN_1002&DEV_9611

    "ATI Radeon 3100 Graphics" = PCI\VEN_1002&DEV_9613

    "ATI RADEON E4690" = PCI\VEN_1002&DEV_9491

    "ATI Radeon HD 2350" = PCI\VEN_1002&DEV_94C7

    "ATI Radeon HD 2400 PRO AGP" = PCI\VEN_1002&DEV_94C4

    "ATI Radeon HD 2400 Series" = PCI\VEN_1002&DEV_94C3

    "ATI Radeon HD 2400 Series" = PCI\VEN_1002&DEV_94C1

    "ATI Radeon HD 2400 Series" = PCI\VEN_1002&DEV_94CC

    "ATI Radeon HD 2600 PRO" = PCI\VEN_1002&DEV_9589

    "ATI Radeon HD 2600 Pro AGP" = PCI\VEN_1002&DEV_9587

    "ATI Radeon HD 2600 X2 Series" = PCI\VEN_1002&DEV_958A

    "ATI Radeon HD 2600 XT" = PCI\VEN_1002&DEV_9588

    "ATI Radeon HD 2600 XT AGP" = PCI\VEN_1002&DEV_9586

    "ATI Radeon HD 2900 GT" = PCI\VEN_1002&DEV_9405

    "ATI Radeon HD 2900 PRO" = PCI\VEN_1002&DEV_9403

    "ATI Radeon HD 2900 XT " = PCI\VEN_1002&DEV_9400

    "ATI Radeon HD 3200 Graphics" = PCI\VEN_1002&DEV_9610

    "ATI Radeon HD 3200 Graphics" = PCI\VEN_1002&DEV_9612

    "ATI Radeon HD 3300 Graphics" = PCI\VEN_1002&DEV_9614

    "ATI Radeon HD 3400 Series" = PCI\VEN_1002&DEV_95C0

    "ATI Radeon HD 3400 Series" = PCI\VEN_1002&DEV_95C5

    "ATI Radeon HD 3450" = PCI\VEN_1002&DEV_95C6

    "ATI Radeon HD 3450" = PCI\VEN_1002&DEV_95C9

    "ATI Radeon HD 3600 Series" = PCI\VEN_1002&DEV_9598

    "ATI Radeon HD 3650 AGP" = PCI\VEN_1002&DEV_9596

    "ATI Radeon HD 3800 Series" = PCI\VEN_1002&DEV_9501

    "ATI Radeon HD 3800 Series" = PCI\VEN_1002&DEV_9505

    "ATI Radeon HD 3830" = PCI\VEN_1002&DEV_9507

    "ATI Radeon HD 3850 AGP" = PCI\VEN_1002&DEV_9515

    "ATI Radeon HD 3850 X2" = PCI\VEN_1002&DEV_9513

    "ATI Radeon HD 3870 X2" = PCI\VEN_1002&DEV_950F

    "ATI Radeon HD 4200" = PCI\VEN_1002&DEV_9710

    "ATI Radeon HD 4250" = PCI\VEN_1002&DEV_9715

    "ATI Radeon HD 4290" = PCI\VEN_1002&DEV_9714

    "ATI Radeon HD 4300/4500 Series" = PCI\VEN_1002&DEV_954F

    "ATI Radeon HD 4500 Series" = PCI\VEN_1002&DEV_9540

    "ATI Radeon HD 4600 Series" = PCI\VEN_1002&DEV_9490

    "ATI Radeon HD 4600 Series" = PCI\VEN_1002&DEV_9498

    "ATI Radeon HD 4600 Series" = PCI\VEN_1002&DEV_9495

    "ATI Radeon HD 4700 Series" = PCI\VEN_1002&DEV_944E

    "ATI Radeon HD 4700 Series" = PCI\VEN_1002&DEV_944E

    "ATI Radeon HD 4700 Series" = PCI\VEN_1002&DEV_94B4

    "ATI Radeon HD 4770" = PCI\VEN_1002&DEV_94B3

    "ATI Radeon HD 4770" = PCI\VEN_1002&DEV_94B5

    "ATI Radeon HD 4800 Series" = PCI\VEN_1002&DEV_9440

    "ATI Radeon HD 4800 Series" = PCI\VEN_1002&DEV_9442

    "ATI Radeon HD 4800 Series" = PCI\VEN_1002&DEV_944C

    "ATI Radeon HD 4800 Series" = PCI\VEN_1002&DEV_9460

    "ATI Radeon HD 4800 Series" = PCI\VEN_1002&DEV_9462

    "ATI Radeon HD 4850 X2" = PCI\VEN_1002&DEV_9443

    "ATI Radeon HD 4870 X2" = PCI\VEN_1002&DEV_9441

    "ATI Radeon HD 5400 Series" = PCI\VEN_1002&DEV_68F9

    "ATI Radeon HD 5500 Series" = PCI\VEN_1002&DEV_68D9

    "ATI Radeon HD 5500 Series" = PCI\VEN_1002&DEV_68DA

    "ATI Radeon HD 5600 Series" = PCI\VEN_1002&DEV_68D8

    Инициализация OpenGL в Windows

    Статистика

    Инициализация OpenGL в Windows.

    «Инициализация OpenGL в Windows»

    Наконец-то у меня выдалось пара выходных, и я могу заняться дальнейшим обустройством своей странички, а самое главное начать помогать тем, кто хочет научиться создавать собственные компьютерные 3D-игры(я кстати тоже. )), либо просто интересуется данной темой, не важно почему, главное, что это кому-то интересно.

    Итак, приступим. Сегодня мы просто создадим простое мастдайное окошко, где великий и могучий OpenGL будет рисовать простой "проволочный" каркас шарика. В последствии, будем надеяться, мы сможем в этом окошке наблюдать нечто покруче,(может даже покруче Дум3 :)).

    Многим этот урок покажется бессмысленным, но как я недавно смог убедиться, у некоторых все еще с этим возникают проблемы, несмотря на многочисленные сетевые ресурсы, иногда очень толковые.

    Да, чуть не забыл самое главное! Кодить мы будем на С++ (MS VS6.0), графическая библиотека которую будем использовать - это OpenGL. Исходный код максимально прокомментирован и поэтому вопросов, по идее, возникнуть не должно. По себе знаю, чем больше комментариев, тем понятнее. Ну а если все-таки вопросы возникнут, - все нужные ссылки внизу, по возможности отвечу.

    НАЧАЛИ КОДИТЬ: Первым делом создадим пустой проект приложения Win32(никаких MFC), и включим в него все необходимые заголовочные файлы, без которых нам не удастся откомпилировать нашу программу.

    #include //Присутствует во всех приложениях Win32

    #include //Наша OpenGL библиотека

    #include //Библиотека утилит OpenGL

    #include //И еще одна, с ее помощью можно рисовать стандартные объекты (сферы, кубы, и др.)

    Следуюие строчки подключают статические библиотеки OpenGL.lib, Glu32.lib b Glaux.lib которые также необходимы для успешной компиляции проекта.

    #pragma comment (lib, "OpenGL32.lib")

    #pragma comment (lib, "Glu32.lib")

    #pragma comment (lib, "Glaux.lib")

    Вместо этих строчек можно зайти в меню Project -> Settings -> закладка Link -> поле Object/library modules: добавить в конец строки через пробел (OpenGL32.lib Glu32.lib Glaux.lib).

    Далее объявляем необходимые переменные.

    static GLint resW = 640, resH = 480; // Размер окна

    bool isFullscr = false; // Полноэкранный режим (по умолчанию - нет)

    static GLdouble cntr; // Счетчик. Отвечает за вращение шарика

    BOOL keys[256]; // Массив для процедуры обработки клавиатуры

    HGLRC hGLRC; // Контекст рендеринга OpenGL

    HDC hDC; // Контекст устройства Windows

    static GLfloat light1_position[] = <0.0, 0.0, 3.0, 1.0>; //Позиция источника света

    Надеюсь все предельно ясно.

    Далее напишем функцию инициализации OpenGL, в которой мы инициализируем стандартное освещение, установим метод закраски полигонов, и выполним еще несколько функций, о которых мы более подробно поговорим в следующих уроках, а пока из всей этой функции следует обратить внимание на одну единственную функцию: glEnable (GL_DEPTH_TEST); эта функция включает тест глубины, это нужно для того, чтобы при рисовании нескольких объектов, те объекты которые спереди (ближе к точке обзора) перекрывали те, которые находятся за ними, иначе сами представьте что случится. например чайник стоит за ящиком, но тем не менее рисуется спереди :) прикольно, но нам это не нужно.

    GLvoid InitGL() // Вызвать после создания окна GL

    GLfloat white_light[] = <1.0, 1.0, 1.0, 1.0>;

    glClearColor (0.5, 0.5, 0.5, 0.0);

    //*********** Инициализация освещения *********************

    GLfloat light_position[] = <0.0, 0.0, 10.0, 1.0>;

    glLightf (GL_LIGHT0, GL_SPOT_EXPONENT, 20.0);

    glLightfv (GL_LIGHT0, GL_POSITION, light_position);

    glLightf (GL_LIGHT0, GL_SPECULAR, 128);

    glEnable (GL_LIGHTING);

    glEnable (GL_LIGHT0);

    //**********************************************************

    glShadeModel (GL_SMOOTH); // Метод закраски: СГЛАЖЕНЫЙ

    glEnable (GL_DEPTH_TEST); // Включаем тест глубины

    // ВКЛ. АВТОМАТИЧЕСКИЙ ПЕРЕСЧЕТ НОРМАЛЕЙ

    glEnable (GL_AUTO_NORMAL);

    glEnable (GL_NORMALIZE);

    // ВКЛ. ОТСЕЧЕНИЕ ЗАДНИХ ГРАНЕЙ

    glEnable (GL_CULL_FACE); // Включаем отсечение граней

    glCullFace (GL_BACK); // Указываем, что отсекать будем задние грани

    Теперь началось самое интересное. Функция перерисовки, обновления, как хотите ее называйте, а выполняет она следующее:

    устанавливает размер порта просмотра(это то место где мы будем рисовать)который не всегда может быть равен размеру окна widowsa, но в нашем случае их размеры равны. Затем устанавливаем и настраиваем матрицу проекции с помощью ф-ции gluPerspective которая не является стандартной для OpenGL а включена в отдельную библиотеку утилит OpenGL, об этом можно догадаться по трем первым буквам ф-ции(glu - gl utility). Далее мы устанавливаем матрицу модели-вида, и практически все готово для того, чтобы рисовать.

    void reshape(int width,int height)

    glViewport(0,0,width,height); // Устанавливаем размер порта просмотра

    glMatrixMode( GL_PROJECTION ); // Переключаемся на матрицу проекции

    glLoadIdentity(); // Сбрасываем матрицу проекции путем установки единичной матрицы

    gluPerspective (50.0, (GLfloat)width/(GLfloat)height, 1.0, 100.0); // настраиваем нашу камеру

    // gluPerspective (угол_обзора, отношение_ширины_к_высоте_порта_просмотра, ближняя_плоскость_отсечения, дальняя_плоскость_отсечения);

    // gluLookAt( 0,0,3, 0,0,0, 0,1,0 ); // попробуйте. )

    glMatrixMode( GL_MODELVIEW ); // Переключаемся на матрицу модели-вида

    glLoadIdentity(); // Сбрасываем матрицу модели-вида путем установки единичной матрицы

    И сама функция рисования, в которой нас пока интересуют первые 2е строчки. Первая говорит OpenGL, что нужно очистить буфер цвета и буфер глубины. Эти операции выполняются перед рисованием каждого кадра! Очищая буфер цвета, мы стираем то, что уже нарисовали и отобразили на экране, и затем рисуем следующий кадр. Обновляя буфер глубины мы следим за тем, чтоб на экране рисовалось то что мы видим, и не рисовалось то, что от нас скрыто(ого как загнул).

    void display()

    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Очищаем буфера

    glLoadIdentity(); // Грузим единичную матрицу

    cntr +=0.1;

    glTranslatef (0.0, 0.0, -5.0);

    glRotated(cntr, 0.0f, 1.0f, 0.0f);

    auxWireSphere(1.0);

    if (cntr >= 360.0f) cntr =0.0f;

    glPopMatrix();

    glFlush(); // Досрочное завершение рисования (ф-я необязательна)

    НУ ВОТ. Наконец мы добрались до самой изюминки данного урока! Это две функции, которые отвечают за создание окна, его вид, наличие отсутствие кнопочек, контекстного меню, получение и обработку сообщений(команд) операционной системы и т.д. и т.п.

    Функция WindowFunc отвечает за инициализацию формата пикселей, и обработку сообщений(команд) операционной системы. Вот ее код.

    LRESULT CALLBACK WindowFunc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)

    sizeof(PIXELFORMATDESCRIPTOR), //Размер структуры

    1, // Номер версии

    PFD_DRAW_TO_WINDOW | // Рисовать будем в окно

    PFD_SUPPORT_OPENGL | // Установим поддержку OpenGL

    PFD_DOUBLEBUFFER, // Выберем двойной буфер

    PFD_TYPE_RGBA, // Режим цветности - RGBA

    32, // Выберем 32 битную глубину цвета

    0, 0, 0, 0, 0, 0, // Игнорирование цветовых битов

    0, // Нет буфера прозрачности

    0, 0, 0 // Маски слоя игнорируются

    switch(message)

    // сообщение WM_CREATE приходит

    // один раз при создании окна

    case WM_CREATE:

    hDC = GetDC(hWnd); // Получить контекст устройства для окна

    PixelFormat = ChoosePixelFormat(hDC, &pfd);// Найти ближайшее совпадение для нашего формата пикселов

    if (!PixelFormat) // Если не удалось то.

    // Выводим сообщение об ошибке

    MessageBox (0, "Не удается найти подходящий PixelFormat!", "Error", MB_OK | MB_ICONERROR);

    SendMessage(hWnd, WM_DESTROY, wParam, lParam);// Это сообщение говорит, что программа должна завершится

    break; // Предотвращение повтора кода

    SetPixelFormat (hDC, PixelFormat, &pfd); // Теперь нужно установить наш формат пикселов

    if (!SetPixelFormat (hDC, PixelFormat, &pfd)) // Если не удалось то.

    // Выводим сообщение об ошибке

    MessageBox (0, "Не удается установить PixelFormat!","Ошибка. ", MB_OK | MB_ICONERROR);

    SendMessage(hWnd, WM_DESTROY, wParam, lParam);

    hGLRC = wglCreateContext (hDC); //Захватывает Контекст Рендеринга и сохраняет его в переменной hGLRC

    // Выводим сообщение об ошибке

    wglMakeCurrent(hDC, hGLRC); // делаем его текущим

    MessageBox (0, "Не удается активировать контекст рендеринга GLRC!", "Ошибка. ", MB_OK | MB_ICONERROR);

    // Все. окошко создано.

    InitGL (); // Инициализируем наш GL

    case WM_KEYUP: // Если клавиша отпущена то.

    keys[wParam] = FALSE; // В массив keys[key number] заносится FALSE

    default: // Реакция на все остальные сообщения ОС.

    return DefWindowProc(hWnd,message,wParam,lParam); //. по умолчанию

    // если где-то что-то не так.

    return 0; //. возвращаем ошибку

    WM_CREATE, WM_DESTROY, WM_SIZE и т.д. - это все сообщения, которые ОС посылает нашему окну все время. И таких команд очень много, а мы затронули лишь необходимый минимум. Полный список находится в файле windows.h, будет интересно - загляните.

    ИДЕМ ДАЛЬШЕ.

    Функция, с которой начинается выполнение любой Win32-программы! Это функция WinMain! Она отвечает за создание окна, его свойства и все, что с ним связано. В общем название функции само за себя говорит!

    Давайте на нее поглядим.

    int WINAPI WinMain(HINSTANCE hInstance,

    HINSTANCE hPrevInst,

    LPSTR str,int nWinMode)

    MSG msg; // Структура сообщения Windows

    WNDCLASS wc; //Структура класса Windows для установки типа окна

    HWND hWnd; //Сохранение дескриптора окна

    wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; // Стиль нашего окна

    wc.lpfnWndProc = WindowFunc; // Определяем ф-цию ответственную за обработку сообщений ОС

    wc.cbClsExtra = 0;

    wc.cbWndExtra = 0;

    wc.hInstance = hInstance;

    wc.hIcon = NULL; // иконка нашего окошка (по умолчанию)

    wc.hCursor = LoadCursor (NULL, IDC_ARROW); // Курсор который будет отображаться при наведении на наше окошко (стрелка)

    DEVMODE dmScreenSettings; // Режим работы устройства (видяхи)

    memset (&dmScreenSettings, 0, sizeof(DEVMODE));// Выделение памяти для хранения установок

    dmScreenSettings.dmSize = sizeof(DEVMODE); // Размер структуры Devmode