Воробьёвы

(-:

#Бредисловие

Сорванные башни

(часть 1)

Учиться,
Учиться,
Учиться...
(с) Устремлённый человек

#Бредисловие от WASM GROUP

<00F>: Слушаю Рамштайн и пью кофе с Колдрексом.
Угораздило схватить насморк посреди лета!
Чтоб я еще в этот Китай поехал... да никогда в жизни!
Это не мешает мне гнидски хихикать
(сначала это был гомерический хохот, потом тихое повизгивание...
теперь из-за насморка звуки вообще непередаваемые) и пишу продолжение :)
<00E>: ООО, Рамштайн -- сильная штука! Или это тебя Колдрекс так вдохновляет?
Нет, я больше люблю кофе с коньяком. Выздаравливай побыстрей.
А китайцы не проблема. Вон у нас их целый этаж :)))
<00F>: Ужас! :) Ну так вот...
Все описываемые события вымышлены, имена героев изменены.
Любые совпадения случайны.
За потерю данных при чтении автор ответственности не несет

Гарри Поттер и девайс маглов

(часть 2)

...Лето началось неожиданно и смело все учебные планы. Сидеть в холодных залах Хогвартса не хотелось никому. Ученики последнего курса собирались кучками и курили под стенами, несмотря на строжайший запрет и угрозу 100 штрафных. Девченки, хихикая, обсуждали мальчиков. Парни выщипывали оранжерею Хогвартса и почему-то старались вручать букеты сами, без помощи сов. Совы обжирались мышами и бездельничали. По ночам мелькали странные тени в мантиях и ночных рубашках. На стенах появлялись надписи и граффитти. Ректор Хогвартса профессор Дамблдор перестал спать и лично обходил замок ночью. Это мало помогало, надписи продолжали появляться, а из темных углов раздавались звуки поцелуев... но никого застать не удавалось. Дамблдор мрачнел и что-то бормотал под нос. Случайно подслушавший его бормотание Рон попал в лазарет с воспалением мозга. Только профессор Снегг общим весельем не заразился и раздавал штрафные баллы направо и налево. ВижуалБейсик продвигался плохо, будущие маги просто не могли понять, для чего он нужен. Гарри больше всего оценил Интернет - мало того, что картинки живые, как в магических книгах, так еще и соединяет мгновенно на любое расстояние - куда там совиной почте!
...За окном лил дождь, первый курс занимался квиддишем несмотря на погоду. Гарри зашел к Рону в лазарет и они сели перед ноутбуком Поттера. Недавно Гарри обнаружил несколько в самом деле интересных сайтов... На самом интересном раздался стук в дверь и не дожидаясь ответа вошла Гермиона. Гарри судорожно нажал Ctrl-F12 - на хоткее сидел VB-скрипт, моментально убирающий со страницы все картинки, обновляя экран.
- Привет, мальчики! - сказала Гермиона, подходя ближе. - Гарри, ты подготовил для Снегга реферат по OpenGL? Осталось всего две недели! Что это тут у вас? - она уставилась на окно IE с пустыми рамками и надписью внизу экрана "BOOK ME NOW!" - А, как раз ищещь книги... Вот вечно эти маглы коверкают свой язык: "book" - это существительное, и не может быть предикатом!
- Да это такие книги, которые хоть сказуемым, хоть подлежащим... - нашелся Гарри. - Не волнуйся, за две недели напишу как-нибудь, подумаешь!
- Не как нибудь! Нам сейчас главное не получить лишних штрафных баллов...
- Это точно, - уныло протянул Рон, - не получить лишних... Стараниями Снегга у нас -1500, а у Слизерина всего -1200. Если мы немного постараемся, то может даже победим... хотя бы по очкам!
- Ладно, мальчики, сегодня как раз семинар по магловедению, не опаздывайте! И, Гарри, постарайся без фокусов! Кстати, я видела по теме твоего реферата неплохую статью на WASM.RU...
- На русском??? - возмутился Гарри. - Не все тут у нас полиглоты! К тому же их статьи понять невозможно - смешивают в одну кучу несколько языков, половину пишут на Си, вторую на ассемблере. Да если бы только программы - мне их все равно не надо. Так и текст половина русский, половина транслит! Предложи что нибудь получше...
- Ну, а вы что, больше не маги? - Гермиона махнула палочкой, - Лонгус Лингус Штудис Цитус!
"Какая жуткая латынь!", подумал Гарри. Но вслух ничего не сказал - во-первых, Гермиона гордилась своим произношением и могла обидеться... а во-вторых... в его голове как будто заработало радио, да еще на 6 разных языках одновременно!
- Ну вот, теперь и ты знаешь русский, Гарри! Только поспеши, заклинание действует всего 4 часа! - и Гермиона удалилась, что-то напевая.

- Чего это она с тобой сделала, Гарри? - удивился Рон. Гарри ошалело посмотрел на него, потом сел за компьютер и пошел в Интернет за статьей. Заклинание действительно действовало, и Гарри свободно все понял. "Ну, теперь переписать быстренько - и можно больше ни о чем не волноваться. Снегг не знает русского!"- подумал он, и принялся за дело. "Заголовок? А что, так и оставим... не забыть только имя автора убрать!" И переводя прямо с листа, Гарри быстро переписал статью...
"Порядок", подумал Гарри, "уложился. Даже время осталось. Может еще в исходниках интересное чего лежит - сделаю Грейнджер демку на OpenGL... как раз на день рожденья!" Среди прочего попалась строчка "Как написать компьютерный вирус". OpenGL был тут же забыт, и Гарри принялся за чтение. Да, по крайней мере, к семинару будет что сказать. Последнее время Снегг просто придирался к ним и добавил целых 300 баллов штрафа, когда Рон и Гарри вместо развевающегося вафельного полотенца Windows получили синий экран с закорючками и пошли к профессору за антивирусной программой. "Глупость наказуема, Поттер!"- сказал Снегг, -"Мало того, что вы не пытаетесь думать - вы еще меня не слушаете. А на прошлой лекции я говорил о завершении работы и загрузке ОС." Гермиона, узнав об этом, сморщила носик и сказала, что это русский, а им досталась "кривая локализация", и что "Гарри, про скандиск ты должен был слышать".
Выходя из лазарета, Гарри услышал голоса за дверью. Он замер на месте и обратился в слух.

- Северус, это был безответственный поступок! - раздался голос Дамблдора. - Я с самого начала был против установки машины Эвклида в эту магловскую поделку! Ваша самонадеянность может стоить жизни кому-нибудь из учащихся... да и мы можем пострадать.
- Но я был уверен... Я сам переписал все поведенческие алгоритмы, подправил параметры. Это же уникальная техника, мы не можем просто так ...
- Переписали? Неужели на ВижуалБейсике? - ехидно произнес ректор, - Вот у меня последний лог о загрузке: "Требуемая библиотека не найдена, блок интеллекта создает новую..." Вы даже не очистили память перед запуском!
- Но... если очистить память, его придется обучать еще 15 лет! Там была уникальная информация, я просто не мог, - оправдывался Снегг.
- И что мы имеем теперь? Два циклопа-охранника в коматозном состоянии. Хагрид пошел за целебными травами, но оказалось, их выщипали на букеты наши оболтусы. А ваш голем ушел неизвестно куда и бродит по Хогвартсу и окрестностям. Вы что думали, получится электронный философ? Мы оба знаем, для чего была предназначена эта машина!

За дверью задвигались и Гарри предпочел удалиться незамеченным. "Что за Эвклид? Надо спросить Грейнджер, она все знает!"

...Семинар начался как обычно, то есть с неприятностей. "Поттер, вы должны были подготовить реферат? Ну что же, сейчас вы расскажете нам в общих чертах, что вы подготовили. А на второй паре мы проведем небольшую практическую работу по вирусной защите.", сказал декан Слизерина. "Да, если бы не Гермиона, я бы сейчас попал!" - подумал Гарри и начал:

MASM.OPENGL

Немного истории

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

Почти сразу с первой вычислительной машиной появились настоящие произведения виртуального искусства. Картины рисовались на мониторах при помощи ASCII символов вручную. Уже потом появились программы, которые могли преобразовывать графическое изображение в ASCII-Art.

Появление мониторов с примитивным цветным графическим режимам, подняло виртуальное искусство на качественно новый уровень. Среди компьютерных фанатов появились художники, способные буквально из нескольких десятков байт создать нетривиальные анимированные графические изображения. У команд - "исследователей" коммерческих программ стали появляться визитные карточки - программы, рисовавшие оригинальные графические сцены. Они распространялись вместе с "патчами" (например, посмотрите файл protocols.com в архиве mental_klutt_by_psikorp.zip в конце этого текста).

Следующим этапом стало появление графических карт способных изображать достаточно убедительный 3D в реальном времени. Современная Demo Scene это виртуальное искусство, которое объединило в себе творчество художников и композиторов, людей с хорошей математической подготовкой, владеющих передовыми вычислительными технологиями.

Эти известные демо используют API OpenGL. Продолжайте чтение после просмотра h7-final.zip и mental_klutt_by_psikorp.zip

Как работать с этим текстом, чтобы хоть чему-нибудь научится

Этот текст предназначен для тех, кто впервые серьезно взялся за изучение художественного 3D моделирования с помощью API OpenGL. Прежде всего включите свое воображение, голову и поисковую систему www.google.com. Вам будут предложены задания в каждой главе, которые звучат примерно так "Постарайтесь понять в течении 10 минут как можно больше oб использовании функции 'wglCreateContext'". Не пренебрегайте этим - знаний много никогда не бывает, а добывать их эффективно нужно учится. Без этого не стоит браться за вдумчивую работу с этим текстом.

Мы будем работать в MASM32v7 из пакета пропагандиста ассемблера под Windows - Hutch'a. Знание основ ассемблера - обязательно, а изучение Уроков Win32API от Iczelion - необходимо. Неплохо иметь представление об языке С/C++, иначе будет трудно понимать описание параметров функций API OpenGL. Мы постараемся научится творчески программировать, старайтесь внести в исходник урока что-нибудь свое, не бойтесь экспериментировать, изобретать свои "эффекты". Читатели с чрезмерной тягой к "copy-paste" подходу будут отчислены от занятий.

Лучше всегда иметь под рукой следующие мануалы:

  1. Microsoft MASM v6.1 Assembly-Language Development System (Описание языка МASM)
  2. MSDN Library Visual Studio (входит в пакет Visual Studio)
  3. Сальвадор Дали "Дневник одного гения"
  4. OpenGL Programming Guide aka "The Red Book"

Почему MASM и что такое API OpenGL?

Единственная причина выбора МАSM - эстетическое удовольствие. Да, именно так. Кодировать на нем сложнее, он требует от Вас знаний намного более глубоких, чем язык Си. Хотя ассемблер и собирает программы меньшие по размеру (если сравнивать с VC) - не факт, что они будут всегда быстрее. Какой код (MASM или C/C++) будет выполнятся за меньшее время - зависит от Вас, от Вашего мастерства в нахождении самых быстрых алгоритмов - медленные алгоритмы на MASM с большой вероятностью проиграют в скорости хорошему коду на С.

Что же такое API OpenGL? Давайте договоримся, что под API (Application Programming Interface) мы будем понимать некий набор подпрограмм, которые cможем вызывать/исполнять из нашей программы. Тогда фраза "API OpenGL" будет звучать менее пугающе - это всего лишь набор подпрограмм для работы с 3D графикой. Теперь мы можем без труда понять, например, что означает фраза "Win32 API" - это просто набор подпрограмм для работы в операционной системе Windows. Рассмотрим следующий рисунок.

{картинка поскипана}

Художник очень упрощенно изобразил самую суть понятия API: его программа в машинном коде запускает/вызывает подпрограмму "MessageBox" из библиотеки "User32" (входит в состав Win32 API), которая показывает на экране небольшое диалоговое окно с кнопкой. Потом Художник заставил компьютер издать звуковой сигнал - просто запустил подпрограмму "Beep" из библиотеки "Kernel32" (также входит в Win32 API) Затем он обратился к API "AudioFM", которую написал его друг Музыкант. Художник разбирается в музыке плохо, а все-таки сумел воспроизвести вальс Шуберта (а затем и хруст французской булки). Как? Он просто вызвал подпрограмму из API "AudioFM".

Затем Художник мастерски изобразил на мониторе белый круг и белый же квадрат, используя API "ОpenGL". Постойте-ка, а как он это сделал? Просто вызвал пару подпрограмм из библиотеки (=API) "OpenGL"!

Почему Художник написал на схеме "программа в машинном коде"? Чтобы особо подчеркнуть - и Asm и C/C++ сгенерируют машинный код, который будет работать с одним и тем же набором подпрограмм API "OpenGL". Так или иначе, но программы на ассемблере и программы С/C++ будут обращаться к одним и тем же функциям API "ОpenGL", а как быстро будет выполнятся код "ОpenGL" зависит только от Вашей видеокарты. (Ассемблер или С++ - выбирать Вам, на скорость выполнения API OpenGL не влияет).

Все API (и API OpenGL в том числе) очень удобная штука. Попробуйте представить себе как работает ... например, телевизор. Что нужно сделать из транзисторов, ЭЛТ и электричества, чтобы телевизор включить, настроить каналы, подстроить цвета? Нам на спасенье к телевизору прилагается АPI "Пульт Дистанционного Управления". Нажал кнопку (вызвал подпрограмму) - включил телевизор, нажал другую кнопку - переключил на другой канал. Пульт работает с "железом" телевизора самостоятельно! А что будет если мы купим новую видеокарту? API OpenGL позаботится о "железе" (обратите внимание на связь API OpenGL и видеокарты на рисунке), а название ее подпрограмм и способ их вызова останутся прежними. Наша программа будет работать везде, где установлена API OpenGL и даже без помощи современных видеокарт (работать будет медленно, но работать будет :))

Итак, нам любезно предоставили дистанционный пульт управления (API "OpenGL") от наших видеокарт - на любом современном компьютере с операционной системой Windows уже установлена API OpenGL. А где у них та самая главная кнопка - "ВКЛ" мы увидим в следующей главе.

PS: Автор сознательно опустил некоторые, на его взгляд, несущественные нюансы - для облегчения понимания. Для любознательного читателя это не будет большой проблемой. В качестве разминки постарайтесь выяснить, верно ли это утверждение "API OpenGL доступен только на компьютерах с ОС Windows!", а также "Почему MASM не такой хороший язык для написания 3D редакторов на API OpenGL по сравнению, например, с Си".

В предыдущей части мы занимались теорией, а сегодня пришло время практики. Давайте разбираться.

{картинка поскипана}

Синими рамками обведены процедуры нашей программы, в которых мы будем обращатся к подпрограммам API OpenGL. В принципе больше комментировать здесь нечего. Если вы хорошо поработали над уроками Win32API от Iczelion'a, остальная часть схемы (подпрограммы в черных рамках) не должна вызвать недоумения. Если это не так, то работу над Win32API придется продолжить. Остальным слушателям предлагаю перейти к следующей главе.

Таможня дает "добро"

Давайте посмотрим на подпрограмму "CreateOGLWindow" повнимательнее. Ее название говорит само за себя - мы создаем окно, в котором будут отображаться результаты нашего творчества в построении 3D виртуальной реальности. В следующей таблице расписаны шаги нашей подпрограммы, а также состояние OpenGL после каждого из них.

CreateOGLWindow Состояние OpenGL
Создаем окно windows приложения --неактивен--
Запрашиваем ОС Windows контекст устройства нашего окна --неактивен--
Настраиваем контекст устройства нашего окна для работы с ним на OpenGL --неактивен--
Сообщаем OpenGL о подготовленном контексте устройства OpenGL создает контекст рендеринга (изображения), пригодный для работы с нашим окном (контекстом устройства)
Выбираем созданный ОpenGL'ем контекст изображения (рендеринга) для построения 3D сцен командами API OpenGL OpenGL готов к работе на выбранном контексте изображения - ожидает от нас команды для исполнения ( путь в 3D мир открыт!)
MOV EAX, ECX (или любая другая) OpenGL активен (ждет команды)

Cразу договоримся - мы будем смотреть на работу нашей программы с API OpenGL как на общение Клиента (наша программа) с Сервером (OpenGL). Представим на минутку, что мы пытаемся взломать секретный Сервер "OpenGL". Что нужно сделать сначала? Определить по какому сетевому протоколу нам удобнее приконектиться к серверу! Допустим, мы выбрали протокол ABC_32бита. Это хорошо, но настоящие "кулхацкеры" не вламываются на секретные сервера со своего домашнего компьютера! Они вламываются с убитых PСишек (напомню, мы работаем в MASM) деревенских интернет-кафе.

Давайте посмотрим на подпрограмму "CreateOGLWindow" повнимательнее. Ее название говорит само за себя - мы создаем окно, в котором будут отображаться результаты нашего творчества в построении 3D виртуальной реальности. В следующей таблице расписаны шаги нашей подпрограммы, а также состояние OpenGL после каждого из них.

Поддерживается ли на них нужный нам протокол ABC_32бита? Нужно обязательно проверить его наличие перед использованием. Если он не поддерживается, то выбираем другой протокол или отказываемся от идеи взлома. По-моему, пока все логично. На этот раз нам повезло – PCшка поддерживает протокол АВС_16бит (хуже, чем ABC_32бита, но хоть что-то). Мы посылаем команду серверу OpenGL с запросом на соединение по протоколу ABC_16бит и получаем сообщение, что сервер готов к соединению. Дальше дело техники - сделать соединение активным. И всё, сервер ОpenGL ожидает от нас команд для исполнения.

Не бойтесь контекстов устройств (device context) – они не кусаются. Вспомним наше дество: детский сад, строгую воспитательницу и неуемную страсть к рисованию. (на стенах, ватманах, на руках шариковой ручкой, на новеньком БМВ богатого дяди острым гвоздем). Но в детском саду у строгой воспитательницы всегда нужно было спрашивать ее разрешение перед тем, как расписывать что-нибудь – «Марья Ивановна (OC Windows), можно я пририсую усы фломастером на вашей фотографии (в окне моей программы)?». А как иначе? За плохое поведение могут и из детского садика исключить («Ваша программа пыталась выполнить недопустимую операцию и будет закрыта» © WIndows), а там столько красивых игрушек!

Давайте договоримся, что под контекстом устройства (device context) мы будем понимать некий объект на котором нам не терпится что-либо нарисовать. В детском саду такими объектами (контекстами устройства) могли быть: лицо лучшего друга (зубной пастой во время «тихого часа»), стена в туалете, асфальтовая дорожка (цветными мелками – милое дело).

В мире Windows мы будем пользоваться 3-мя такими объектами (контекстами устройств) – монитором, принтером и памятью компьютера. API OpenGL может обрисовывать наши картины не только на мониторе, но и на принтере (есть ограничения) и просто рисовать картинку в памяти компьютера (Off-screen rendering. Кстати, только в этом случае мы можем подправлять изображения OpenGL самостоятельно непосредственно в памяти.) Контекст изображения OpenGL (не путать с контекстом устройства) к Windows не имеет никакого отношения, это “внутренняя кухня” OGL.

Теперь, отягощенные знанием о контекстах устройств Windows и контексте изображения OpenGL, еще раз изучите таблицу «CreateOGLWindow».

Что автор имел в виду под «протоколом», например «ABC_32бита»?. Структуру под симпатичным названием PIXELFORMATDESCRIPTOR.

;
; C
; © MSDN Library
typedef struct tagPIXELFORMATDESCRIPTOR { // pfd   
    WORD  nSize; 
    WORD  nVersion; 
    DWORD dwFlags; 
    BYTE  iPixelType; 
    BYTE  cColorBits; 
    BYTE  cRedBits; 
    BYTE  cRedShift; 
    BYTE  cGreenBits; 
    BYTE  cGreenShift; 
    BYTE  cBlueBits; 
    BYTE  cBlueShift; 
    BYTE  cAlphaBits; 
    BYTE  cAlphaShift; 
    BYTE
 cAccumBits; 
    BYTE  cAccumRedBits; 
    BYTE  cAccumGreenBits; 
    BYTE  cAccumBlueBits; 
    BYTE  cAccumAlphaBits; 
    BYTE  cDepthBits; 
    BYTE  cStencilBits; 
    BYTE  cAuxBuffers; 
    BYTE  iLayerType; 
    BYTE  bReserved; 
    DWORD dwLayerMask; 
    DWORD dwVisibleMask; 
    DWORD dwDamageMask; 
} PIXELFORMATDESCRIPTOR;

Я специально сделал фонт помельче, чтобы у вас не возникло желание с ним разбираться прямо сейчас. На данном этапе просто насладитесь количеством разных параметров, которые мы сможем выбирать для работы с OpenGL.

Для чего конкретно нужна эта структура? PIXELFORMATDESCRIPTOR определяет формат пикселей графического изображения, например, сколько цветов оно может отображать (16бит или 32бита - вы неоднократно делали этот выбор, играя в компьютерные игры). Механизм работы со структурой предельно простой. Мы «заказываем» нужный нам формат пикселей с которыми хотели бы работать в 3D. Затем отправляем «заказ» OC Windows. Система подбирает нам наиболее подходящий формат из списка тех, что поддерживаются «железом» на данном компьютере и возвращает его порядковый номер (индекс). Мы сообщаем Windows, что будем работать в предложенном формате, и настраиваем контекст устройства окна под него. Теперь мы уверены, что контекст устройства окна и контекст изображения OpenGL будут работать в одинаковых форматах пикселей, т.е. не будет ситуации, когда OpenGL пытается запихнуть 32бита туда, где могут поместится только 16бит. Логично?

MASM.OpenGL.Chapters – первая кровь

Вот как выглядит подпрограмма CreateOGLWindow.

;
;  MASMv7
;
;-------------------------------------------------------
CreateOGLWindow proc
;-------------------------------------------------------
;  Резервируем место для индекса
;  формата пикселей, возращаемого Windows
LOCAL PixelFormat :DWORD

; Регистрируем класс нашего окна 
invoke RegisterClassEx, ADDR wc
; Oшибка? - "Ошибка при регистрации окна"
; и выходим

; Создаем окно win32 приложения
; Для окна с OpenGL необходимы WS_CLIPSIBLINGS и WS_CLIPCHILDREN !
; Выставляем размеры окна 400 x 400
invoke CreateWindowEx,
    NULL,
    ADDR szWinClass,
    ADDR szWinName,
    WS_CLIPSIBLINGS or WS_CLIPCHILDREN \
or WS_OVERLAPPEDWINDOW,
    0, 0,
    400,
    400,
    NULL,
    NULL,
    hInstance,
    NULL
; Oшибка? -  "Ошибка при создании окна"
; и выходим
mov hWnd, eax

; Подпрграмма GetDC  (входит в Win32API) возвращает
; нам указатель на контекст устройства (КУ) нашего окна
; "Марьиванновна, можно мне порисовать на вашей фотографии?"
; Марьиванновна (с кислым лицом) - "Да на, рисуй. У меня еще есть".
invoke GetDC, hWnd
; Ошибка - "Не могу получить указатель КУ окна"
; и выходим
mov hDC, eax

; Подпрграмма ChoosePixelFormat входит в Win32API.
; В структуре pfd :PIXELFORMATDESCRIPTOR
; лежит наш "заказ" на пиксельный формат (ПФ),
; который мы хотели бы использовать в OpenGL.
; Просим Windows подобрать нам подходящий
; ПФ из поддерживаемых железом на выбранном
; контексте устройства - hDC
invoke ChoosePixelFormat, hDC, ADDR pfd
; Ошибка - "Нет подходящего пиксельного формата."
; и выходим
mov PixelFormat, eax

; Подпрграмма SetPixelFormat входит в Win32API.
; Настраиваем наш контекст устройства (hDC) на
; работу с подходящим пиксельным форматом, также
; сообщаем некоторую дополнительную информацию
; из нашей структуры pfd :PIXELFORMATDESCRIPTOR
; (windows добавит к выбранному ПФ "тонкие настройки")
; "Cоединение КУ с ОpenGL возможно по протоколу ABC_XXbits"
invoke SetPixelFormat, hDC,PixelFormat, ADDR pfd
; Ошибка - "Установка ПФ не удалась."
; и выходим

; Подпрграмма wglCreateContext входит в API OpenGL (windows версия).
; Просим OpenGL создать у себя контекст изображения,
; который можно отобразить на контексте устройства нашего
; окна -- формат пикселей у КУ и КИ  одинаковый!
; "Подготовить OpenGL для коннекта по протоколу ABC_XXbits"
invoke wglCreateContext, hDC
; Ошибка - "Ошибка в создании контекста изображения."
; и выходим
mov hRC, eax

; Подпрграмма wglMakeCurrent входит в API OpenGL (windows версия).
; Делаем созданный котекст изображения (hRC) активным,
; сообщаем на каком контексте устройства (hDC) мы хотим видеть
; результаты выполнения наших комманд к ОpenGL (сегодня мы рисуем
: на мониторе).  OpenGL готов к выполнению наших комманд, находится
: в режиме ожидания.
; Поздравляю, мы в OpenGLe - 3D открыт!
invoke wglMakeCurrent, hDC, hRC
; Oшибка - "Ошибка активизации КИ."
; и выходим

; Подпрграмма ShowWindow входит в Win32API.
; Являем OpenGL окно миру
invoke ShowWindow, hWnd, SW_SHOW

; Подпрграмма SetForegroundWindow входит в Win32API.
; Да не просто являем, а выпячиваем
invoke SetForegroundWindow, hWnd

; Подпрграмма SetFocus входит в Win32API.
; Да не просто являем и выпячиваем, а насильно
; приковываем к нему всеобщее внимание.
invoke SetFocus, hWnd

return TRUE
CreateGLWindow endp

Keep your country tidy! (англ.)

Как бы Вам понравилось, если на Вашей жилой площади совершенно чужие люди брали ваши кровные контекстные устройства и создавали разные контексты изображения, работали с ними в свое удовольствие, жутко при этом мусорили и, махнув ручкой на прощанье, убирались восвояси, не прибрав за собой? Вот и ОС Windows будет ужасно расстроена, если мы не приберемся.

Напомню, что, создавая наше первое OpenGL приложение, мы на время взяли для рисования контекст устройства окна. Затем по нашей просьбе добрый OpenGL выделил для программы частичку себя – контекст изображения. Настоящие джентльмены, поиграв в чужие игрушки, возвращают их хозяевам.

;
;  MASMv7
;
;-------------------------------------------------------
CloseOGLWindow proc
;-------------------------------------------------------

; Есть ли в нашем распоряжении контекст изображения OpenGL?
.IF hRC != 0

   ; Подпрограмма wglMakeCurrent входит в API OpenGL (windows версия).
   ; Сообщаем OpenGL, что больше не хотим активного соединения с его
   ; сервером. ОpenGL перестает быть активным, все наши комманды ему
   ; будут проигнорированы, хотя созданный для  программы контекст
   ; изображения все еще зарезервирован.
   invoke wglMakeCurrent, NULL, NULL

   ; Подпрограмма wglDeleteContext входит в API OpenGL (windows версия).
   ; Мы сообщаем OpenGL, что выделенный для нас контекст изображения
   ; нам больше не понадобится. Сервер приводит себя в порядок, а мы идем
   ; своей дорогой. «И разошлись как в море корабли»
   invoke wglDeleteContext, hRC
.ENDIF


; Подпрограмма ReleaseDC входит в Win32API.
; Возвращаем фотографию Марьивановне с глубокой благодарностью
invoke ReleaseDC, hWnd, hDC

; Окно нашей программе больше не нужно
invoke DestroyWindow, hWnd

; Убираем за собой
invoke UnregisterClass, ADDR szClassName, hInstance

; Рисуем поразительно реальный 3D образ Клаудии Шифер, в полный рост и
; совершенно голую.
ret
; Шутка.
KillOGLWindow endp
  

PFD_SUPPORT_OPENGL equ 020h

Мы узнали почти все, чтобы закончить этот отрывок из МASM.OpenGL.Chapters. На сладкое осталась структура формата пикселей – pfd.

;
;  MASMv7
;
pfd PIXELFORMATDESCRIPTOR  { \
 sizeof PIXELFORMATDESCRIPTOR,
  1,
  PFD_DRAW_TO_WINDOW or  PFD_SUPPORT_OPENGL,
  PFD_TYPE_RGBA,
  32,
  0, 0, 0, 0, 0, 0,
  0,
  0,
  0,
  0, 0, 0, 0,
  0,
  0,
  0,
  0,
  0,
  0, 0, 0}

Нули нас пока не интересуют.

Единица это pfd.nVersion – версия структуры (да и такое бывает). nVersion всегда равна единице.

32 – это pfd.cColorBits, определяет кол-во битов на один пиксель (bbp), т.е. количество разнообразных цветов в которые можно этот пиксель покрасить. Я взял 32 (а мог бы 24 или 16, например), что даст мне возможность отобразить 4,294,967,295 цветов.

PFD_TYPE_RGBA (pfd. iPixelType)– сообщает Windows, что цвета пикселей мы будем определять через Red Green Blue компоненты (подробнее в следующих главах)

И последним определяем элемент pdf. dwFlags:
PFD_DRAW_TO_WINDOW сообщает Windows о том, что мы будет рендерить (строить 3D сцены) в окно, а не в память, например.
PFD_SUPPORT_OPENGL – у меня нет информации.

В этой главе мы казалось бы ничего не сделали особенного. То, что получилось, Вы увидите, когда после внимательнейшего изучения исходника; сами скомпилируете его, если надо – отловите ошибки, а затем запустите. Напоминаю, СНАЧАЛА изучаете исходник, ПОТОМ компилируете, выдерживаете одни сутки, и в самую последнюю очередь запускаете. Так и только так.

Один мой хороший знакомый добился исключительных результатов за непостижимо короткий срок. Когда я попытался выяснить, в чем секрет и какими пособиями он пользовался, ZYtDHE грустно посмотрел в мою сторону и виновато промямлил «Рассыпался винчестер, а на старом не было компилятора». (!!!) Этот парень создавал программы, отлавливал свои ошибки в течении двух недель, так не разу и не запустив код на исполнение. «All errors are made by mistake» (c) ZYtDHE.

Вы замечали, что первое впечатление от знакомства с чем-то новым - самое сильное? Если именно сейчас в эти первые минуты после прочтения текста вы постараетесь вникнуть в философию OpenGL, с самых азов, с вызова его первой подпрограммы, с инициализации его первой структуры, то остальной более продвинутый материал покажется вам логичным продолжением, вы увидите в хаосе нулей и единиц, байтов и двойных слов, в контекстах изображения удивительную красоту и гармонию. И тогда вы сможете импровизировать, как хороший музыкант на любимом инструменте, а возможности API OpenGL будут ограниченны лишь Вашей фантазией.

Информация к размышлению

Так как исходник без комментариев и обработки возможных ошибок после вызова подпрограмм API (на их месте стоят мои комментарии «и выходим» ,смотри выше по тексту), предлагаю следующий конкурс для любознательных – доработайте исходник. Лучший будет опубликован в следующей главе).

Еще необходимо предупредить читателя о том, что откомпилированный исходник может вообще не запуститься. Если это Ваш случай – остается только порадоваться. Ведь потратив некоторое время на самостоятельный поиск и исправление ошибок вы лучше усвоите материал, и значит потратили время не зря. Вам может понадобится отладчик. К сожалению, у меня сейчас при себе нет его номера телефона, а на email он не отвечает. Поищите его в Интернете. Встретите Сафонову Асю, передавайте привет.

Автор работает в редакторе AsmEditor, который можно скачать отсюда (http://www.avtlab.ru/) Так же скачайте и установите базу подсветки синтаксиса, которую любезно предоставил vkim, разработчик VKDEBUG (входит в пакет MASMv7).

Основные возможности AsmEditor:

  • подключение различных компиляторов (Ассемблер, Си и другие);
  • настраиваемые схемы подсветки ключевых слов;
  • быстрый переход между процедурами, функциями, метками;
  • возможность подключения файлов помощи (например, win32.hlp) для вызова контекстной справки по выделенному в редакторе слову;
  • работа с исходными кодами в DOS-кодировке без потери символов псевдографики;
  • меню и дополнительные кнопки с функциями, назначаемыми пользователем;
  • настраиваемые "горячие клавиши"; быстрый переход по номеру строки; "закладки"; сохранение позиции курсора и т.д.
  • Не требует инсталляции, не вносит изменений в системные файлы и реестр.
  • По умолчанию настроен на пакет MASM32

Также скачайте fraps (www.fraps.com) и испробуйте его на каких-нибудь программах.

Для развлечения, поиграйте с графическими режимами в своем любимом FPS, попереключайтесь с 16 на 32 цветность. Постарайтесь объяснить увиденное.

Просто вопросы на засыпку:

1) Если мы будем работать в режиме off-screen rendering’га (т.е. рисовать изображение в памяти компьютера, а не выводить на экран) сможем ли получить любой «заказанный» формат пикселей для роботы на этом контексте устройства (ограничений то по «железу» на память нет)?

2) Что такое wiggle?

3) Почему в нашей программе необходимо указывать WS_CLIPSIBLINGS и WS_CLIPCHILDREN при вызове CreateWindowEx?

- Ну что же, Поттер, уже неплохо. Возможно, что-то надо добавить, сделайте приложением какую-нибудь программу и оформляйте, - снисходительно произнес Снегг. - И не забудьте про список литературы! А теперь проведем практику - потренируемся в обезвреживании вирусов. Команда Слизерина против команды Гриффиндорфа - каждый из вас напишет вирус и заразит машину противника. Потом будем обезвреживать. За каждый вирус, с которым не удалось справится, автор получит +300 баллов.
- Но профессор, - начал ошеломленный Гарри, - Вы же говорили, что вирусы пишут только Темные...
- Отлично, Поттер, вы можете не писать. У команды Слизерина будет больше шансов. - усмехнулся Снегг. Гарри обреченно вздохнул. Вместе с ним вздохнула вся команда Гриффиндорфа - с обезвреживанием они слегка разобрались, но писать вирусы не умел никто. "Я вообще-то читал сегодня, как написать вирус...", - начал Гарри. "Тогда вся надежда на тебя!", и Гермиона так посмотрела на него, что нельзя было не вдохновиться... Полчаса усилий были затрачены впустую. У слизеринцев тоже была заминка. Снегг хмурился. Было похоже, что единственный работоспособный вирус будет у Малфроя - он выставлял галочки на истекающем кровью экране и победно поглядывал на Гарри. "Похоже на какой-то генератор вирусов", подумал Поттер и пожалел, что не скачал такой же себе. "Осталось 15 минут!", объявил профессор. Мыслей не было, за 5 минут до истечения срока Гарри открыл блокнот и набрал: "нУ_и ду&рак Же tы*Malфрой!Н*(-;)Н!Н " "Для Драко сойдет, по крайней мере попытаться можно!", подумал он, переименовывая текстовый файл в .com...
...Комьютер пискнул и повис. Малфрой нажал Ctrl-Alt-Del. Ничего не произошло. После кнопки "резет" вместо теста памяти на экран высыпало кучу закорючек. "На чем вы писали свой вирус, Поттер?"- спросил Снегг. "На ассемблере", - соврал Гарри. Звенящую тишину нарушил шепот Рона: "Гарри, ты что, не знаешь, что вирусы на ассемблере писал Тот, Кого Нельзя Называть?"...

...to be continued!

Примечание профессора С. Снегга: Несмотря на свой "ассемблер", реферат на халяву у Поттера не пройдет! Я прекрасно знаю русский и постоянно захожу на WASM.RU. Эту статью писал xzazet, и если это не будет упомянуто в списке литературы, кое-кто получит "пару"!

ЗЫ: ну как всегда, если будут проблемы с именем Поттер (R), меняем Гермиону Грейнджер на Таню Гроттер, Гарри Поттера на Порри Гаттера, Снегга - еще на какого Али Гаттора и порядок! ;))

ЗЗЫ: запуск данной строки как .com-файла автором не рекомендуется и полностью на совести экспериментатора :)