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