[Главная] [Новости] [Статьи] [Игры] [Проекты] | [Автор] | |||
Основы 3D-программирования DirectX8.1 в Delphi 6-7: теоретические и практические основы создания игр. | ||||
[Все уроки] | ||||
В упражнениях даются примеры модификаций исходного кода примера и краткое описание того, что при этом наблюдается и как это объясняется. | Выполняя упражнения Вы лучше вникнете в суть проблемы. | |||
Для начала откомпилируйте пример и запустите приложение. Убедитесь, что всё работает. (Если нет, то читайте файл readme.txt приложенный к архиву, а также замечания!) |
||||
Мы наблюдаем вид подводной сцены с бликами на морском дне и поверхности подлодки. Подводная лодка перемещается по круговой орбите. Можно управлять камерой клавишами: [влево], [вправо], [вверх], [вниз], [+]/[-] (на цифровой клавиатуре), [Home]/[End],[Insert]/[PageUp],[Delete]/[PageDown]. |
||||
Отрисовка статичных объектов сцены производится в методе function CSubmarineD3DApp.Render. Попробуем разобраться где отрисовываются наши объекты. в коде указанного метода найтиде строчку RenderFog; закомментируйте ее, т.е. измените на строку содержащую комментарий - вот так //RenderFog; или так {RenderFog;} при этом данная строка кода (и соответствующий метод) не компилируются и, следовательно, не исполняются в приложении. Откомпилируйте Ваше приложение. После компиляции вы получите подсказку о результатах компиляции: [Hint] Main.pas(192): Private symbol 'RenderFog' declared but never used |
||||
Понятно, что метод объявлен, но нигде не вызывается, поэтому мы и получили такое сообщение! Однако запустим наше откомпилированное приложение и посмотрим, что в нём изменилось. | ||||
Вы увидите, что туман, имитирующий подводную среду исчез. Теперь Вы знаете, что данный метод (RenderFog) управляет выводом тумана в нашем приложении и можете посмотреть его исходный код, чтобы узнать как это осуществляется. | ||||
Если Вам стала понятна суть наших манипуляций, то Вы нашли способ, каким можно экспериментировать с нашим примером и узнавать много нового и интересного! Если снова раскомментировать строку и перекомпилировать код, то всё возвращается на исходную позицию. | ||||
Попробуем еще? | ||||
Если Вы закомментируете строчку RenderScene;в том же методе (function CSubmarineD3DApp.Render), то увидите, что всё кроме подлодки и бликов на ней исчезнет! Значит реализация отрисовки объектов сцены находится ... Правильно! В методе RenderScene. | ||||
Экспериментируя с временным отключением отдельных частей кода (путем их комментирования), Вы узнаете, где и что в данном методе отрисовывается. Конечно, чтобы детально разобраться во всех подробностях Вам обязательно понадобится чтение документации по DirectX8.1 (DX SDK). Я же здесь пока не даю подробных описаний, поскольку они выходят за рамки данной публикации. Поэтому имейте в виду! Чтобы детально изучить создание DirectX-приложений Вам неминуемо потребуется изучение первоисточника, т.е. DirectX SDK на английском языке! |
||||
Там же, т.е. в методе (function CSubmarineD3DApp.Render), отключим строку RenderCaustic; - исчезло всё! | ||||
Т.к. в данном приложении все вершины проходят через вершинный шейдер используемый как раз в этом методе, то мы и наблюдаем полное исчезновение всего - т.е. полное отсутствие каких-либо отрисовываемых вершин. | ||||
Теперь Вы знаете, где искать вывод бликов. | ||||
Все анимации осуществляются внутри метода function CSubmarineD3DApp.FrameMove | ||||
Поэкспериментируйте с кодом этого метода и установите: что и где отрисовывается. Т.е. как осуществляется движение подлодки и каким образом анимировано движение бликов. | ||||
В папке media из архива данного примера Вы найдете модели, текстуры и код шейдеров. | ||||
Еще об некоторых интересных вещах: наверное Вы обнаружили в коде метода function CSubmarineD3DApp.RenderScene, когда исследовали его, строчки, помеченные таким комментарием: //** m_pWaterPlane.Render(m_pd3dDevice); попробуйте раскомментировать и откомпилировать (звездочки ** естественно тоже нужно убрать! иначе получите синтаксическую ошибку компиляции). если раскомментировать данную строку и откомпилировать приложение, то при подъеме на некоторую высоту (клавишей [-] на цифровой клавиатуре) исчезает вид морского дна. На самом деле это выводится плоскость имитирующая поверхность морской воды (т.е. разделение сред вода/воздух). Но, поскольку объемный туман не используется, никакого разделения не происходит. Поверхность "затуманивается". Если теперь попробовать закомментировать строку RenderFog; в методе CSubmarineD3DApp.Render, то вы увидите вид поверхности воды. |
||||
Но подлодка при этом как бы плавает в воздухе. Как это исправить? | ||||
Если Вы были усидчивы и разбирались с содержимым метода CSubmarineD3DApp.FrameMove, то наверное нашли строки, в которых происходит перемещение подлодки в трехмерном пространстве: //
Animate file object
- анимировать файл-объект |
||||
Если Вы еще не догадались что Вам следует теперь сделать, то вот Вам подсказка: найдите строчку D3DXMatrixTranslation(mat, 2.0, 1.0, 0.0); и измените смещение по оси Y на -0.1, т.е. D3DXMatrixTranslation(mat, 2.0, -0.1, 0.0); и подлодка уходит в воду аж по самую ватерлинию! (не забудьте откомпилировать, чтобы изменения кода вступили в силу :)))) |
||||
Теперь о шейдерах. | ||||
[Назад] [Все уроки] | ||||
[Главная] [Новости] [Статьи] [Игры] | ||||
(c) Мега Информатик 2006-2007 |