DirectX: характеристика версий, особенности использования

Пакет средств разработки DirectX под Microsoft Windows, характеристика наборов COM-совместимых объектов в его составе. Ключевые особенности версий, шейдерные языки. Описание основных используемых функций. Исходный код программы, примеры ее работы.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 16.02.2015
Размер файла 422,2 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Оглавление

  • DirectX
  • Ключевые особенности версий DirectX
  • Шейдерные языки
  • Описание использующихся функций
  • Функция D3DXMatrixPerspectiveFovLH
  • Функция D3DXMatrixTranspose
  • Функция D3DXMatrixMultiply
  • Функция D3DXCreateTextureFromFile
  • Функция D3DXLoadMeshFromX
  • Функция D3DXAssembleShaderFromFile
  • Функция MessageBox
  • Исходный код программы
  • Пример работы программы
  • Вывод
  • Список литературы

DirectX

DirectX (от англ. direct - прямо, напрямую) - это набор API, разработанных для решения задач, связанных с программированием под Microsoft Windows. Наиболее широко используется при написании компьютерных игр. Пакет средств разработки DirectX под Microsoft Windows бесплатно доступен на сайте Microsoft. Зачастую обновленные версии DirectX поставляются вместе с игровыми приложениями.

Практически все части DirectX API представляют собой наборы COM-совместимых объектов.

В целом, DirectX подразделяется на:

· DirectX Graphics, набор интерфейсов, ранее (до версии 8.0) делившихся на:

· DirectDraw: интерфейс вывода растровой графики. (Его разработка давно прекращена)

· Direct3D (D3D): интерфейс вывода трёхмерных примитивов.

· DirectInput: интерфейс, используемый для обработки данных, поступающих с клавиатуры, мыши, джойстика и пр. игровых контроллеров.

· DirectPlay: интерфейс сетевой коммуникации игр.

· DirectSound: интерфейс низкоуровневой работы со звуком (формата Wave)

· DirectMusic: интерфейс воспроизведения музыки в форматах Microsoft.

· DirectShow: интерфейс, используемый для ввода-вывода аудио и/или видео данных.

· DirectX Instruments - технология, позволяющая на основе мультимедийного API DirectX создавать и использовать программные синтезаторы. В отличие от DX-плагинов, такие программы могут полностью управляться по MIDI и служат главным образом не для обработки, а для синтеза звука. Технология DXi была популярна в 2001-2004 гг., особенно в программных продуктах Cakewalk, но со временем проиграла "войну форматов" технологии VST от Steinberg.

· DirectSetup: часть, ответственная за установку DirectX.

· DirectX Media Objects: реализует функциональную поддержку потоковых объектов (например, кодировщики/декодировщики)

· Direct2D: интерфейс вывода двухмерной графики

Изначально нацеленный на разработку видеоигр, DirectX стал популярен и в других областях разработки программного обеспечения. К примеру, DirectX, наряду с OpenGL, получил очень широкое распространение в инженерном/математическом ПО.

В 1994 году Microsoft была практически готова выпустить следующую версию Windows - Windows 95. Главным фактором, определяющим, насколько популярна будет новая ОС, являлся набор программ, которые можно будет запускать под её управлением. В Microsoft пришли к выводу, что, пока разработчики видят MS-DOS более подходящей для написания игровых приложений, коммерческий успех новой ОС весьма сомнителен.

MS-DOS позволяла разработчику получить прямой доступ к видеокарте, клавиатуре/мыши/джойстику и прочим частям системы, в то время как Windows 95, с её защищённой моделью памяти, предоставляла более стандартизованный, но в то же время весьма ограниченный и накладный доступ к устройствам. Microsoft нуждалась в новом способе дать разработчику всё, что ему необходимо. Айслер (Eisler), Сэйнт Джон (St. John), и Энгстром (Engstrom) решили эту проблему, назвав само решение DirectX.

Первый релиз DirectX был выпущен в сентябре 1995 года, под названием "Windows Game SDK".

Ещё до появления DirectX, Microsoft включила OpenGL в ОС Windows NT. Direct3D позиционировался как замена OpenGL в игровой сфере. Отсюда берёт своё начало "священная война" между сторонниками кросс-платформенной OpenGL и доступной лишь в Windows (в том числе Windows NT) Direct3D. Так или иначе, остальные части DirectX очень часто комбинируются с OpenGL в компьютерных играх, так как OpenGL как таковой не подразумевает функциональность уровня DirectX (например, доступ к клавиатуре/джойстику/мыши, поддержка звука, игры по сети и т.д.).

DirectX является базой для Xbox API. Xbox API схож с DirectX 8.1, но обновление версии, как и на других консолях того времени, невозможно.

В 2002 году Microsoft выпустила DirectX 9 с улучшенной и расширенной поддержкой шейдеров. С 2002 года DirectX неоднократно обновлялся. В августе 2004 года в DirectX была добавлена поддержка шейдеров версии 3.0 (DirectX 9.0c).

В апреле 2005 интерфейс DirectShow был перемещён в Microsoft Platform SDK.

Ключевые особенности версий DirectX

· DirectX 6.0 - мультитекстурирование

· DirectX 7.0 - аппаратная поддержка преобразований, обрезания и освещения

· DirectX 8.0 - шейдерная модель 1.1

· DirectX 8.1 - пиксельные шейдеры 1.4 и вершинные шейдеры 1.1

· DirectX 9.0 - шейдерная модель 2.0

· DirectX 9.0b - пиксельные шейдеры 2.0b и вершинные шейдеры 2.0

· DirectX 9.0c - шейдерная модель 3.0

· DirectX 9.0L - версия DirectX 9.0 для Windows Vista

· DirectX 10 - шейдерная модель 4.0 (только Windows Vista, Windows 7, Windows 8)

· DirectX 10.1 - шейдерная модель 4.1 (только Windows Vista, Windows 7, Windows 8)

· DirectX 11 - шейдерная модель 5.0 (только Windows Vista, Windows 7, Windows 8)

· DirectX 11.1 - шейдерная модель 5.0 (только Windows 7 SP1, Windows 8)

· DirectX 11.2 - шейдерная модель 5.0 (только Windows 8.1)

Шейдеры

Шемйдер (англ. Shader; схема затемнения, программа построения теней) - это программа для одной из ступеней графического конвейера, используемая в трёхмерной графике для определения окончательных параметров объекта или изображения. Она может включать в себя произвольной сложности описание поглощения и рассеяния света, наложения текстуры, отражение и преломление, затемнение, смещение поверхности и эффекты пост-обработки.

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

Вершинные шейдеры (Vertex Shader)

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

Геометрические шейдеры (Geometry Shader)

Геометрический шейдер, в отличие от вершинного, способен обработать не только одну вершину, но и целый примитив. Это может быть отрезок (две вершины) и треугольник (три вершины), а при наличии информации о смежных вершинах (adjacency) может быть обработано до шести вершин для треугольного примитива. Кроме того, геометрический шейдер способен генерировать примитивы "на лету", не задействуя при этом центральный процессор. Впервые начал использоваться на видеокартах Nvidia серии 8.

Пиксельные шейдеры (Pixel Shader)

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

Шейдерные языки

Впервые использованные в системе RenderMan компании Pixar, шейдеры получали всё большее распространение со снижением цен на компьютеры. Основное преимущество от использования шейдеров - их гибкость, упрощающая и удешевляющая цикл разработки программы, и при том повышающая сложность и реалистичность визуализируемых сцен.

Шейдерные языки обычно содержат специальные типы данных, такие как матрицы, семплеры, векторы, а также набор встроенных переменных и констант для удобной интеграции со стандартной функциональностью 3D API. Поскольку компьютерная графика имеет множество сфер приложения, для удовлетворения различных потребностей рынка было создано большое количество шейдерных языков.

Профессиональный рендеринг

Данные шейдерные языки ориентированы на достижение максимального качества визуализации. Описание свойств материалов сделано на максимально абстрактном уровне, для работы не требуется особых навыков программирования или знания аппаратной части. Такие шейдеры обычно создаются художниками с целью обеспечить "правильный вид", подобно наложению текстуры, источников света и другим аспектам их работы.

Обработка таких шейдеров обычно представляет собой ресурсоёмкую задачу. Совокупная вычислительная мощность, необходимая для обеспечения их работы, может быть очень велика, так как используется для создания фотореалистичных изображений. Основная часть вычислений при подобной визуализации выполняется большими компьютерными кластерами.

· RenderMan

Шейдерный язык RenderMan, описанный в Спецификации интерфейса RenderMan, является фактическим стандартом для профессионального рендеринга. API RenderMan, разработанный Робом Куком, используется во всех работах студии Pixar. Он также является первым из реализованных шейдерных языков.

· Gelato

NVIDIA Gelato представляет собой оригинальную гибридную систему рендеринга изображений и анимации трехмерных сцен и объектов, использующую для расчетов центральные процессоры и аппаратные возможности профессиональных видеокарт серии Quadro FX.

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

· Open Shading Language

Open Shading Language (OSL) - представляет собой небольшой, но богатый язык для программируемых шейдеров в развитых рендерах и других приложениях, идеально подходит для описывающих материалов, света, перемещения и получения изображения.

OSL - был разработан Sony Pictures Imageworks для использования в своем внутреннем рендере и используется для анимационных фильмов и визуальных эффектов.

OSL используется в пакете для создания трёхмерной компьютерной графики Blender. http://ru. wikipedia.org/wiki/%D0%A8%D0%B5%D0%B9%D0%B4%D0%B5%D1%80 - cite_note-3

Рендеринг в реальном времени

· Шейдерный язык OpenGL

Шейдерный язык OpenGL носит название GLSL (The OpenGL Shading Language). GLSL основан на языке ANSI C. Большинство возможностей языка ANSI C сохранено, к ним добавлены векторные и матричные типы данных, часто применяющиеся при работе с трехмерной графикой. В контексте GLSL шейдером называется независимо компилируемая единица, написанная на этом языке. Программой называется набор откомпилированных шейдеров, связанных вместе.

· Шейдерный язык Cg

Разработан nVidia совместно с Microsoft (такой же по сути язык от Microsoft называется HLSL, включён в DirectX 9). Cg расшифровывается как C for Graphics. Язык действительно очень похож на C, он использует схожие типы (int, float, а также специальный 16-битный тип с плавающей запятой - half). Поддерживаются функции и структуры. Язык обладает своеобразными оптимизациями в виде упакованных массивов (packed arrays) - объявления типа "float a [4] " и "float4 a" в нём соответствуют разным типам. Второе объявление и есть упакованный массив, операции с упакованным массивом выполняются быстрее, чем с обычными. Несмотря на то, что язык разработан nVidia, он без проблем работает и с видеокартами ATI. Однако следует учесть, что все шейдерные программы обладают своими особенностями, о которых можно узнать из специализированных источников.

· Шейдерные языки DirectX

Низкоуровневый шейдерный язык DirectX (DirectX ASM)
По синтаксису сходен с Ассемблером. Существует несколько версий, различающихся по набору команд, а также по требуемому оборудованию. Существует разделение на вершинные (vertex) и пиксельные (pixel) шейдеры, которые различаются.
Вершинный шейдер
Выполняет обработку геометрии, то есть изменяет параметры вершины, такие, как позицию, текстурные координаты, цвет вершин. Также может выполнять вычисления освещения. Допустимое количество команд может достигать одной-двух сотен. Пример фрагмента кода:
vs.2.0
dcl_position v0
dcl_texcoord v3
m4x4 oPos, v0, c0
mov oT0, v3
Пиксельный шейдер
Выполняет обработку цветовых данных, полученных при рисовании треугольника. Оперирует с текстурами и цветом. Количество инструкций значительно ограничено. Так, к примеру, в версии 1.4 оно не может быть больше 32-х. Пример фрагмента кода:
ps.1.4
texld r0, t0
mul r0, r0, v0

directx код программа версия

Описание использующихся функций

Функция Invoke

function Invoke (имя API функции, параметры): Integer;

Данная функция помещает параметры в стек и вызывает указанную API функцию.

Функция GetModuleHandle

function GetModuleHandle (ModuleName: PChar): THandle;

Считывает описатель модуля.

Паpаметpы:

· ModuleName: Имя модуля (заканчивающееся пустым символом).

Возвращаемое значение: в случае успешного завеpшения - идентификатоp модуля; 0 - в пpотивном случае.

Функция находится в файле kernel32. dll.

Функция ExitProcess

function ExitProcess (uExitCode);

Закончить данный процесс со всеми подзадачами (потоками).

Параметры:

· uExitCode Определяет код выхода для процесса, и для всех потоков, которые завершают работу в результате вызова этой функции.

Функция Direct3DCreate9

function Direct3DCreate9 (SDKversion);

Создаёт Direct3D9 объект и выдаёт указатель на его интерфейс.

Параметры:

· SDKversion - версия подключаемого интерфейса.

Возвращаемое значение: указатель на интерфейс Direct3D9 иначе NULL.

Функция D3DXMatrixRotationY

function D3DXMatrixRotationY (pOut,Angle);

Создаёт матрицу, вращающуюся вокруг оси Y.

Параметры:

· pOut - указатель на результирующую структуру D3DXMATRIX.

· Angle - угол.

Возвращаемое значение: указатель на структуру D3DXMATRIX повёрнутую вокруг оси Y на угол.

Функция D3DXMatrixLookAtLH

function D3DXMatrixLookAtLH (pOut,pEye,pAt,pUp);

Строит левостороннюю матрицу вида.

Параметры:

· pOut - указатель на результирующую структуру D3DXMATRIX.

· pEye - указатель на структуру D3DXVECTOR3 являющуюся точкой расположения камеры.

· pAt - указатель на структуру D3DXVECTOR3, определяющую место, куда направлена камера.

· pUp - указатель на структуру D3DXVECTOR3, определяющую приподнятость мира.

Возвращаемое значение: указатель на структуру D3DXMATRIX, являющуюся левосторонней матрицей вида.

Функция D3DXMatrixPerspectiveFovLH

function D3DXMatrixPerspectiveFovLH (pOut,fovy,Aspect,zn,zf);

Строит левостороннюю матрицу проекции.

Параметры:

· pOut - указатель на результирующую структуру D3DXMATRIX.

· fovy - сектор просмотра в направлении Y в радианах.

· Aspect - отношение ширины пространства к высоте.

· zn - значение Z вектора ближней поверхности.

· zf - значение Z вектора дальней поверхности.

Возвращаемое значение: указатель на структуру D3DXMATRIX, являющуюся левосторонней матрицей проекции.

Функция D3DXMatrixTranspose

function D3DXMatrixTranspose (pOut,pM);

Транспонирует матрицу.

Параметры:

· pOut - указатель на результирующую структуру D3DXMATRIX.

· pM - указатель на входную структуру D3DXMATRIX.

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

Функция D3DXMatrixMultiply

function D3DXMatrixMultiply (pOut,pM1,pM2);

Перемножает элементы двух матриц.

Параметры:

· pOut - указатель на результирующую структуру D3DXMATRIX.

· pM1 - указатель на первую матрицу.

· pM2 - указатель на вторую матрицу.

Возвращаемое значение: указатель на структуру D3DXMATRIX, являющуюся результатом перемножения входных матриц.

Функция D3DXCreateTextureFromFile

function D3DXCreateTextureFromFile (pDevice,pSrcFile,ppTexture);

Создаёт текстуру из файла.

Параметры:

· pDevice - указатель на Direct3D9 интерфейс.

· pSrcFile - указатель на строку с именем файла текстуры.

· ppTexture - указатель на Direct3D9 интерфейс, описывающий созданный текстурный объект.

Возвращаемое значение: D3D_OK или сообщение об ошибке.

Функция D3DXLoadMeshFromX

function D3DXLoadMeshFromX (pFilename, Options, pD3DDevice, ppAdjacency, ppMaterials, ppEffectInstances, pNumMaterials,ppMesh);

Загружает 3D модель из. x файла.

Параметры:

· pFilename - имя файла. x.

· Options - опции создания модели.

· pD3DDevice - указатель на Direct3D9 интерфейс.

· ppAdjacency - указатель на буфер 3х соседей модели в каждой плоскости.

· ppMaterials - указатель на буфер содержащий D3DXMATERIAL структуры.

· ppEffectInstances - указатель на буфер примеров эффектов.

· pNumMaterials - указатель на число структур в ppMaterials.

· ppMesh - адрес указателя на ID3DXMesh интерфейс.

Возвращаемое значение: D3D_OK или сообщение об ошибке.

Функция D3DXAssembleShaderFromFile

function D3DXAssembleShaderFromFile (pSrcFile, pDefines, pInclude, lags, ppShader, ppErrorMsgs);

Собирает шейдерный код.

Параметры:

· pSrcFile - имя файла.

· pDefines - указатель на массив структур D3DXMACRO, обычно NULL.

· pInclude - указатель на ID3DXInclude подключаемый к шейдерному коду.

· Flags - флаги.

· ppShader - указатель на буфер содержащий шейдер.

· ppErrorMsgs - указатель на буфер содержащий листинг ошибок.

Возвращаемое значение: D3D_OK или сообщение об ошибке.

Функция MessageBox

function MessageBox (Parent: HWnd; Txt, Caption: PChar; TextType: Word): Integer;

Создает и отобpажает блок диалога, содеpжащий указанное сообщение и заголовок, а также пpедопpеделенные пиктогpаммы и текстовые кнопки, в соответствии с паpаметpом TexType.

Паpаметpы:

· Parent: Окно, владеющее блоком сообщений.

· Txt: Отобpажаемое сообщение (заканчивающееся пустым символом).

· Caption: Заголовок блока диалога (заканчивающийся пустым символом) или nil для "Error" ("Ошибка").

· TextType: Одна или комбинация констант mb.

Возвращаемое значение: в случае успешного завеpшения одна из следующих констант: id_Abort, id_Cancel, id_Ignore, id_No, id_OK, id_Retry или id_Yes.

Функция находится в файле user32. dll.

Сообщение операционной системы Windows:

· WM_CREATE - Сообщение приходящее при создании окна.

· WM_DESTROY - Сообщение, приходящее на процедуру окна при его уничтожении.

· WM_KEYDOWN - Сообщение, приходящее, когда на пользователь нажимает клавишу на клавиатуре.

Исходный код программы

.586

. MMX

. XMM

. MODEL FLAT, STDCALL

OPTION CASEMAP: none

INCLUDE \masm32\Include\windows. inc; Структуры, константы.

INCLUDE \masm32\Include\kernel32. inc; Системные функции приложения.

INCLUDE \masm32\Include\user32. inc; Интерфейс.

INCLUDE \masm32\Include\gdi32. inc; Графический вывод.

INCLUDE \masm32\include\winmm. inc; Функция timeGetTime

INCLUDELIB\masm32\Lib\kernel32. lib

INCLUDELIB\masm32\Lib\user32. lib

INCLUDELIB\masm32\Lib\gdi32. lib

INCLUDELIB \masm32\lib\winmm. lib

INCLUDE \masm32\Dxsdk90\Include\2005_jun\d3d9_all. inc

INCLUDELIB \masm32\Dxsdk90\Lib\2005_jun\d3d9. lib

INCLUDELIB \masm32\Dxsdk90\Lib\2005_jun\d3dx9. lib; Подключение D3DX функций (динамическая библиотека)

; ПРОТОТИПЫ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Init_Direct3D PROTO; Текст этих функций можно найти ниже

Destroy_Direct3D PROTO

Release_Object PROTO: DWORD

Set_Render_Parameters PROTO

Init_Scene PROTO

Render_Scene PROTO

; ====================================================

; Основная часть

; ====================================================

. DATA;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

szClassName db "MyClass", 0

szAppName db "DX9_Ku"," ",169,"Nikita", 0

; WNDCLASSEX - -------------------------------------------

cbSize dd 12*4

style dd CS_HREDRAW+CS_VREDRAW+20h

lpfnWndProc dd OFFSET WndProc

cbClsExtra dd 0

cbWndExtra dd 0

hInstance dd 400000h

hIcon dd 0

hCursor dd 0

hbrBackground dd BLACK_PEN

lpszMenuName dd 0

lpszClassName dd OFFSET szClassName

hIconSm dd 0

; Сообщения об ошибках - ---------------------------------

szDirect3D9 db "Не удалось создать обьект Direct3D9",9,9,0

szD3DDevice9 db "Не удалось создать устройство Direct3D9",9,0

. DATA?;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

msg MSG <>

hwnd HWND?

clientwindow RECT <>

. CONST;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

WIN_X EQU 640; Размер окна по горизонтали

WIN_Y EQU 480; Размер окна по вертикали

. CODE;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Start:

invoke GetModuleHandle, NULL

mov hInstance, eax

invoke LoadCursor, NULL, IDC_ARROW

mov hCursor, eax

invoke RegisterClassEx, ADDR cbSize

invoke GetSystemMetrics, SM_CXSCREEN

push eax

invoke GetSystemMetrics, SM_CYSCREEN

sub eax, WIN_Y

shr eax, 1

pop ebx

sub ebx, WIN_X

shr ebx, 1

invoke CreateWindowEx, NULL, ADDR szClassName, ADDR szAppName,\

WS_SYSMENU or WS_VISIBLE, \

ebx, eax, WIN_X, WIN_Y, NULL, NULL, hInstance, NULL

mov hwnd, eax

invoke GetClientRect, eax, ADDR clientwindow

invoke Init_Direct3D; Создаем устройство

msg_loop:

invoke PeekMessageA, ADDR msg, 0, 0, 0, PM_REMOVE;

test eax, eax;

jne message; Если у окна нет сообщений.

;

invoke Render_Scene;. то отрисовывается сцена

jmp msg_loop;

;

message:;

mov eax, DWORD PTR msg. message;

cmp eax, WM_QUIT;

je end_loop;

;

invoke TranslateMessage, ADDR msg;

invoke DispatchMessage, ADDR msg;

jmp msg_loop

end_loop:

mov eax, msg. wParam; Если цикл обработки сообщений прерван,

; то код выхода из программы передается в поле wParam

Exit:; сообщения MSG.

invoke ExitProcess, eax

ret

; =====================================================

WndProc proc hWnd: HWND, uMsg: UINT, wParam: WPARAM, lParam: LPARAM

; =====================================================

cmp uMsg, WM_CREATE; Это сообщение посылается окну, когда оно создается

je wmCreate

cmp uMsg, WM_DESTROY; Это сообщение посылается окну, когда оно должно быть уничтожено.

je wmDestroy

cmp uMsg, WM_KEYDOWN; Это сообщение посылается окну, когда нажали клавишу на клавиатуре.

je wmKeydown

invoke DefWindowProc, hWnd, uMsg, wParam, lParam; Если Мы НЕ ХОТИМ обрабатывать полученное сообщение, то

ret; нам надо вызвать DefWindowProc с параметрами, которые Мы получили.

; Эта функция API обрабатывает не интересующие Нас события.

wmDestroy:; - -----------------------------------------

invoke Destroy_Direct3D

invoke PostQuitMessage, NULL

xor eax,eax

ret

wmCreate:; - -----------------------------------------

xor eax, eax

ret

wmKeydown:; - -----------------------------------------

mov eax, wParam

cmp eax, VK_ESCAPE

jne noExit

invoke SendMessage, hwnd, WM_CLOSE, NULL, NULL

noExit:

xor eax, eax

ret

WndProc endp

; =====================================================

; Начинается работа с Direct3D

; =====================================================

Init_Direct3D proc; Создавать Direct3DDevice в сообщении WM_Create нельзя!

. DATA

; D3DPRESENT_PARAMETERS - -----------------------------------------

BackBufferWidth dd 640; Ширина BackBuffer

BackBufferHeight dd 480; Высота BackBuffer

BackBufferFormat dd D3DFMT_X8R8G8B8; Формат используемой поверхности

BackBufferCount dd 3; число Back буферов.

MultiSampleType dd 0; уровни мультисэмплинга картинки. (обычно от 2-ух и выше)

MultiSampleQuality dd 0;

SwapEffect dd D3DSWAPEFFECT_FLIP; Эффект обмена поверхностей (BackBuffer)

hDeviceWindow dd 0; ID нашего окошка

Windowed dd 1; 0 - полноэкранный, 1 - в окошке

EnableAutoDepthStencil dd TRUE; 1 - Direct3D создает Z + Stencil буфер. Если 0 - ничего не будет создано

AutoDepthStencilFormat dd D3DFMT_D24S8; Формат используемой поверхности

Flags dd 1; 0 или D3DPRESENTFLAG_LOCKABLE_BACKBUFFER=1

FullScreen_RefreshRateInHz dd 0; Частота обновления экрана в Hz

FullScreen_PresentationInterval dd 1; Интервал показа на экране backbufferа.1 = Ждать обратного хода луча

. DATA?

pd3d dd?; или LPDIRECT3D9 (указатель на Direct3D9)

pd3dDevice dd?; или LPDIRECT3DDEVICE9 (указатель на Direct3DDevice)

. CODE

invoke Direct3DCreate9,D3D_SDK_VERSION

mov pd3d, eax

test eax, eax

jnz @F

push OFFSET szDirect3D9

jmp Error_Message

@@:

push clientwindow. right

pop BackBufferWidth

push clientwindow. bottom

pop BackBufferHeight

d3d9 CreateDevice, pd3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd,\

D3DCREATE_SOFTWARE_VERTEXPROCESSING, \

ADDR BackBufferWidth, ADDR pd3dDevice

test eax, eax; Если возникла ошибка при создании устройства

jz @F

push OFFSET szD3DDevice9

jmp Error_Message

@@:

invoke Init_Scene

invoke Set_Render_Parameters

ret

Init_Direct3D endp

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Init_Scene proc

. DATA

EyeVector D3DVECTOR <-500.0f, 160.0f, 730.0f>; Координаты камеры в пространстве

LookAtVector D3DVECTOR <0.0f,230.0f, 0.0f>; Указывает куда смотрит камера

UpVector D3DVECTOR <0.0f, 1.0f, 0.0f>; Верх камеры. Обычно берется 0.0,1.0,0.0

PosLight D3DCOLORVALUE <-58335.0f,53913.0f,0.0f,0.0f >

FieldOfView dd 0.7853981635f

AspectRatio dd NULL; AspectRatio

NearViewPlanZ dd 50.0f; Передняя отсекающая плоскость

FarViewPlanZ dd 180000.0f; Задняя отсекающая плоскость

. DATA?

m_VS1 D3DXMATRIX <? >

WorldMatrix D3DMATRIX <? >; Мировая матрица

ViewMatrix D3DMATRIX <? >; Матрица вида

ProjectionMatrix D3DMATRIX <? >; Матрица проекции

BackBufferP LPDIRECT3DSURFACE9?

ZStenBackBufferP LPDIRECT3DSURFACE9?

DepthTargP LPDIRECT3DSURFACE9?

. CODE

fild BackBufferWidth; Вычисление Aspect (можно просто сразу поместить 1.33 (3) f)

fild BackBufferHeight

fdiv

fstp AspectRatio

invoke D3DXMatrixRotationY, ADDR WorldMatrix, NULL; World Matrix (мировая матрица)

invoke D3DXMatrixLookAtLH, ADDR ViewMatrix, ADDR EyeVector, \; View Matrix (матрица вида)

ADDR LookAtVector, ADDR UpVector

invoke D3DXMatrixPerspectiveFovLH, ADDR ProjectionMatrix, FieldOfView,\; Matrix Projection (матрица проекции)

AspectRatio, NearViewPlanZ, FarViewPlanZ

; ScreenSpace

. DATA

; Таргет размеры

SSP_XY_640_480 D3DCOLORVALUE <0.0015625f,0.002083f,0.0f,0.0f >; Константы

SSEyeV D3DVECTOR <0.0f, 0.0f, - 1.0f>; Координаты камеры в пространстве

SSLookAtV D3DVECTOR <0.0f,0.0f, 0.0f>; Указывает куда смотрит камера

SSUpV D3DVECTOR <0.0f, 1.0f, 0.0f>; Верх камеры. Обычно берется 0.0,1.0,0.0

SSFieldOfView dd 0.3926990817f; D3DX_PI4; 0.7853981635f

SSAspectRatio dd 1.0f; AspectRatio

SSNearViewPlanZ dd 0.0f; Передняя отсекающая плоскость

SSFarViewPlanZ dd 1.0f

. DATA?

SSViewMatrix D3DMATRIX <? >

SSProjectionMatrix D3DMATRIX <? >

SSViewProjection D3DMATRIX <? >

m_SS D3DMATRIX <? >

. CODE

invoke D3DXMatrixLookAtLH, ADDR SSViewMatrix, ADDR SSEyeV, \; View Matrix (матрица вида)

ADDR SSLookAtV, ADDR SSUpV

invoke D3DXMatrixPerspectiveFovLH, ADDR SSProjectionMatrix, SSFieldOfView,\; Matrix Projection (матрица проекции)

SSAspectRatio, SSNearViewPlanZ, SSFarViewPlanZ

invoke D3DXMatrixMultiply, ADDR m_SS, ADDR SSViewMatrix, ADDR SSProjectionMatrix

invoke D3DXMatrixTranspose, ADDR SSViewProjection, ADDR m_SS

; начальная загрузка

; Таргеты

d3dev9 GetRenderTarget, pd3dDevice, 0, addr BackBufferP

d3dev9 GetDepthStencilSurface,pd3dDevice,addr ZStenBackBufferP

d3dev9 CreateDepthStencilSurface,pd3dDevice, 1024,1024,AutoDepthStencilFormat,D3DMULTISAMPLE_NONE,0,TRUE,ADDR DepthTargP,0

. DATA?

CartoonRen dd?

CartoonRenP dd?

. CODE

d3dev9 CreateTexture, pd3dDevice,1024,1024,1,D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8,D3DPOOL_DEFAULT, addr CartoonRen,0

. DATA

CartoonRenEER db "Create error CartoonRen",0

. CODE

test eax, eax

jz @F

push OFFSET CartoonRenEER

jmp Error_Message

@@:

d3dtex9 GetSurfaceLevel, CartoonRen,0,addr CartoonRenP

. DATA

CartoonRenPEER db "Create error CartoonRenP",0

. CODE

test eax, eax

jz @F

push OFFSET CartoonRenPEER

jmp Error_Message

@@:

. DATA?

NormalRen dd?

NormalRenP dd?

. CODE

d3dev9 CreateTexture, pd3dDevice,1024,1024,1,D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8,D3DPOOL_DEFAULT, addr NormalRen,0

. DATA

NormalRenEER db "Create error NormalRen",0

. CODE

test eax, eax

jz @F

push OFFSET NormalRenEER

jmp Error_Message

@@:

d3dtex9 GetSurfaceLevel, NormalRen,0,addr NormalRenP

. DATA

NormalRenPEER db "Create error NormalRenP",0

. CODE

test eax, eax

jz @F

push OFFSET NormalRenPEER

jmp Error_Message

@@:

. DATA

tefect db "texture\tefect. bmp", 0

. DATA?

tefectP dd?

. CODE

invoke D3DXCreateTextureFromFileA, pd3dDevice, addr tefect, addr tefectP

. DATA

tefectEER db "Create error tefect",0

. CODE

test eax, eax

jz @F

push OFFSET tefectEER

jmp Error_Message

@@:

. DATA

Ekran db "model\Ekran. x", 0

. DATA?

EkranP dd?

. CODE

invoke D3DXLoadMeshFromXA, addr Ekran, D3DXMESH_MANAGED,pd3dDevice, 0, 0, NULL, 0,addr EkranP

. DATA

EkranEER db "Create error Ekran",0

. CODE

test eax, eax

jz @F

push OFFSET EkranEER

jmp Error_Message

@@:

. DATA?

EkranPT dd?

EkranPB dd?

EkranP_VB dd?

EkranP_IB dd?

EkranP_NV dd?

EkranP_NF dd?

. CODE

d3dxmesh GetFVF,EkranP

mov EkranPT,eax

d3dxmesh GetNumBytesPerVertex,EkranP

mov EkranPB,eax

d3dxmesh GetVertexBuffer,EkranP, addr EkranP_VB

d3dxmesh GetIndexBuffer,EkranP, addr EkranP_IB

d3dxmesh GetNumVertices,EkranP

mov EkranP_NV,eax

d3dxmesh GetNumFaces,EkranP

mov EkranP_NF,eax

. DATA

kamen db "model\kamen. x", 0

. DATA?

kamenP dd?

. CODE

invoke D3DXLoadMeshFromXA, addr kamen, D3DXMESH_MANAGED,pd3dDevice, 0, 0, NULL, 0,addr kamenP

. DATA

kamenEER db "Create error kamen",0

. CODE

test eax, eax

jz @F

push OFFSET kamenEER

jmp Error_Message

@@:

. DATA?

kamenPT dd?

kamenPB dd?

kamenP_VB dd?

kamenP_IB dd?

kamenP_NV dd?

kamenP_NF dd?

. CODE

d3dxmesh GetFVF,kamenP

mov kamenPT,eax

d3dxmesh GetNumBytesPerVertex,kamenP

mov kamenPB,eax

d3dxmesh GetVertexBuffer,kamenP, addr kamenP_VB

d3dxmesh GetIndexBuffer,kamenP, addr kamenP_IB

d3dxmesh GetNumVertices,kamenP

mov kamenP_NV,eax

d3dxmesh GetNumFaces,kamenP

mov kamenP_NF,eax

. DATA

nebo db "model\nebo. x", 0

. DATA?

neboP dd?

. CODE

invoke D3DXLoadMeshFromXA, addr nebo, D3DXMESH_MANAGED,pd3dDevice, 0, 0, NULL, 0,addr neboP

. DATA

neboEER db "Create error nebo",0

. CODE

test eax, eax

jz @F

push OFFSET neboEER

jmp Error_Message

@@:

. DATA?

neboPT dd?

neboPB dd?

neboP_VB dd?

neboP_IB dd?

neboP_NV dd?

neboP_NF dd?

. CODE

d3dxmesh GetFVF,neboP

mov neboPT,eax

d3dxmesh GetNumBytesPerVertex,neboP

mov neboPB,eax

d3dxmesh GetVertexBuffer,neboP, addr neboP_VB

d3dxmesh GetIndexBuffer,neboP, addr neboP_IB

d3dxmesh GetNumVertices,neboP

mov neboP_NV,eax

d3dxmesh GetNumFaces,neboP

mov neboP_NF,eax

. DATA

palmi db "model\palmi. x", 0

. DATA?

palmiP dd?

. CODE

invoke D3DXLoadMeshFromXA, addr palmi, D3DXMESH_MANAGED,pd3dDevice, 0, 0, NULL, 0,addr palmiP

. DATA

palmiEER db "Create error palmi",0

. CODE

test eax, eax

jz @F

push OFFSET palmiEER

jmp Error_Message

@@:

. DATA?

palmiPT dd?

palmiPB dd?

palmiP_VB dd?

palmiP_IB dd?

palmiP_NV dd?

palmiP_NF dd?

. CODE

d3dxmesh GetFVF,palmiP

mov palmiPT,eax

d3dxmesh GetNumBytesPerVertex,palmiP

mov palmiPB,eax

d3dxmesh GetVertexBuffer,palmiP, addr palmiP_VB

d3dxmesh GetIndexBuffer,palmiP, addr palmiP_IB

d3dxmesh GetNumVertices,palmiP

mov palmiP_NV,eax

d3dxmesh GetNumFaces,palmiP

mov palmiP_NF,eax

. DATA

woda db "model\woda. x", 0

. DATA?

wodaP dd?

. CODE

invoke D3DXLoadMeshFromXA, addr woda, D3DXMESH_MANAGED,pd3dDevice, 0, 0, NULL, 0,addr wodaP

. DATA

wodaEER db "Create error woda",0

. CODE

test eax, eax

jz @F

push OFFSET wodaEER

jmp Error_Message

@@:

. DATA?

wodaPT dd?

wodaPB dd?

wodaP_VB dd?

wodaP_IB dd?

wodaP_NV dd?

wodaP_NF dd?

. CODE

d3dxmesh GetFVF,wodaP

mov wodaPT,eax

d3dxmesh GetNumBytesPerVertex,wodaP

mov wodaPB,eax

d3dxmesh GetVertexBuffer,wodaP, addr wodaP_VB

d3dxmesh GetIndexBuffer,wodaP, addr wodaP_IB

d3dxmesh GetNumVertices,wodaP

mov wodaP_NV,eax

d3dxmesh GetNumFaces,wodaP

mov wodaP_NF,eax

. DATA

zemla db "model\zemla. x", 0

. DATA?

zemlaP dd?

. CODE

invoke D3DXLoadMeshFromXA, addr zemla, D3DXMESH_MANAGED,pd3dDevice, 0, 0, NULL, 0,addr zemlaP

. DATA

zemlaEER db "Create error zemla",0

. CODE

test eax, eax

jz @F

push OFFSET zemlaEER

jmp Error_Message

@@:

. DATA?

zemlaPT dd?

zemlaPB dd?

zemlaP_VB dd?

zemlaP_IB dd?

zemlaP_NV dd?

zemlaP_NF dd?

. CODE

d3dxmesh GetFVF,zemlaP

mov zemlaPT,eax

d3dxmesh GetNumBytesPerVertex,zemlaP

mov zemlaPB,eax

d3dxmesh GetVertexBuffer,zemlaP, addr zemlaP_VB

d3dxmesh GetIndexBuffer,zemlaP, addr zemlaP_IB

d3dxmesh GetNumVertices,zemlaP

mov zemlaP_NV,eax

d3dxmesh GetNumFaces,zemlaP

mov zemlaP_NF,eax

. DATA

f_vsEkran db "shaders\vsEkran. inc", 0

. DATA?

a_vsEkran LPD3DXBUFFER?

b_vsEkran dd?

c_vsEkran LPDIRECT3DVERTEXSHADER9?

. CODE

invoke D3DXAssembleShaderFromFileA, addr f_vsEkran, 0, 0, D3DXSHADER_DEBUG, addr a_vsEkran,0

. DATA

Z_vsEkranEER db "Create error Z_vsEkran",0

. CODE

test eax, eax

jz @F

push OFFSET Z_vsEkranEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_vsEkran

mov b_vsEkran,eax

d3dev9 CreateVertexShader, pd3dDevice,b_vsEkran,addr c_vsEkran

. DATA

C_vsEkranEER db "Create error C_vsEkran",0

. CODE

test eax, eax

jz @F

push OFFSET C_vsEkranEER

jmp Error_Message

@@:

. DATA

f_vsKamen db "shaders\vsKamen. inc", 0

. DATA?

a_vsKamen LPD3DXBUFFER?

b_vsKamen dd?

c_vsKamen LPDIRECT3DVERTEXSHADER9?

. CODE

invoke D3DXAssembleShaderFromFileA, addr f_vsKamen, 0, 0, D3DXSHADER_DEBUG, addr a_vsKamen,0

. DATA

Z_vsKamenEER db "Create error Z_vsKamen",0

. CODE

test eax, eax

jz @F

push OFFSET Z_vsKamenEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_vsKamen

mov b_vsKamen,eax

d3dev9 CreateVertexShader, pd3dDevice,b_vsKamen,addr c_vsKamen

. DATA

C_vsKamenEER db "Create error C_vsKamen",0

. CODE

test eax, eax

jz @F

push OFFSET C_vsKamenEER

jmp Error_Message

@@:

. DATA

f_vsNebo db "shaders\vsNebo. inc", 0

. DATA?

a_vsNebo LPD3DXBUFFER?

b_vsNebo dd?

c_vsNebo LPDIRECT3DVERTEXSHADER9?

. CODE

invoke D3DXAssembleShaderFromFileA, addr f_vsNebo, 0, 0, D3DXSHADER_DEBUG, addr a_vsNebo,0

. DATA

Z_vsNeboEER db "Create error Z_vsNebo",0

. CODE

test eax, eax

jz @F

push OFFSET Z_vsNeboEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_vsNebo

mov b_vsNebo,eax

d3dev9 CreateVertexShader, pd3dDevice,b_vsNebo,addr c_vsNebo

. DATA

C_vsNeboEER db "Create error C_vsNebo",0

. CODE

test eax, eax

jz @F

push OFFSET C_vsNeboEER

jmp Error_Message

@@:

. DATA

f_vsSun db "shaders\vsSun. inc", 0

. DATA?

a_vsSun LPD3DXBUFFER?

b_vsSun dd?

c_vsSun LPDIRECT3DVERTEXSHADER9?

. CODE

invoke D3DXAssembleShaderFromFileA, addr f_vsSun, 0, 0, D3DXSHADER_DEBUG, addr a_vsSun,0

. DATA

Z_vsSunEER db "Create error Z_vsSun",0

. CODE

test eax, eax

jz @F

push OFFSET Z_vsSunEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_vsSun

mov b_vsSun,eax

d3dev9 CreateVertexShader, pd3dDevice,b_vsSun,addr c_vsSun

. DATA

C_vsSunEER db "Create error C_vsSun",0

. CODE

test eax, eax

jz @F

push OFFSET C_vsSunEER

jmp Error_Message

@@:

. DATA

f_vsWater db "shaders\vsWater. inc", 0

. DATA?

a_vsWater LPD3DXBUFFER?

b_vsWater dd?

c_vsWater LPDIRECT3DVERTEXSHADER9?

. CODE

invoke D3DXAssembleShaderFromFileA, addr f_vsWater, 0, 0, D3DXSHADER_DEBUG, addr a_vsWater,0

. DATA

Z_vsWaterEER db "Create error Z_vsWater",0

. CODE

test eax, eax

jz @F

push OFFSET Z_vsWaterEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_vsWater

mov b_vsWater,eax

d3dev9 CreateVertexShader, pd3dDevice,b_vsWater,addr c_vsWater

. DATA

C_vsWaterEER db "Create error C_vsWater",0

. CODE

test eax, eax

jz @F

push OFFSET C_vsWaterEER

jmp Error_Message

@@:

. DATA

f_vsZemla db "shaders\vsZemla. inc", 0

. DATA?

a_vsZemla LPD3DXBUFFER?

b_vsZemla dd?

c_vsZemla LPDIRECT3DVERTEXSHADER9?

. CODE

invoke D3DXAssembleShaderFromFileA, addr f_vsZemla, 0, 0, D3DXSHADER_DEBUG, addr a_vsZemla,0

. DATA

Z_vsZemlaEER db "Create error Z_vsZemla",0

. CODE

test eax, eax

jz @F

push OFFSET Z_vsZemlaEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_vsZemla

mov b_vsZemla,eax

d3dev9 CreateVertexShader, pd3dDevice,b_vsZemla,addr c_vsZemla

. DATA

C_vsZemlaEER db "Create error C_vsZemla",0

. CODE

test eax, eax

jz @F

push OFFSET C_vsZemlaEER

jmp Error_Message

@@:

. DATA

f_psEkran db "shaders\psEkran. inc", 0

. DATA?

a_psEkran LPD3DXBUFFER?

b_psEkran dd?

c_psEkran LPDIRECT3DVERTEXSHADER9?

. CODE

invoke D3DXAssembleShaderFromFileA, addr f_psEkran, 0, 0, D3DXSHADER_DEBUG, addr a_psEkran,0

. DATA

Z_psEkranEER db "Create error Z_psEkran",0

. CODE

test eax, eax

jz @F

push OFFSET Z_psEkranEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_psEkran

mov b_psEkran,eax

d3dev9 CreatePixelShader, pd3dDevice,b_psEkran,addr c_psEkran

. DATA

C_psEkranEER db "Create error C_psEkran",0

. CODE

test eax, eax

jz @F

push OFFSET C_psEkranEER

jmp Error_Message

@@:

. DATA

f_psKamen db "shaders\psKamen. inc", 0

. DATA?

a_psKamen LPD3DXBUFFER?

b_psKamen dd?

c_psKamen LPDIRECT3DVERTEXSHADER9?

. CODE

invoke D3DXAssembleShaderFromFileA, addr f_psKamen, 0, 0, D3DXSHADER_DEBUG, addr a_psKamen,0

. DATA

Z_psKamenEER db "Create error Z_psKamen",0

. CODE

test eax, eax

jz @F

push OFFSET Z_psKamenEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_psKamen

mov b_psKamen,eax

d3dev9 CreatePixelShader, pd3dDevice,b_psKamen,addr c_psKamen

. DATA

C_psKamenEER db "Create error C_psKamen",0

. CODE

test eax, eax

jz @F

push OFFSET C_psKamenEER

jmp Error_Message

@@:

. DATA

f_psNebo db "shaders\psNebo. inc", 0

. DATA?

a_psNebo LPD3DXBUFFER?

b_psNebo dd?

c_psNebo LPDIRECT3DVERTEXSHADER9?

. CODE

invoke D3DXAssembleShaderFromFileA, addr f_psNebo, 0, 0, D3DXSHADER_DEBUG, addr a_psNebo,0

. DATA

Z_psNeboEER db "Create error Z_psNebo",0

. CODE

test eax, eax

jz @F

push OFFSET Z_psNeboEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_psNebo

mov b_psNebo,eax

d3dev9 CreatePixelShader, pd3dDevice,b_psNebo,addr c_psNebo

. DATA

C_psNeboEER db "Create error C_psNebo",0

. CODE

test eax, eax

jz @F

push OFFSET C_psNeboEER

jmp Error_Message

@@:

. DATA

f_psPalma db "shaders\psPalma. inc", 0

. DATA?

a_psPalma LPD3DXBUFFER?

b_psPalma dd?

c_psPalma LPDIRECT3DVERTEXSHADER9?

. CODE

invoke D3DXAssembleShaderFromFileA, addr f_psPalma, 0, 0, D3DXSHADER_DEBUG, addr a_psPalma,0

. DATA

Z_psPalmaEER db "Create error Z_psPalma",0

. CODE

test eax, eax

jz @F

push OFFSET Z_psPalmaEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_psPalma

mov b_psPalma,eax

d3dev9 CreatePixelShader, pd3dDevice,b_psPalma,addr c_psPalma

. DATA

C_psPalmaEER db "Create error C_psPalma",0

. CODE

test eax, eax

jz @F

push OFFSET C_psPalmaEER

jmp Error_Message

@@:

. DATA

f_psSun db "shaders\psSun. inc", 0

. DATA?

a_psSun LPD3DXBUFFER?

b_psSun dd?

c_psSun LPDIRECT3DVERTEXSHADER9?

. CODE

invoke D3DXAssembleShaderFromFileA, addr f_psSun, 0, 0, D3DXSHADER_DEBUG, addr a_psSun,0

. DATA

Z_psSunEER db "Create error Z_psSun",0

. CODE

test eax, eax

jz @F

push OFFSET Z_psSunEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_psSun

mov b_psSun,eax

d3dev9 CreatePixelShader, pd3dDevice,b_psSun,addr c_psSun

. DATA

C_psSunEER db "Create error C_psSun",0

. CODE

test eax, eax

jz @F

push OFFSET C_psSunEER

jmp Error_Message

@@:

. DATA

f_psWater db "shaders\psWater. inc", 0

. DATA?

a_psWater LPD3DXBUFFER?

b_psWater dd?

c_psWater LPDIRECT3DVERTEXSHADER9?

. CODE

invoke D3DXAssembleShaderFromFileA, addr f_psWater, 0, 0, D3DXSHADER_DEBUG, addr a_psWater,0

. DATA

Z_psWaterEER db "Create error Z_psWater",0

. CODE

test eax, eax

jz @F

push OFFSET Z_psWaterEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_psWater

mov b_psWater,eax

d3dev9 CreatePixelShader, pd3dDevice,b_psWater,addr c_psWater

. DATA

C_psWaterEER db "Create error C_psWater",0

. CODE

test eax, eax

jz @F

push OFFSET C_psWaterEER

jmp Error_Message

@@:

. DATA

f_psZemla db "shaders\psZemla. inc", 0

. DATA?

a_psZemla LPD3DXBUFFER?

b_psZemla dd?

c_psZemla LPDIRECT3DVERTEXSHADER9?

. CODE

invoke D3DXAssembleShaderFromFileA, addr f_psZemla, 0, 0, D3DXSHADER_DEBUG, addr a_psZemla,0

. DATA

Z_psZemlaEER db "Create error Z_psZemla",0

. CODE

test eax, eax

jz @F

push OFFSET Z_psZemlaEER

jmp Error_Message

@@:

d3dxbuf GetBufferPointer,a_psZemla

mov b_psZemla,eax

d3dev9 CreatePixelShader, pd3dDevice,b_psZemla,addr c_psZemla

. DATA

C_psZemlaEER db "Create error C_psZemla",0

. CODE

test eax, eax

jz @F

push OFFSET C_psZemlaEER

jmp Error_Message

@@:

ret

Init_Scene endp

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Set_Render_Parameters proc

d3dev9 SetRenderState, pd3dDevice, D3DRS_CULLMODE, D3DCULL_NONE

d3dev9 SetRenderState, pd3dDevice, D3DRS_ZENABLE,D3DZB_TRUE

d3dev9 SetSamplerState, pd3dDevice, 0, D3DSAMP_MIPFILTER,D3DTEXF_ANISOTROPIC

d3dev9 SetSamplerState, pd3dDevice, 0, D3DSAMP_MAGFILTER, 0

d3dev9 SetSamplerState, pd3dDevice, 0, D3DSAMP_MINFILTER, 0

d3dev9 SetSamplerState, pd3dDevice, 1, D3DSAMP_MIPFILTER,D3DTEXF_ANISOTROPIC

d3dev9 SetSamplerState, pd3dDevice, 1, D3DSAMP_MAGFILTER, D3DTEXF_ANISOTROPIC

d3dev9 SetSamplerState, pd3dDevice, 1, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC

ret

Set_Render_Parameters endp

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Render_Scene proc

. DATA

Zvalue dd 1.0f; Значение для очистки Z буфера

Clearcolor dd 0; Цвет для очистки BackBuffer'а

. DATA?

. CODE

d3dev9 TestCooperativeLevel, pd3dDevice; Проверка кооперации

cmp eax, D3DERR_DEVICELOST; Если устройство потеряно то выход

jne noreset;

invoke Destroy_Direct3D

jmp Exit;

noreset:;

cmp eax, D3DERR_DEVICENOTRESET; Если устройство не потеряно и не сброшено то сбрасываем

jne noreset2;

d3dev9 Reset, pd3dDevice, ADDR BackBufferWidth;

invoke Set_Render_Parameters

noreset2:

d3dev9 BeginScene, pd3dDevice

; подготовка данных

d3dev9 SetRenderTarget,pd3dDevice,0,CartoonRenP; установка рендер таргетов

d3dev9 SetRenderTarget,pd3dDevice,1,NormalRenP

d3dev9 SetDepthStencilSurface,pd3dDevice,DepthTargP

d3dev9 Clear, pd3dDevice, 0, NULL, D3DCLEAR_TARGET or D3DCLEAR_ZBUFFER,Clearcolor, Zvalue, 0; Очистка BackBuffer'а и Z-буфера

invoke D3DXMatrixMultiply, ADDR m_VS1, ADDR WorldMatrix, ADDR ViewMatrix

invoke D3DXMatrixMultiply, ADDR m_VS1, ADDR m_VS1, ADDR ProjectionMatrix

invoke D3DXMatrixTranspose, ADDR m_VS1, ADDR m_VS1

d3dev9 SetTexture, pd3dDevice, 0, tefectP

; Отрисовка земли

d3dev9 SetVertexShader,pd3dDevice,c_vsZemla

d3dev9 SetPixelShader,pd3dDevice,c_psZemla

d3dev9 SetVertexShaderConstantF,pd3dDevice,0, addr m_VS1, 4; c0

d3dev9 SetVertexShaderConstantF,pd3dDevice,4, addr PosLight, 1; c4

d3dev9 SetFVF, pd3dDevice, zemlaPT

d3dev9 SetStreamSource, pd3dDevice, 0, zemlaP_VB, 0, zemlaPB

d3dev9 SetIndices, pd3dDevice, zemlaP_IB

d3dev9 DrawIndexedPrimitive, pd3dDevice, D3DPT_TRIANGLELIST,0,0,zemlaP_NV,0,zemlaP_NF

; Отрисовка солнца

d3dev9 SetVertexShader,pd3dDevice,c_vsSun

d3dev9 SetPixelShader,pd3dDevice,c_psSun

d3dev9 SetFVF, pd3dDevice, neboPT

d3dev9 SetStreamSource, pd3dDevice, 0, neboP_VB, 0, neboPB

d3dev9 SetIndices, pd3dDevice, neboP_IB

d3dev9 DrawIndexedPrimitive, pd3dDevice, D3DPT_TRIANGLELIST,0,0,neboP_NV,0,neboP_NF

; Отрисовка камня

d3dev9 SetVertexShader,pd3dDevice,c_vsKamen

d3dev9 SetPixelShader,pd3dDevice,c_psKamen

d3dev9 SetFVF, pd3dDevice, kamenPT

d3dev9 SetStreamSource, pd3dDevice, 0, kamenP_VB, 0, kamenPB

d3dev9 SetIndices, pd3dDevice, kamenP_IB

d3dev9 DrawIndexedPrimitive, pd3dDevice, D3DPT_TRIANGLELIST,0,0,kamenP_NV,0,kamenP_NF

; Отрисовка пальм

d3dev9 SetPixelShader,pd3dDevice,c_psPalma

d3dev9 SetFVF, pd3dDevice, palmiPT

d3dev9 SetStreamSource, pd3dDevice, 0, palmiP_VB, 0, palmiPB

d3dev9 SetIndices, pd3dDevice, palmiP_IB

d3dev9 DrawIndexedPrimitive, pd3dDevice, D3DPT_TRIANGLELIST,0,0,palmiP_NV,0,palmiP_NF

; Отрисовка неба

d3dev9 SetRenderTarget,pd3dDevice,1,0

d3dev9 SetVertexShader,pd3dDevice,c_vsNebo

d3dev9 SetPixelShader,pd3dDevice,c_psNebo

d3dev9 SetFVF, pd3dDevice, neboPT

d3dev9 SetStreamSource, pd3dDevice, 0, neboP_VB, 0, neboPB

d3dev9 SetIndices, pd3dDevice, neboP_IB

d3dev9 DrawIndexedPrimitive, pd3dDevice, D3DPT_TRIANGLELIST,0,0,neboP_NV,0,neboP_NF

; Отрисовка воды

d3dev9 SetRenderTarget,pd3dDevice,1,NormalRenP

d3dev9 SetVertexShader,pd3dDevice,c_vsWater

d3dev9 SetPixelShader,pd3dDevice,c_psWater

d3dev9 SetFVF, pd3dDevice, wodaPT

d3dev9 SetStreamSource, pd3dDevice, 0, wodaP_VB, 0, wodaPB

d3dev9 SetIndices, pd3dDevice, wodaP_IB

d3dev9 DrawIndexedPrimitive, pd3dDevice, D3DPT_TRIANGLELIST,0,0,wodaP_NV,0,wodaP_NF

; смешивание

d3dev9 SetRenderTarget,pd3dDevice,0, BackBufferP

d3dev9 SetRenderTarget,pd3dDevice,1, 0

d3dev9 SetDepthStencilSurface,pd3dDevice,ZStenBackBufferP

d3dev9 Clear, pd3dDevice, 0, NULL, D3DCLEAR_TARGET or D3DCLEAR_ZBUFFER,Clearcolor, Zvalue, 0; Очистка BackBuffer'а и Z-буфера

d3dev9 SetVertexShader,pd3dDevice,c_vsEkran

d3dev9 SetPixelShader,pd3dDevice,c_psEkran

d3dev9 SetTexture, pd3dDevice, 0, CartoonRen

d3dev9 SetTexture, pd3dDevice, 1, NormalRen

d3dev9 SetVertexShaderConstantF,pd3dDevice,3, addr SSViewProjection,4

d3dev9 SetVertexShaderConstantF,pd3dDevice,7, addr SSP_XY_640_480,1

d3dev9 SetFVF, pd3dDevice, EkranPT

d3dev9 SetStreamSource, pd3dDevice, 0, EkranP_VB, 0, EkranPB

d3dev9 SetIndices, pd3dDevice, EkranP_IB

d3dev9 DrawIndexedPrimitive, pd3dDevice, D3DPT_TRIANGLELIST,0,0,EkranP_NV,0,EkranP_NF

d3dev9 EndScene, pd3dDevice

; Анимируем сцену

. DATA

RotZ dd 0.0f

Prib dd 0.002f

LightRot dd 0

LightPrib dd 0.01

kMoveLight dd 100000.0f

. CODE

fld RotZ

fadd Prib

fstp RotZ

fld LightRot

fadd LightPrib

fstp LightRot

fld LightRot

fsin

fmul kMoveLight

fstp PosLight. r

fld LightRot

fcos

fmul kMoveLight

fstp PosLight. g

invoke D3DXMatrixRotationY, ADDR WorldMatrix, RotZ

d3dev9 Present, pd3dDevice, NULL, NULL, NULL, NULL; Вывод BackBuffer'а на экран

ret

Render_Scene endp

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Release_Object proc pointer: DWORD

mov eax, pointer

test eax, eax

jz @F

d3dev9 Release, eax

@@:

ret

Release_Object endp

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Destroy_Direct3D proc; освобождение всех созданных объектов

; Шейдеры

invoke Release_Object, a_psZemla

invoke Release_Object, c_psZemla

invoke Release_Object, a_psWater

invoke Release_Object, c_psWater

invoke Release_Object, a_psSun

invoke Release_Object, c_psSun

invoke Release_Object, a_psPalma

invoke Release_Object, c_psPalma

invoke Release_Object, a_psNebo

invoke Release_Object, c_psNebo

invoke Release_Object, a_psKamen

invoke Release_Object, c_psKamen

invoke Release_Object, a_psEkran

invoke Release_Object, c_psEkran

invoke Release_Object, a_vsZemla

invoke Release_Object, c_vsZemla

invoke Release_Object, a_vsWater

invoke Release_Object, c_vsWater

invoke Release_Object, a_vsSun

invoke Release_Object, c_vsSun

invoke Release_Object, a_vsNebo

invoke Release_Object, c_vsNebo

invoke Release_Object, a_vsKamen

invoke Release_Object, c_vsKamen

invoke Release_Object, a_vsEkran

invoke Release_Object, c_vsEkran

; Модели

invoke Release_Object,zemlaP_IB

invoke Release_Object, zemlaP_VB

invoke Release_Object, zemlaP

invoke Release_Object, wodaP_IB

invoke Release_Object, wodaP_VB

invoke Release_Object, wodaP

invoke Release_Object, palmiP_IB

invoke Release_Object, palmiP_VB

invoke Release_Object, palmiP

invoke Release_Object, neboP_IB

invoke Release_Object, neboP_VB

invoke Release_Object, neboP

invoke Release_Object, kamenP_IB

invoke Release_Object, kamenP_VB

invoke Release_Object, kamenP

invoke Release_Object, EkranP_IB

invoke Release_Object, EkranP_VB

invoke Release_Object, EkranP

; текстуры

invoke Release_Object, tefectP

; Таргеты

invoke Release_Object, NormalRenP

invoke Release_Object, CartoonRenP

invoke Release_Object, DepthTargP

invoke Release_Object, ZStenBackBufferP

invoke Release_Object,BackBufferP

mov eax,pd3dDevice

test eax, eax

jz @F

d3dev9 Release, eax

@@:; Освобождение Direct3DDevice

mov eax,pd3d

test eax, eax

jz @F

d3dev9 Release, eax

@@:; Освобождение Direct3D9

ret

Destroy_Direct3D endp

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

Error_Message:; Вывод сообщения об ошибке и завершение работы приложения

mov eax, DWORD PTR [esp]

invoke MessageBox, hwnd, eax, ADDR szAppName, MB_ICONERROR

pop eax

invoke Destroy_Direct3D

jmp Exit

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

end Start

Пример работы программы

Вывод

В ходе данной курсовой работы были освещены основы 32-битного программирования на языке Assembler для ОС WINDOWS. Были изучены основы построение 3D графики с использованием DirectX, а также были приобретены навыки использования шейдеров.

Для вызова API функций используется функция invoke, которая позволяет намного сократить текст программы и делает программы на языке ассемблера похожими на программы на ЯВУ

Компилятор MASM32, ОС Windows 7 SP 1, используемый пакет библиотек DirectX 9 июнь 2005.

Список литературы

1. Изучение операционной системы WINDOWS: метод. указания для выполнения курсовой работы по курсу "Операционные системы" / сост.е.А. Вахрушева. - Ижевск: ИжГТУ, кафедра "Вычислительная техника", 2013. - 55 с.

2. http://www.wasm.ru

3. http://msdn. microsoft.com

Размещено на Allbest.ru


Подобные документы

  • Использование DirectX для решения задач по выводу и обработке графики в Microsoft Windows. Описание используемых DirectX-функций. Исходный текст отлаженной программы. Техника работы с окнами. Результаты работы программы, составление алгоритма, листинг.

    контрольная работа [226,0 K], добавлен 18.05.2014

  • Основы программирования графических приложений на основе DirectX для операционной системы Windows. Работа с различными интерфейсами. Описание некоторых функций, используемых для работы с Direct3D. Взаимосвязь между приложением, Direct3D и аппаратурой.

    курсовая работа [156,2 K], добавлен 10.02.2015

  • Ознакомление с интерфейсом, основными возможностями и преимуществами использования программы OpenGL - популярной библиотекой для работы с 2D и 3D графикой. Рассмотрение назначения, базовых компонент и правил инициализации программного движка DirectX.

    презентация [19,4 K], добавлен 14.08.2013

  • Характеристика операционной системы. История развития Windows. Сравнительная характеристика версий Windows. Элементы и инструменты Windows XP. Прикладные программы в Windows XP. Работа настольных и портативных компьютеров под управлением Windows.

    доклад [19,1 K], добавлен 16.10.2011

  • Основы работы с графиков средствами OpenGL в C#. Ее спецификации, принципы и возможности. Direct3D как самостоятельная часть библиотеки Microsoft DirectX, которая отвечает за графику и вывод графической информации. Независимость от языка программирования.

    курсовая работа [2,1 M], добавлен 17.02.2013

  • История создания и развития операционной системы Microsoft Windows. Особенности каждой из ее версий. Новшества в интерфейсе, встроенных программах, системе управления и использования ОС, увеличение скорости выполнения приложений возможностями мультимедиа.

    реферат [29,5 K], добавлен 30.11.2013

  • История ОС семейства Windows. Основные принципы администрирования ОС. Создание домашней группы. Присоединение к домашней группе или ее создание. Особенности ОС Windows 7. Анализ уязвимостей Microsoft Windows 7. Особенности версий ОС Windows 7.

    курсовая работа [2,2 M], добавлен 13.12.2010

  • Выход новой мобильной операционной системы — Windows Phone 7. Основные преимущества последующих версий. Встроенный пакет Microsoft Office, являющийся единственным программным обеспечение, доступным на мобильные устройства, совместимый с полной версией.

    презентация [577,4 K], добавлен 10.02.2016

  • Общая характеристика основных и дополнительных возможностей графического стандарта OpenGL в области компьютерной графики. Исследование набора определенных инструментов и технологий DirectX, который используют разработчики игр и мультимедийных приложений.

    реферат [160,8 K], добавлен 10.01.2012

  • Краткое описание версий Windows XP: Professional Edition, Home Edition, Tablet PC Edition, Media Center Edition, Embedded, XP 64-bit Edition, XP Edition N, XP Starter Edition. Установка Windows XP. Характеристика интерфейса и нововведений Windows 7.

    контрольная работа [1,8 M], добавлен 14.03.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.