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

 

Оглавление


DirectX

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

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

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

Функция D3DXMatrixPerspectiveFovLH

Функция D3DXMatrixTranspose

Функция D3DXMatrixMultiply

Функция D3DXCreateTextureFromFile

Функция D3DXLoadMeshFromX

Функция D3DXAssembleShaderFromFile

Функция MessageBox

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

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

Вывод

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

DirectX


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

Практически все части DirectX API представляют собой наборы COM <#"justify">·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 более подходящей для написания игровых приложений, коммерческий успех новой ОС весьма сомнителен.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 (например, доступ к клавиатуре/джойстику/мыши, поддержка звука, игры по сети и т.д.).является базой для 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 <#"justify">Шейдеры

Ше?йдер (англ. 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) - представляет собой небольшой, но богатый язык для программируемых шейдеров в развитых рендерах и других приложениях, идеально подходит для описывающих материалов, света, перемещения и получения изображения.- был разработан Sony Pictures Imageworks для использования в своем внутреннем рендере и используется для анимационных фильмов и визуальных эффектов.

OSL используется в пакете для создания трёхмерной компьютерной графики Blender. #"justify">Рендеринг в реальном времени

·Шейдерный язык 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, c0oT0, v3

Пиксельный шейдер

Выполняет обработку цветовых данных, полученных при рисовании треугольника. Оперирует с текстурами и цветом. Количество инструкций значительно ограничено. Так, к примеру, в версии 1.4 оно не может быть больше 32-х. Пример фрагмента кода:.1.4r0, t0r0, 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, STDCALLCASEMAP: none\masm32\Include\windows. inc; Структуры, константы.\masm32\Include\kernel32. inc; Системные функции приложения.\masm32\Include\user32. inc; Интерфейс.\masm32\Include\gdi32. inc; Графический вывод.\masm32\include\winmm. inc; Функция timeGetTime\masm32\Lib\kernel32. lib\masm32\Lib\user32. lib\masm32\Lib\gdi32. lib\masm32\lib\winmm. lib\masm32\Dxsdk90\Include\2005_jun\d3d9_all. inc\masm32\Dxsdk90\Lib\2005_jun\d3d9. lib\masm32\Dxsdk90\Lib\2005_jun\d3dx9. lib; Подключение D3DX функций (динамическая библиотека)

; ПРОТОТИПЫ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::_Direct3D PROTO; Текст этих функций можно найти ниже

Destroy_Direct3D PROTO_Object PROTO: DWORD_Render_Parameters PROTO_Scene PROTO_Scene PROTO

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

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

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

. DATA;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::db "MyClass", 0db "DX9_Ku"," ",169,"Nikita", 0

; WNDCLASSEX - -------------------------------------------dd 12*4dd CS_HREDRAW+CS_VREDRAW+20hdd OFFSET WndProcdd 0dd 0dd 400000hdd 0dd 0dd BLACK_PENdd 0dd OFFSET szClassName

hIconSm dd 0

; Сообщения об ошибках - ---------------------------------D9 db "Не удалось создать обьект Direct3D9",9,9,0DDevice9 db "Не удалось создать устройство Direct3D9",9,0

. DATA?;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::MSG <>HWND?RECT <>

. CONST;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::_X EQU 640; Размер окна по горизонтали_Y EQU 480; Размер окна по вертикали

. CODE;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::GetModuleHandle, NULLhInstance, eaxLoadCursor, NULL, IDC_ARROWhCursor, eaxRegisterClassEx, ADDR cbSizeGetSystemMetrics, SM_CXSCREENeaxGetSystemMetrics, SM_CYSCREENeax, WIN_Yeax, 1

pop ebxebx, WIN_X

shr ebx, 1CreateWindowEx, NULL, ADDR szClassName, ADDR szAppName,\_SYSMENU or WS_VISIBLE, \, eax, WIN_X, WIN_Y, NULL, NULL, hInstance, NULLhwnd, eaxGetClientRect, eax, ADDR clientwindow

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

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

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

;

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

jmp msg_loop;

;:;eax, DWORD PTR msg. message;

cmp eax, WM_QUIT;end_loop;

;TranslateMessage, ADDR msg;DispatchMessage, ADDR msg;

jmp msg_loop_loop:

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

; то код выхода из программы передается в поле wParam:; сообщения MSG.

invoke ExitProcess, eax

ret

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

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

; =====================================================uMsg, WM_CREATE; Это сообщение посылается окну, когда оно создаетсяwmCreateuMsg, WM_DESTROY; Это сообщение посылается окну, когда оно должно быть уничтожено.wmDestroyuMsg, WM_KEYDOWN; Это сообщение посылается окну, когда нажали клавишу на клавиатуре.wmKeydownDefWindowProc, hWnd, uMsg, wParam, lParam; Если Мы НЕ ХОТИМ обрабатывать полученное сообщение, то; нам надо вызвать DefWindowProc с параметрами, которые Мы получили.

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

wmDestroy:; - -----------------------------------------Destroy_Direct3DPostQuitMessage, NULLeax,eax:; - -----------------------------------------eax, eax:; - -----------------------------------------eax, wParameax, VK_ESCAPEnoExitSendMessage, hwnd, WM_CLOSE, NULL, NULL:eax, eaxendp

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

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

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

. DATA

; D3DPRESENT_PARAMETERS - -----------------------------------------dd 640; Ширина BackBufferdd 480; Высота BackBufferdd D3DFMT_X8R8G8B8; Формат используемой поверхностиdd 3; число Back буферов.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 - ничего не будет созданоdd D3DFMT_D24S8; Формат используемой поверхности

Flags dd 1; 0 или D3DPRESENTFLAG_LOCKABLE_BACKBUFFER=1

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

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

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

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

. CODEDirect3DCreate9,D3D_SDK_VERSIONpd3d, eaxeax, eax@FOFFSET szDirect3D9Error_Message

@@:clientwindow. rightBackBufferWidthclientwindow. bottomBackBufferHeightd9 CreateDevice, pd3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd,\DCREATE_SOFTWARE_VERTEXPROCESSING, \BackBufferWidth, ADDR pd3dDeviceeax, eax; Если возникла ошибка при создании устройства

jz @FOFFSET szD3DDevice9Error_Message

@@:Init_SceneSet_Render_Parameters_Direct3D endp

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::_Scene proc

. DATAD3DVECTOR <-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.0D3DCOLORVALUE <-58335.0f,53913.0f,0.0f,0.0f >dd 0.7853981635fdd NULL; AspectRatiodd 50.0f; Передняя отсекающая плоскостьdd 180000.0f; Задняя отсекающая плоскость

. DATA?_VS1 D3DXMATRIX <? >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 >; КонстантыD3DVECTOR <0.0f, 0.0f, - 1.0f>; Координаты камеры в пространствеD3DVECTOR <0.0f,0.0f, 0.0f>; Указывает куда смотрит камера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 <? >D3DMATRIX <? >D3DMATRIX <? >_SS D3DMATRIX <? >

. CODED3DXMatrixLookAtLH, ADDR SSViewMatrix, ADDR SSEyeV, \; View Matrix (матрица вида)SSLookAtV, ADDR SSUpVD3DXMatrixPerspectiveFovLH, ADDR SSProjectionMatrix, SSFieldOfView,\; Matrix Projection (матрица проекции), SSNearViewPlanZ, SSFarViewPlanZD3DXMatrixMultiply, ADDR m_SS, ADDR SSViewMatrix, ADDR SSProjectionMatrix

invoke D3DXMatrixTranspose, ADDR SSViewProjection, ADDR m_SS

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

; Таргетыdev9 GetRenderTarget, pd3dDevice, 0, addr BackBufferPdev9 GetDepthStencilSurface,pd3dDevice,addr ZStenBackBufferPdev9 CreateDepthStencilSurface,pd3dDevice, 1024,1024,AutoDepthStencilFormat,D3DMULTISAMPLE_NONE,0,TRUE,ADDR DepthTargP,0

. DATA?dd?dd?

. CODEdev9 CreateTexture, pd3dDevice,1024,1024,1,D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8,D3DPOOL_DEFAULT, addr CartoonRen,0

. DATAdb "Create error CartoonRen",0

. CODEeax, eax@FOFFSET CartoonRenEERError_Message

@@:dtex9 GetSurfaceLevel, CartoonRen,0,addr CartoonRenP

. DATAdb "Create error CartoonRenP",0

. CODEeax, eax@FOFFSET CartoonRenPEERError_Message

@@:

. DATA?dd?dd?

. CODEdev9 CreateTexture, pd3dDevice,1024,1024,1,D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8,D3DPOOL_DEFAULT, addr NormalRen,0

. DATAdb "Create error NormalRen",0

. CODEeax, eax@FOFFSET NormalRenEERError_Message

@@:dtex9 GetSurfaceLevel, NormalRen,0,addr NormalRenP

. DATAdb "Create error NormalRenP",0

. CODEeax, eax@FOFFSET NormalRenPEERError_Message

@@:

. DATAdb "texture\tefect. bmp", 0

. DATA?dd?

. CODED3DXCreateTextureFromFileA, pd3dDevice, addr tefect, addr tefectP

. DATAdb "Create error tefect",0

. CODEeax, eax@FOFFSET tefectEER

jmp Error_Message

@@:

. DATAdb "model\Ekran. x", 0

. DATA?dd?

. CODED3DXLoadMeshFromXA, addr Ekran, D3DXMESH_MANAGED,pd3dDevice, 0, 0, NULL, 0,addr EkranP

. DATAdb "Create error Ekran",0

. CODEeax, eax

jz @FOFFSET EkranEERError_Message

@@:

. DATA?dd?dd?_VB dd?_IB dd?_NV dd?_NF dd?

. CODEdxmesh GetFVF,EkranPEkranPT,eaxdxmesh GetNumBytesPerVertex,EkranPEkranPB,eaxdxmesh GetVertexBuffer,EkranP, addr EkranP_VBdxmesh GetIndexBuffer,EkranP, addr EkranP_IBdxmesh GetNumVertices,EkranPEkranP_NV,eaxdxmesh GetNumFaces,EkranPEkranP_NF,eax

. DATAdb "model\kamen. x", 0

. DATA?dd?

. CODED3DXLoadMeshFromXA, addr kamen, D3DXMESH_MANAGED,pd3dDevice, 0, 0, NULL, 0,addr kamenP

. DATAdb "Create error kamen",0

. CODEeax, eax@FOFFSET kamenEERError_Message

@@:

. DATA?dd?dd?_VB dd?_IB dd?_NV dd?_NF dd?

. CODEdxmesh GetFVF,kamenPkamenPT,eaxdxmesh GetNumBytesPerVertex,kamenPkamenPB,eaxdxmesh GetVertexBuffer,kamenP, addr kamenP_VBdxmesh GetIndexBuffer,kamenP, addr kamenP_IBdxmesh GetNumVertices,kamenPkamenP_NV,eaxdxmesh GetNumFaces,kamenP

mov kamenP_NF,eax

. DATAdb "model\nebo. x", 0

. DATA?dd?

. CODED3DXLoadMeshFromXA, addr nebo, D3DXMESH_MANAGED,pd3dDevice, 0, 0, NULL, 0,addr neboP

. DATAdb "Create error nebo",0

. CODEeax, eax@FOFFSET neboEERError_Message

@@:

. DATA?dd?dd?_VB dd?_IB dd?_NV dd?_NF dd?

. CODEdxmesh GetFVF,neboPneboPT,eaxdxmesh GetNumBytesPerVertex,neboPneboPB,eaxdxmesh GetVertexBuffer,neboP, addr neboP_VBdxmesh GetIndexBuffer,neboP, addr neboP_IBdxmesh GetNumVertices,neboPneboP_NV,eaxdxmesh GetNumFaces,neboPneboP_NF,eax

. DATAdb "model\palmi. x", 0

. DATA?dd?

. CODED3DXLoadMeshFromXA, addr palmi, D3DXMESH_MANAGED,pd3dDevice, 0, 0, NULL, 0,addr palmiP

. DATAdb "Create error palmi",0

. CODEeax, eax@FOFFSET palmiEERError_Message

@@:

. DATA?dd?dd?_VB dd?_IB dd?_NV dd?_NF dd?

. CODEdxmesh GetFVF,palmiPpalmiPT,eaxdxmesh GetNumBytesPerVertex,palmiPpalmiPB,eaxdxmesh GetVertexBuffer,palmiP, addr palmiP_VB

d3dxmesh GetIndexBuffer,palmiP, addr palmiP_IBdxmesh GetNumVertices,palmiPpalmiP_NV,eaxdxmesh GetNumFaces,palmiPpalmiP_NF,eax

. DATAdb "model\woda. x", 0

. DATA?dd?

. CODED3DXLoadMeshFromXA, addr woda, D3DXMESH_MANAGED,pd3dDevice, 0, 0, NULL, 0,addr wodaP

. DATAdb "Create error woda",0

. CODEeax, eax@FOFFSET wodaEERError_Message

@@:

. DATA?dd?dd?_VB dd?_IB dd?_NV dd?_NF dd?

. CODEdxmesh GetFVF,wodaPwodaPT,eaxdxmesh GetNumBytesPerVertex,wodaPwodaPB,eaxdxmesh GetVertexBuffer,wodaP, addr wodaP_VBdxmesh GetIndexBuffer,wodaP, addr wodaP_IBdxmesh GetNumVertices,wodaPwodaP_NV,eaxdxmesh GetNumFaces,wodaPwodaP_NF,eax

. DATAdb "model\zemla. x", 0

. DATA?dd?

. CODED3DXLoadMeshFromXA, addr zemla, D3DXMESH_MANAGED,pd3dDevice, 0, 0, NULL, 0,addr zemlaP

. DATAdb "Create error zemla",0

. CODEeax, eax@FOFFSET zemlaEERError_Message

@@:

. DATA?dd?dd?_VB dd?_IB dd?_NV dd?_NF dd?

. CODEdxmesh GetFVF,zemlaPzemlaPT,eaxdxmesh GetNumBytesPerVertex,zemlaPzemlaPB,eaxdxmesh GetVertexBuffer,zemlaP, addr zemlaP_VBdxmesh GetIndexBuffer,zemlaP, addr zemlaP_IBdxmesh GetNumVertices,zemlaPzemlaP_NV,eaxdxmesh GetNumFaces,zemlaPzemlaP_NF,eax

. DATA_vsEkran db "shaders\vsEkran. inc", 0

. DATA?_vsEkran LPD3DXBUFFER?_vsEkran dd?_vsEkran LPDIRECT3DVERTEXSHADER9?

. CODED3DXAssembleShaderFromFileA, addr f_vsEkran, 0, 0, D3DXSHADER_DEBUG, addr a_vsEkran,0

. DATA_vsEkranEER db "Create error Z_vsEkran",0

. CODEeax, eax

jz @FOFFSET Z_vsEkranEERError_Message

@@:dxbuf GetBufferPointer,a_vsEkranb_vsEkran,eaxdev9 CreateVertexShader, pd3dDevice,b_vsEkran,addr c_vsEkran

. DATA_vsEkranEER db "Create error C_vsEkran",0

. CODEeax, eax

jz @FOFFSET C_vsEkranEERError_Message

@@:

. DATA_vsKamen db "shaders\vsKamen. inc", 0

. DATA?_vsKamen LPD3DXBUFFER?_vsKamen dd?_vsKamen LPDIRECT3DVERTEXSHADER9?

. CODED3DXAssembleShaderFromFileA, addr f_vsKamen, 0, 0, D3DXSHADER_DEBUG, addr a_vsKamen,0

. DATA_vsKamenEER db "Create error Z_vsKamen",0

. CODEeax, eax

jz @FOFFSET Z_vsKamenEER

jmp Error_Message

@@:dxbuf GetBufferPointer,a_vsKamenb_vsKamen,eaxdev9 CreateVertexShader, pd3dDevice,b_vsKamen,addr c_vsKamen

. DATA_vsKamenEER db "Create error C_vsKamen",0

. CODEeax, eax@FOFFSET C_vsKamenEERError_Message

@@:

. DATA_vsNebo db "shaders\vsNebo. inc", 0

. DATA?_vsNebo LPD3DXBUFFER?_vsNebo dd?_vsNebo LPDIRECT3DVERTEXSHADER9?

. CODED3DXAssembleShaderFromFileA, addr f_vsNebo, 0, 0, D3DXSHADER_DEBUG, addr a_vsNebo,0

. DATA_vsNeboEER db "Create error Z_vsNebo",0

. CODEeax, eax@FOFFSET Z_vsNeboEERError_Message

@@:dxbuf GetBufferPointer,a_vsNebob_vsNebo,eaxdev9 CreateVertexShader, pd3dDevice,b_vsNebo,addr c_vsNebo

. DATA_vsNeboEER db "Create error C_vsNebo",0

. CODEeax, eax

jz @FOFFSET C_vsNeboEER

jmp Error_Message

@@:

. DATA_vsSun db "shaders\vsSun. inc", 0

. DATA?_vsSun LPD3DXBUFFER?_vsSun dd?_vsSun LPDIRECT3DVERTEXSHADER9?

. CODED3DXAssembleShaderFromFileA, addr f_vsSun, 0, 0, D3DXSHADER_DEBUG, addr a_vsSun,0

. DATA_vsSunEER db "Create error Z_vsSun",0

. CODEeax, eax@FOFFSET Z_vsSunEERError_Message

@@:dxbuf GetBufferPointer,a_vsSunb_vsSun,eaxdev9 CreateVertexShader, pd3dDevice,b_vsSun,addr c_vsSun

. DATA_vsSunEER db "Create error C_vsSun",0

. CODEeax, eax@FOFFSET C_vsSunEERError_Message

@@:

. DATA_vsWater db "shaders\vsWater. inc", 0

. DATA?_vsWater LPD3DXBUFFER?_vsWater dd?_vsWater LPDIRECT3DVERTEXSHADER9?

. CODED3DXAssembleShaderFromFileA, addr f_vsWater, 0, 0, D3DXSHADER_DEBUG, addr a_vsWater,0

. DATA_vsWaterEER db "Create error Z_vsWater",0

. CODEeax, eax@FOFFSET Z_vsWaterEERError_Message

@@:dxbuf GetBufferPointer,a_vsWaterb_vsWater,eaxdev9 CreateVertexShader, pd3dDevice,b_vsWater,addr c_vsWater

. DATA_vsWaterEER db "Create error C_vsWater",0

. CODEeax, eax@FOFFSET C_vsWaterEERError_Message

@@:

. DATA_vsZemla db "shaders\vsZemla. inc", 0

. DATA?_vsZemla LPD3DXBUFFER?_vsZemla dd?_vsZemla LPDIRECT3DVERTEXSHADER9?

. CODED3DXAssembleShaderFromFileA, addr f_vsZemla, 0, 0, D3DXSHADER_DEBUG, addr a_vsZemla,0

. DATA_vsZemlaEER db "Create error Z_vsZemla",0

. CODEeax, eax@FOFFSET Z_vsZemlaEERError_Message

@@:dxbuf GetBufferPointer,a_vsZemlab_vsZemla,eaxdev9 CreateVertexShader, pd3dDevice,b_vsZemla,addr c_vsZemla

. DATA_vsZemlaEER db "Create error C_vsZemla",0

. CODEeax, eax@FOFFSET C_vsZemlaEER

jmp Error_Message

@@:

. DATA_psEkran db "shaders\psEkran. inc", 0

. DATA?_psEkran LPD3DXBUFFER?_psEkran dd?_psEkran LPDIRECT3DVERTEXSHADER9?

. CODED3DXAssembleShaderFromFileA, addr f_psEkran, 0, 0, D3DXSHADER_DEBUG, addr a_psEkran,0

. DATA_psEkranEER db "Create error Z_psEkran",0

. CODEeax, eax

jz @FOFFSET Z_psEkranEERError_Message

@@:dxbuf GetBufferPointer,a_psEkranb_psEkran,eaxdev9 CreatePixelShader, pd3dDevice,b_psEkran,addr c_psEkran

. DATA_psEkranEER db "Create error C_psEkran",0

. CODEeax, eax

jz @FOFFSET C_psEkranEERError_Message

@@:

. DATA_psKamen db "shaders\psKamen. inc", 0

. DATA?_psKamen LPD3DXBUFFER?_psKamen dd?_psKamen LPDIRECT3DVERTEXSHADER9?

. CODED3DXAssembleShaderFromFileA, addr f_psKamen, 0, 0, D3DXSHADER_DEBUG, addr a_psKamen,0

. DATA_psKamenEER db "Create error Z_psKamen",0

. CODEeax, eax

jz @FOFFSET Z_psKamenEER

jmp Error_Message

@@:dxbuf GetBufferPointer,a_psKamenb_psKamen,eaxdev9 CreatePixelShader, pd3dDevice,b_psKamen,addr c_psKamen

. DATA_psKamenEER db "Create error C_psKamen",0

. CODEeax, eax

jz @FOFFSET C_psKamenEER

jmp Error_Message

@@:

. DATA_psNebo db "shaders\psNebo. inc", 0

. DATA?_psNebo LPD3DXBUFFER?_psNebo dd?_psNebo LPDIRECT3DVERTEXSHADER9?

. CODED3DXAssembleShaderFromFileA, addr f_psNebo, 0, 0, D3DXSHADER_DEBUG, addr a_psNebo,0

. DATA_psNeboEER db "Create error Z_psNebo",0

. CODEeax, eax@FOFFSET Z_psNeboEERError_Message

@@:dxbuf GetBufferPointer,a_psNebob_psNebo,eaxdev9 CreatePixelShader, pd3dDevice,b_psNebo,addr c_psNebo

. DATA_psNeboEER db "Create error C_psNebo",0

. CODEeax, eax@FOFFSET C_psNeboEERError_Message

@@:

. DATA_psPalma db "shaders\psPalma. inc", 0

. DATA?_psPalma LPD3DXBUFFER?_psPalma dd?_psPalma LPDIRECT3DVERTEXSHADER9?

. CODED3DXAssembleShaderFromFileA, addr f_psPalma, 0, 0, D3DXSHADER_DEBUG, addr a_psPalma,0

. DATA_psPalmaEER db "Create error Z_psPalma",0

. CODEeax, eax@FOFFSET Z_psPalmaEERError_Message

@@:dxbuf GetBufferPointer,a_psPalmab_psPalma,eaxdev9 CreatePixelShader, pd3dDevice,b_psPalma,addr c_psPalma

. DATA_psPalmaEER db "Create error C_psPalma",0

. CODEeax, eax@FOFFSET C_psPalmaEERError_Message

@@:

. DATA_psSun db "shaders\psSun. inc", 0

. DATA?_psSun LPD3DXBUFFER?_psSun dd?_psSun LPDIRECT3DVERTEXSHADER9?

. CODED3DXAssembleShaderFromFileA, addr f_psSun, 0, 0, D3DXSHADER_DEBUG, addr a_psSun,0

. DATA_psSunEER db "Create error Z_psSun",0

. CODEeax, eax@FOFFSET Z_psSunEERError_Message

@@:dxbuf GetBufferPointer,a_psSunb_psSun,eaxdev9 CreatePixelShader, pd3dDevice,b_psSun,addr c_psSun

. DATA_psSunEER db "Create error C_psSun",0

. CODEeax, eax@FOFFSET C_psSunEERError_Message

@@:

. DATA_psWater db "shaders\psWater. inc", 0

. DATA?_psWater LPD3DXBUFFER?_psWater dd?_psWater LPDIRECT3DVERTEXSHADER9?

. CODED3DXAssembleShaderFromFileA, addr f_psWater, 0, 0, D3DXSHADER_DEBUG, addr a_psWater,0

. DATA_psWaterEER db "Create error Z_psWater",0

. CODEeax, eax@FOFFSET Z_psWaterEERError_Message

@@:dxbuf GetBufferPointer,a_psWaterb_psWater,eaxdev9 CreatePixelShader, pd3dDevice,b_psWater,addr c_psWater

. DATA_psWaterEER db "Create error C_psWater",0

. CODEeax, eax@FOFFSET C_psWaterEERError_Message

@@:

. DATA_psZemla db "shaders\psZemla. inc", 0

. DATA?_psZemla LPD3DXBUFFER?_psZemla dd?_psZemla LPDIRECT3DVERTEXSHADER9?

. CODED3DXAssembleShaderFromFileA, addr f_psZemla, 0, 0, D3DXSHADER_DEBUG, addr a_psZemla,0

. DATA_psZemlaEER db "Create error Z_psZemla",0

. CODEeax, eax@FOFFSET Z_psZemlaEERError_Message

@@:dxbuf GetBufferPointer,a_psZemlab_psZemla,eaxdev9 CreatePixelShader, pd3dDevice,b_psZemla,addr c_psZemla

. DATA_psZemlaEER db "Create error C_psZemla",0

. CODEeax, eax@FOFFSET C_psZemlaEER

jmp Error_Message

@@:_Scene endp

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::_Render_Parameters procdev9 SetRenderState, pd3dDevice, D3DRS_CULLMODE, D3DCULL_NONEdev9 SetRenderState, pd3dDevice, D3DRS_ZENABLE,D3DZB_TRUEdev9 SetSamplerState, pd3dDevice, 0, D3DSAMP_MIPFILTER,D3DTEXF_ANISOTROPIC

d3dev9 SetSamplerState, pd3dDevice, 0, D3DSAMP_MAGFILTER, 0dev9 SetSamplerState, pd3dDevice, 0, D3DSAMP_MINFILTER, 0dev9 SetSamplerState, pd3dDevice, 1, D3DSAMP_MIPFILTER,D3DTEXF_ANISOTROPICdev9 SetSamplerState, pd3dDevice, 1, D3DSAMP_MAGFILTER, D3DTEXF_ANISOTROPICdev9 SetSamplerState, pd3dDevice, 1, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC_Render_Parameters endp

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::_Scene proc

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

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

. DATA?

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

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

jne noreset;Destroy_Direct3DExit;

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

jne noreset2;dev9 Reset, pd3dDevice, ADDR BackBufferWidth;

invoke Set_Render_Parameters:dev9 BeginScene, pd3dDevice

; подготовка данныхdev9 SetRenderTarget,pd3dDevice,0,CartoonRenP; установка рендер таргетов

d3dev9 SetRenderTarget,pd3dDevice,1,NormalRenPdev9 SetDepthStencilSurface,pd3dDevice,DepthTargPdev9 Clear, pd3dDevice, 0, NULL, D3DCLEAR_TARGET or D3DCLEAR_ZBUFFER,Clearcolor, Zvalue, 0; Очистка BackBuffer'а и Z-буфераD3DXMatrixMultiply, ADDR m_VS1, ADDR WorldMatrix, ADDR ViewMatrixD3DXMatrixMultiply, ADDR m_VS1, ADDR m_VS1, ADDR ProjectionMatrixD3DXMatrixTranspose, ADDR m_VS1, ADDR m_VS1dev9 SetTexture, pd3dDevice, 0, tefectP

; Отрисовка землиdev9 SetVertexShader,pd3dDevice,c_vsZemladev9 SetPixelShader,pd3dDevice,c_psZemladev9 SetVertexShaderConstantF,pd3dDevice,0, addr m_VS1, 4; c0dev9 SetVertexShaderConstantF,pd3dDevice,4, addr PosLight, 1; c4dev9 SetFVF, pd3dDevice, zemlaPTdev9 SetStreamSource, pd3dDevice, 0, zemlaP_VB, 0, zemlaPBdev9 SetIndices, pd3dDevice, zemlaP_IBdev9 DrawIndexedPrimitive, pd3dDevice, D3DPT_TRIANGLELIST,0,0,zemlaP_NV,0,zemlaP_NF

; Отрисовка солнцаdev9 SetVertexShader,pd3dDevice,c_vsSundev9 SetPixelShader,pd3dDevice,c_psSundev9 SetFVF, pd3dDevice, neboPTdev9 SetStreamSource, pd3dDevice, 0, neboP_VB, 0, neboPBdev9 SetIndices, pd3dDevice, neboP_IBdev9 DrawIndexedPrimitive, pd3dDevice, D3DPT_TRIANGLELIST,0,0,neboP_NV,0,neboP_NF

; Отрисовка камняdev9 SetVertexShader,pd3dDevice,c_vsKamendev9 SetPixelShader,pd3dDevice,c_psKamendev9 SetFVF, pd3dDevice, kamenPTdev9 SetStreamSource, pd3dDevice, 0, kamenP_VB, 0, kamenPBdev9 SetIndices, pd3dDevice, kamenP_IBdev9 DrawIndexedPrimitive, pd3dDevice, D3DPT_TRIANGLELIST,0,0,kamenP_NV,0,kamenP_NF

; Отрисовка пальмdev9 SetPixelShader,pd3dDevice,c_psPalmadev9 SetFVF, pd3dDevice, palmiPTdev9 SetStreamSource, pd3dDevice, 0, palmiP_VB, 0, palmiPBdev9 SetIndices, pd3dDevice, palmiP_IBdev9 DrawIndexedPrimitive, pd3dDevice, D3DPT_TRIANGLELIST,0,0,palmiP_NV,0,palmiP_NF

; Отрисовка небаdev9 SetRenderTarget,pd3dDevice,1,0dev9 SetVertexShader,pd3dDevice,c_vsNebodev9 SetPixelShader,pd3dDevice,c_psNebodev9 SetFVF, pd3dDevice, neboPTdev9 SetStreamSource, pd3dDevice, 0, neboP_VB, 0, neboPBdev9 SetIndices, pd3dDevice, neboP_IBdev9 DrawIndexedPrimitive, pd3dDevice, D3DPT_TRIANGLELIST,0,0,neboP_NV,0,neboP_NF

; Отрисовка водыdev9 SetRenderTarget,pd3dDevice,1,NormalRenPdev9 SetVertexShader,pd3dDevice,c_vsWaterdev9 SetPixelShader,pd3dDevice,c_psWaterdev9 SetFVF, pd3dDevice, wodaPTdev9 SetStreamSource, pd3dDevice, 0, wodaP_VB, 0, wodaPBdev9 SetIndices, pd3dDevice, wodaP_IBdev9 DrawIndexedPrimitive, pd3dDevice, D3DPT_TRIANGLELIST,0,0,wodaP_NV,0,wodaP_NF

; смешиваниеdev9 SetRenderTarget,pd3dDevice,0, BackBufferPdev9 SetRenderTarget,pd3dDevice,1, 0dev9 SetDepthStencilSurface,pd3dDevice,ZStenBackBufferPdev9 Clear, pd3dDevice, 0, NULL, D3DCLEAR_TARGET or D3DCLEAR_ZBUFFER,Clearcolor, Zvalue, 0; Очистка BackBuffer'а и Z-буфераdev9 SetVertexShader,pd3dDevice,c_vsEkrandev9 SetPixelShader,pd3dDevice,c_psEkran

d3dev9 SetTexture, pd3dDevice, 0, CartoonRendev9 SetTexture, pd3dDevice, 1, NormalRendev9 SetVertexShaderConstantF,pd3dDevice,3, addr SSViewProjection,4dev9 SetVertexShaderConstantF,pd3dDevice,7, addr SSP_XY_640_480,1dev9 SetFVF, pd3dDevice, EkranPTdev9 SetStreamSource, pd3dDevice, 0, EkranP_VB, 0, EkranPBdev9 SetIndices, pd3dDevice, EkranP_IBdev9 DrawIndexedPrimitive, pd3dDevice, D3DPT_TRIANGLELIST,0,0,EkranP_NV,0,EkranP_NFdev9 EndScene, pd3dDevice

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

. DATAdd 0.0fdd 0.002fdd 0dd 0.01dd 100000.0f

. CODERotZPribRotZLightRotLightPribLightRotLightRotkMoveLightPosLight. rLightRotkMoveLightPosLight. gD3DXMatrixRotationY, ADDR WorldMatrix, RotZdev9 Present, pd3dDevice, NULL, NULL, NULL, NULL; Вывод BackBuffer'а на экран_Scene endp

;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::_Object proc pointer: DWORDeax, pointereax, eax@Fdev9 Release, eax

@@:_Object endp

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

; ШейдерыRelease_Object, a_psZemlaRelease_Object, c_psZemlaRelease_Object, a_psWaterRelease_Object, c_psWaterRelease_Object, a_psSunRelease_Object, c_psSunRelease_Object, a_psPalmaRelease_Object, c_psPalmaRelease_Object, a_psNeboRelease_Object, c_psNeboRelease_Object, a_psKamenRelease_Object, c_psKamenRelease_Object, a_psEkranRelease_Object, c_psEkranRelease_Object, a_vsZemlaRelease_Object, c_vsZemlaRelease_Object, a_vsWaterRelease_Object, c_vsWaterRelease_Object, a_vsSunRelease_Object, c_vsSunRelease_Object, a_vsNeboRelease_Object, c_vsNeboRelease_Object, a_vsKamenRelease_Object, c_vsKamenRelease_Object, a_vsEkranRelease_Object, c_vsEkran

; МоделиRelease_Object,zemlaP_IBRelease_Object, zemlaP_VBRelease_Object, zemlaPRelease_Object, wodaP_IBRelease_Object, wodaP_VBRelease_Object, wodaPRelease_Object, palmiP_IBRelease_Object, palmiP_VBRelease_Object, palmiPRelease_Object, neboP_IBRelease_Object, neboP_VBRelease_Object, neboPRelease_Object, kamenP_IBRelease_Object, kamenP_VBRelease_Object, kamenPRelease_Object, EkranP_IBRelease_Object, EkranP_VBRelease_Object, EkranP

; текстурыRelease_Object, tefectP

; ТаргетыRelease_Object, NormalRenPRelease_Object, CartoonRenPRelease_Object, DepthTargPRelease_Object, ZStenBackBufferPRelease_Object,BackBufferPeax,pd3dDeviceeax, eax@Fdev9 Release, eax

@@:; Освобождение Direct3DDeviceeax,pd3deax, eax@Fdev9 Release, eax

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

ret_Direct3D endp

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

mov eax, DWORD PTR [esp]

invoke MessageBox, hwnd, eax, ADDR szAppName, MB_ICONERROReaxDestroy_Direct3DExit

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::Start


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




Вывод


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

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

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

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


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

2.#"justify">3.http://msdn. microsoft.com


Оглавление DirectX Ключевые особенности версий DirectX Шейдерные языки Описание использующихся функций Функция D3DXMatrixPerspectiveFovLH

Больше работ по теме:

IP-адресация
Курсовая работа (т)
Microsoft Office 365 и его особенности
Курсовая работа (т)
Microsoft Publisher: основные характеристики и возможности
Курсовая работа (т)
Microsoft Visual Studio
Курсовая работа (т)
Online-тестирование
Курсовая работа (т)

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2019 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ