DirectX. Использование возможностей ОС по выводу графики

  • Вид работы:
    Курсовая работа (т)
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    61,02 Кб
  • Опубликовано:
    2015-02-10
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

DirectX. Использование возможностей ОС по выводу графики

Содержание


Содержание

Введение

Обзор Direct3D

Работа с интерфейсами

Описание некоторых функций, используемых для работы с Direct3D

Демонстрационная программа

Листинг

Результат выполнения

Заключение

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

Введение

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

·        DirectDraw - служит для ускорения отображения и обработки двумерной графики

·        Direct3D - для ускорения трехмерной графики

·        DirectSound - работает со звуком - микширование и 3D звук

·        DirectInput - для обработки клавиатуры, мыши, джойстика и так далее

·        DirectPlay - служит в основном для сетевой игрыразрабатывался специально, чтобы превратить платформу Windows как в основную для разработки игр. До этого разработчики использовали только MS-DOS и лишь совсем незначительная часть игр делалась для Windows 3.xx Одной из более ранних попыток Microsoft был выпуск WinG, который позволял разработчикам не писать бесконечные поддержки для различных типов аудио-видеоадаптеров, однако появление DirectX полностью изменило дело в пользу Windows. Теперь, разработчики могли почти не отвлекаться на подержки различных карт, потому что если у карты была поддержка DirectX, то несовместимость больше не была проблемой.- это интефейс довольно низкого уровня. С помощью своих API он предоставляет программисту прямой доступ к памяти адаптеров, где программист может создавать изображение, хранить графические образы, звуки и т. д. За счет непосредственной работы с памятью достигается ускорение, то есть теоретически частота, с которой программист сможет заставить прорисоваваться экран будет зависеть только от частоты, поддерживаемой монитором. Реально же, человек уже слабо воспринимает различия в частоте обновления, если она более 33 FPS (Frame Per Second - кадров в секунду), поэтому будет очень хорошо, если Вы сможете подвести Вашу частоту к этой.

Современные графические адаптеры позволяют доводить FPS двумерной графики до всех разумных пределов, поэтому все задержки с ее отображением от того, что компьютер не успел подготовить новое изображение, а это уже зависит от чатоты процессора и объема оперативной памяти. В трехмерной же графике все сложнее. Здесь скорость отображения зависит как и от мощности компьютера, так и от качества и способности ускорения графической карты. Разработчики видеоускорителей применяют все более и более навороченные технологии ускорения и все для того, чтобы увеличить FPS еще на десяток кадров, а также улучшить качетво картинки (устранить пикселизацию, сгладить цвета...) [6]

 

Обзор Direct3D

3D - это низкоуровневый графический API (программный интерфейс для приложений), позволяющий отображать трехмерные миры используя аппаратные ускорители трехмерной графики. Direct3D можно представлять как посредника между приложением и графическим устройством (аппаратурой трехмерной графики). Например, чтобы приказать графическому устройству очистить экран, приложение должно вызвать метод Direct3D IDirect3DDevice9::Clear. Взаимоотношения между приложением, Direct3D и аппаратурой компьютера показаны на рис. 1.1.

Рис. 1.1. Взаимосвязь между приложением, Direct3D и аппаратурой

На рис. 1.1 блок с названием Direct3D представляет набор документированных интерфейсов и функций, которые Direct3D предоставляет приложениям и программистам. Эти интерфейсы и функции охватывают полный набор функциональных возможностей, предлагаемых данной версией Direct3D. Обратите внимание, что предложение возможости Direct3D не означает, что она будет поддерживаться аппаратурой.

На рис. 1.1 изображена промежуточная стадия между Direct3D и графическим устройством - уровень абстрагирования от аппаратуры (Hardware Abstraction Layer, HAL). Direct3D не может напрямую взаимодействовать с аппаратурой, поскольку продаются сотни различных видеокарт и каждая видеокарта отличается набором поддерживаемых функций и способом реализации тех функций, которые поддерживаются. Например, две разные видеокарты могут совершенно по-разному выполнять очистку экрана. Поэтому Direct3D требует, чтобы производители оборудования реализовали уровень абстрагирования от оборудования (HAL), который представляет собой зависящий от аппаратуры код, указывающий устройству ка выполнять те или иные операции. Благодаря этому Direct3D не требуется знать специфику конкретных устройств, и его спецификации не зависят от используемого оборудования.

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

Работа с интерфейсами

 основан на технологии COM (Component Object Model - Компонентная Модель Объектов) . Возможно, эта технология имеет ряд преимуществ и упрощает жизнь разработчику подобных продуктов, в данном случае тем, кто разрабатывал DirectX, однако для пользователей это означает дополнительное изучение порядка работы с такой моделью.

Основная идея COM заключается в работе с указателями на виртуальную таблицу функций. В терминологии DirectX вместо слова функция используется понятие интерфейс и методы. Приблизительная схема организации таких таблиц изображена на рисунке:


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

. Создать объект

. Получить указатель на соответствующий интерфейс этого объекта.

. Используя данный указатель вызвать нужный метод.

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

Если в языке C++ данный механизм реализован в таком виде:

// Создали объект и получили указатель на интерфейс IDirect3D9

pd3d9 = Direct3DCreate9 (D3D_SDK_VERSION);

// Вызвали метод CreateDeviced9 -> CreateDevice (arg1, arg2, arg3, arg4, arg5, arg6, arg7);

То в ассемблере это будет выглядеть так:

invoke Direct3DCreate9, D3D_SDK_VERSION ; Создали объект

mov pd3d9, eax ; получили указательarg7

push arg6arg5arg4arg3arg2arg1pd3d9eax, pd3d9eax, [eax]dword ptr [eax+3Ch]

Смысл команд, приведенных выше, сводится к занесению данных для метода CreateDevice в стек; получению указателя на таблицу методов, используя указатель на интерфейс; и вызов самого метода CreateDevice. При этом число 3Ch является просто-напросто порядковым номером CreateDevice в таблице указателей на методы, умноженным на четыре.

Подобные операции с вычислением истинного адреса метода способны отбить желание работать на ассемблере с COM моделью. Избежать этого можно используя макрос d3d9.

Программа, которая совершает то же самое, что и указанная выше, но уже с использованием такого макроса:

invoke Direct3DCreate9, D3D_SDK_VERSION ; Создали объектpd3d9, eax ; получили указательd9 CreateDevice, pd3d9, Arg1, ... , Arg7

Макрос автоматически выполняет всю рутинную работу за нас, и вызов метода выглядит почти также как вызов обычной функции API Windows. [5]

Макросы d3dev9, d3dxmesh тем же образом позволяют обращаться к методам соответствующих классов.

 

Описание некоторых функций, используемых для работы с Direct3D


Исходя из [3]:

Direct3DCreate9,D3D_SDK_VERSION

Direct3DCreate9 - запрос указателя на интерфейс IDirect3D9.

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

CreateDevice, pd3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd ,DCREATE_SOFTWARE_VERTEXPROCESSING,BackBufferWidth, ADDR pd3dDevice

Метод CreateDevice создает объект IDirect3DDevice9.IDirect3D9::CreateDevice(Adapter,DDEVTYPE DeviceType,hFocusWindow,BehaviorFlags,DPRESENT_PARAMETERS *pPresentationParameters,DDevice9** ppReturnedDeviceInterface

);

§   Adapter - указывает физический видеоадаптер, который будет представлять создаваемый объект IDirect3DDevice9.

§   DeviceType - задает тип используемого устройства (т.е. аппаратное устройство (D3DDEVTYPE_HAL) или программное устройство (D3DDEVTYPE_REF)).

§   hFocusWindow - дескриптор окна с которым будет связано устройство. Обычно это то окно, в которое будет выводиться изображение и для наших целей мы здесь задаем тот же дескриптор, который указан в члене d3dpp.hDeviceWindow структуры D3DPRESENT_PARAMETERS.

§   BehaviorFlags - в этом параметре указывается значение D3DCREATE_HARDWARE_VERTEXPROCESSING либо D3DCREATE_SOFTWARE_VERTEXPROCESSING.

§   pPresentationParameters - указывается инициализированный экземпляр структуры D3DPRESENT_PARAMETERS, задающий параметры устройства.

§   ppReturnedDeviceInterface - возвращает указатель на созданное устройство.

D3DXMatrixRotationY, ADDR WorldMatrix, NULLDXMatrixRotationY - Вращение по оси Y.DXMATRIX* D3DXMatrixRotationY(DXMATRIX *pOut,  Angle

);

Параметры:

§  pOut - указатель на структуру D3DXMATRIX, в которую помешается исходный результат операции;

§  Angle - угол вращения в радианах по оси Y

D3DXMatrixRotationZ, ADDR WorldMatrix, RotZ

D3DXMatrixRotationZ - Вращение по оси Z.

D3DXMATRIX* D3DXMatrixRotationZ(DXMATRIX *pOut,    Angle

);

Параметры:

§  pOut - указатель на структуру D3DXMATRIX, в которую помешается исходный результат операции;

§  Angle - угол вращения в радианах по оси Z

D3DXMatrixLookAtLH - вычислить матрицу преобразования вида.

D3DXMATRIX *D3DXMatrixLookAtLH(DXMATRIX* pOut, // указатель на возвращаемую матрицу преобразованияD3DXVECTOR3* pEye, // местоположение камеры в сценеD3DXVECTOR3* pAt, // точка, на которую направлена камераD3DXVECTOR3* pUp // вектор, задающий направление вверх - (0, 1, 0)

);

Параметр pEye задает точку пространства, в которой располагается камера. Параметр pAt задает ту точку сцены, на которую направлена камера. Параметр pUp - это вектор, который задает направление «вверх» для нашей сцены. Почти всегда это вектор, совпадающий с осью Y - (0, 1, 0).

D3DXMatrixPerspectiveFovLH, ADDR ProjectionMatrix, FieldOfView, AspectRatio, NearViewPlanZ, FarViewPlanZ

D3DXMatrixPerspectiveFovLH - создает матрицу проекции на основании описания усеченной пирамиды видимого пространства.

D3DXMATRIX *D3DXMatrixPerspectiveFovLH(DXMATRIX* pOut, // возвращает матрицу проекцииfovY, // вертикальный угол поля зрения в радианахAspect, // форматное соотношение = ширина / высотаzn, // расстояние до передней полскостиzf // расстояние до задней плоскости

);

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

форматноеСоотношение = ширинаЭкрана / высотаЭкранаDXLoadMeshFromXA, addr Teapot, D3DXMESH_DYNAMIC,pd3dDevice, 0, 0, NULL, 0, addr TeapotP

D3DXLoadMeshFromXA - загружает в приложение X-Файл.

HRESULT D3DXLoadMeshFromX(        pFilename, Options,DDEVICE9 pDevice,DXBUFFER*  ppAdjacency,DXBUFFER*   ppMaterials,DXBUFFER*         ppEffeetInstances,*       pNumMaterials,

LPD3DXMESH* ppMesh

);

§  pFilename - указатель на строку, в которой приведено имя загружаемого Х-файла;

§  Options - член перечисляемого типа d3dxmesh, определяет комбинацию одного или более флагов для различных вариантов создания мэша. Рассмотрим несколько из имеющихся флагов:

o   d3dxmesh_vb_systemmem - этот флаг необходимо использовать с флагом D3DPOOL_SYSTEMMEM для определения класса памяти буфера вершин;

o   D3DXMESH_VB_MANAGED - применяется с флагом D3DPOOL_MANAGED для определения класса памяти буфера вершин;

o   D3DXMESH_IB_SYSTEMMEM - этот флаг необходимо использовать с флагом D3DPOOL_SYSTEMMEM для определения памяти индексного буфера;

o   D3DXMESH_IB_MANAGED - применяется с флагом D3DPOOL_MANAGED для определения памяти индексного буфера;

o   D3DXMESH_USEHWONLY - используется для обработки только аппаратных средств;

o   D3DXMESH_MANAGED - эквивалент комбинации двух флагов D3DXMESH_VB_MANAGED И D3DXMESH_IB_MANAGED;

o   D3DXMESH_SYSTEMMEM - Он эквивалентен комбинации двух флагов D3DXMESH_VB_SYSTEMMEM и D3DXMESH_IB_SYSTEMMEM;

§  pDevice - это указатель pDirect3DDevice на интерфейс IDirect3DDevice9, связывающий Х-файл с устройством Direct3D;

§  ppAdjacency - адрес указателя на буфер, содержащий данные о смежности. В этом параметре используется указатель на интерфейс ID3DXBuffer

§  ppMaterials - адрес указателя на интерфейс ID3DXBuffer. По возвращению функции этот параметр заполнится данными структуры D3DXMATERIAL для Х-файла;

§  ppEffeetInstances - адрес указателя на интерфейс ID3DXBuffer, содержащий специфические эффекты.

§  pNumMatегiа1s - указатель на массив данных для структуры D3DXMATERIAL.

§  ppMesh - адрес указателя на интерфейс ID3DXMesh, результат всей операции.dxmesh GetFVF,TeapotPGetFVF() - Возвращает значение типа DWORD, описывающее формат вершин сетки.dxmesh GetNumBytesPerVertex,TeapotPGetNumBytesPerVertex() - Возвращает количество байт, занимаемых описанием одной вершины.dxmesh GetNumVertices,TeapotPGetNumVertices() - Возвращает количество вершин в буфере вершин.dxmesh GetNumFaces,TeapotPGetNumFaces() - Возвращает количество граней (треугольных ячеек) в сетке.

d3dxmesh GetVertexBuffer,TeapotP, addr TeapotP_VBGetVertexBuffer(LPDIRECT3DVERTEXBUFFER9* ppVB); - Получает буфер вершин для данной сетки.dxmesh GetIndexBuffer,TeapotP, addr TeapotP_IBGetIndexBuffer(LPDIRECT3DINDEXBUFFER9* ppIB); - Получает буфер индексов для данной сетки.DXAssembleShaderFromFile, addr f_VS, 0, 0, D3DXSHADER_DEBUG, addr a_VS,0DXAssembleShaderFromFile - сборка шейдера из файлаD3DXAssembleShaderFromFile(    pSrcFile,D3DXMACR0* pDefines,DXINCLUDE plnclude,    Flags,DXBUFFER* ppShader,DXBUFFER* ppErrorMsgs

);

Функция D3DXAssembieShaderFromFile () имеет следующие параметры:

§  pSrcFile - имя зафужаемого файла, содержащего программу вершинного шейдера;

§  pDefines - указатель препроцессора;

§  pInciude ~ опциональный указатель интерфейса ID3DXInciude;

§  Flags - флаги, идентифицирующие шейдер;

§  ppShader - возвращает буфер, содержащий откомпилированный код шейдера. Здесь используется указатель Code на буфер LPD3DXBUFFER;

§  ppErrorMsgs - сообщение о возврате ошибок.

d3dev9 CreateVertexShader, pd3dDevice,b_VS ,addr c_VS- создает вершинный шейдер.CreateVertexShader(DWORD*   pFunction,DVertexShader9** ppShader

);

Функция CreateVertexShader () имеет следующие параметры:

§  рFunction - указатель, содержащий данные, возвращаемые функцией GetBufferPointer. Эта функция не имеет параметров и возвращает указатель на буфер данных.

§  ppShader - указатель на интерфейс IDirect3DVertexShader9.

d3dev9 SetVertexShaderConstantF,pd3dDevice,0, addr m_VS1 , 4 -занесение матрицы в необходимый константный регистр

HRESULT SetVertexShaderConstantF(   StartRegister,float* pConstantData,         Vector4fCount

);

Функция SetVertexShaderConstantFO имеет следующие параметры:

§  StartRegister - первый номер регистра, в который будут записаны данные;

§  pConstantData - указатель, содержащий данные для записи в регистр;

§  vector4fCount - количество необходимых регистров для размещения данных.

d3dev9 SetVertexShader,pd3dDevice,c_VS

SetVertexShader - устанавливает массив векторов.

HRESULT SetVertexShader(DXHANDLE hParameter,DVERTEXSHADER9 pVertexShader

);

Инициализирует идентифицируемый дескриптором hParameter объект вершинного шейдера в файле эффекта на основании вершинного шейдера, на который указывает pVertexShader

d3dev9 SetPixelShader,pd3dDevice,c_PSSetPixelShader(DXHANDLE hParameter,DPIXELSHADER9 pPShader

);

Инициализирует идентифицируемый дескриптором hParameter объект пиксельного шейдера в файле эффекта на основании пиксельного шейдера, на который указывает pPShaderdev9 Clear, pd3dDevice, 0, NULL, D3DCLEAR_TARGET or D3DCLEAR_ZBUFFER,Clearcolor, Zvalue, 0. - очищает различные буферы цветом

HRESULT Clear(

DWORD    Count,        D3DRECT* pRects,     Flags,DCOLOR Color, Z,      Stencil

);

Функция clear о имеет следующие параметры:

§  Count - счетчик, указывает число прямоугольников, подвергающихся очистке. Вся область рендеринга состоит из массива прямоугольников. Если указать значение 0, то будет использована вся поверхность, т. е. весь массив прямоугольников или вся область рендеринга;

§  pRect - указатель на структуру D3DRECT, описывающей массив очищаемых прямоугольников.

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

o   D3DCLEAR_STENCIL - очистит буфер трафарета до значения в параметре Stencil;

o   D3DCLEAR_TARGET - очистит буфер поверхности до цвета в параметре color. Воспользуемся данным флагом для очистки буфера поверхности в заданный цвет;

o   D3DCLEAR_ZBUFFER - очистит буфер глубины до значения в параметре z;

§  Сolor - цвет;

§  z - этот параметр задает значения для Z-буфера. Значение может находится в диапазоне от 0.0 - это самое близкое расстояние для средства просмотра и 1.0 - дальнее расстояние.

d3dev9 SetStreamSource, pd3dDevice, 0 , TeapotP_VB, 0, TeapotPB - Связывает буфер вершин с потоком данных.

HRESULT SetStrearSourse ( StreamNumber,DVertexBuffer* pStreamData,  OffsetInBytes,         Stride)

Параметры:

§  StreamNumber - определяет поток данных в диапазоне от 0 до -I,

§  pStrearxData - это указатель на интерфейс IDirect3DvertexBuffer, созданный для представления буфера вершин, который связывается с определенным потоком данных;

§  OffsetInBytes - смешение от начата потока до начала данных вершин. Измеряется в байтах. Здесь вы указываете, с какой вершины наминается вывод. Если поставить 0. то вывод будет происходить от первой вершины;

§  Stride - это своего рода "шаг в байтах", от одной вершины до другой

d3dev9 Present, pd3dDevice, NULL, NULL, NULL, NULL - Предстаазяет содержимое буфера на дисплей.

HRESULT Present(RECT* pSourceRect,RECT* pDestRect,                 hDestWindowOverride,RGNCDATA* pDirtyRegion

);

Параметры:

§  pSourceRect - указатель на структуру RECT исходной поверхности. Если использовать значение null, то будет представлена полная исходная поверхность;

§  pDestRect - указатель на структуру RECT поверхности адресата;

§  hDestWindowOverride - указатель на окно адресата, чья клиентская область взята как адрес для этого параметра представления Установив значение null, мы тем самым говорим, что используем поле

§  hWndDeviceWindow в структуре D3DPRESENT_PARAMETERS;

§  pDirtyReqion - последний параметр, "отголосок" прежних версий DirectX и уже не используется. Оставлен просто для совместимости, по-этому устанавливается всегда в значение null.

d3dev9 DrawIndexedPrimitive, pd3dDevice, D3DPT_TRIANGLELIST, 0, 0, TeapotP_NV, 0, TeapotP_NF - нарисовать примитив из индексного буфера.

HRESULT DrawIndexedPrimitive(DPRIMITIVETYPE Type,BaseVertexIndex,MinIndex,NumVertices,StartIndex,PrimitiveCount

);

Параметры:

§  Type - Тип рисуемого примитива.

§  BaseVertexIndex - Базисная величина, которая будет прибавлена к используемым в данном вызове индексам.

§  MinIndex - Минимальное значение индекса, которое будет использовано.

§  NumVertices - Количество вершин, которые будут обработаны данным вызовом.

§  StartIndex - Номер элемента буфера индексов, который будет отмечен как стартовая точка с которой начнется чтение индексов.

§  PrimitiveCount - Количество рисуемых примитивов.

 

Демонстрационная программа


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

 

Листинг


.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_Render_Parameters PROTO_Scene PROTO_Scene PROTO

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

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

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

.DATA ;:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::db "MyClass", 0db "8-78-3 Baranov I.V.", 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 ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

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

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

.CODE ;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::GetModuleHandle, NULLhInstance, eaxLoadCursor, NULL, IDC_ARROWhCursor, eaxRegisterClassEx, ADDR cbSizeGetSystemMetrics, SM_CXSCREENeaxGetSystemMetrics, SM_CYSCREENeax, WIN_Yeax, 1ebxebx, WIN_Xebx, 1CreateWindowEx, NULL, ADDR szClassName, ADDR szAppName,\_SYSMENU or WS_VISIBLE, \, eax, WIN_X, WIN_Y, NULL, NULL, hInstance, NULLhwnd, eaxGetClientRect, eax, ADDR clientwindowInit_Direct3D ; Создаем устройство_loop:PeekMessageA, ADDR msg, 0 , 0 , 0 , PM_REMOVE ;

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

;

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

jmp msg_loop ;

;: ;eax, DWORD PTR msg.message ;eax, WM_QUIT ;end_loop ;

;TranslateMessage, ADDR msg ;DispatchMessage, ADDR msg ;msg_loop_loop: eax, msg.wParam ; Если цикл обработки сообщений прерван,

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

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

;======================================================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 ;dd D3DSWAPEFFECT_FLIP ; Эффект обмена поверхностей (BackBuffer)dd 0 ; ID нашего окошкаdd 1 ; 0 - полноэкранный, 1 - в окошкеdd TRUE ; 1 - Direct3D создает Z + Stencil буфер. Если 0 - ничего не будет созданоdd D3DFMT_D24S8 ; Формат используемой поверхности

Flags dd 1 ; 0 или D3DPRESENTFLAG_LOCKABLE_BACKBUFFER=1_RefreshRateInHz dd 0 ; Частота обновления экрана в Hz_PresentationInterval dd 1 ; Интервал показа на экране backbufferа. 1 = Ждать обратного хода луча

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

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

.CODEDirect3DCreate9,D3D_SDK_VERSION         pd3d, eaxeax, eax@FOFFSET szDirect3D9Error_Message

@@:clientwindow.rightBackBufferWidthclientwindow.bottomBackBufferHeightd9 CreateDevice, pd3d, D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwnd ,\DCREATE_SOFTWARE_VERTEXPROCESSING, \BackBufferWidth, ADDR pd3dDevice

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

jz @FOFFSET szD3DDevice9Error_Message

;::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::_Direct3D proceax,a_PSeax, eax

;jz @Fdev9 Release, eaxeax,c_PSeax, eax

;jz @Fdev9 Release, eaxeax,a_VSeax, eax

;jz @Fdev9 Release, eaxeax,c_VSeax, eax

;jz @Fdev9 Release, eaxeax,TeapotPeax, eax

;jz @Feax,BackBufferPeax, eax

;jz @Feax,pd3dDeviceeax, eax

;jz @Fdev9 Release, eaxeax,pd3deax, eax

;jz @Fdev9 Release, eax_Direct3D endp

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

.DATAD3DVECTOR <0.0f, -300.0f, 100.0f> ; Координаты камеры в пространствеD3DVECTOR <0.0f,0.0f, 0.0f> ; Указывает куда смотрит камера

UpVector D3DVECTOR <0.0f, 1.0f, 0.0f> ; Верх камеры. Обычно берется 0.0,1.0,0.0dd 0.7853981635fdd NULL ; AspectRatiodd 1.0f ; Передняя отсекающая плоскостьdd 10000.0f ; Задняя отсекающая плоскостьdb "model\Teapot.x", 0_VS db "shaders\VS_01.txt", 0_PS db "shaders\PS_01.txt", 0

.DATA?_VS1 D3DXMATRIX <?>D3DMATRIX <?> ; Мировая матрицаD3DMATRIX <?> ; Матрица видаD3DMATRIX <?> ; Матрица проекцииLPDIRECT3DSURFACE9 ?dd ?dd ?dd ?_VB dd ?_IB dd ?_NV dd ?_NF dd ?_VS LPD3DXBUFFER ?_VS dd ?_VS LPDIRECT3DVERTEXSHADER9 ?_PS LPD3DXBUFFER ?_PS dd ?_PS LPDIRECT3DVERTEXSHADER9 ?

.CODEBackBufferWidth ; Вычисление Aspect (можно просто сразу поместить 1.33(3)f)BackBufferHeightAspectRatioD3DXMatrixRotationY, ADDR WorldMatrix, NULL ;World Matrix (мировая матрица)D3DXMatrixLookAtLH, ADDR ViewMatrix, ADDR EyeVector, \ ;View Matrix (матрица вида)LookAtVector, ADDR UpVectorD3DXMatrixPerspectiveFovLH, ADDR ProjectionMatrix, FieldOfView,\ ;Matrix Projection (матрица проекции), NearViewPlanZ, FarViewPlanZ

; начальная загрузкаD3DXLoadMeshFromXA, addr Teapot, D3DXMESH_DYNAMIC,pd3dDevice, 0, 0, NULL, 0,addr TeapotPdxmesh GetFVF,TeapotPTeapotPT,eaxdxmesh GetNumBytesPerVertex,TeapotPTeapotPB,eaxdxmesh GetVertexBuffer,TeapotP, addr TeapotP_VBdxmesh GetIndexBuffer,TeapotP, addr TeapotP_IBdxmesh GetNumVertices,TeapotPTeapotP_NV,eaxdxmesh GetNumFaces,TeapotPTeapotP_NF,eaxD3DXAssembleShaderFromFileA, addr f_VS, 0, 0, D3DXSHADER_DEBUG, addr a_VS,0dxbuf GetBufferPointer,a_VSb_VS,eaxdev9 CreateVertexShader, pd3dDevice,b_VS ,addr c_VSD3DXAssembleShaderFromFileA, addr f_PS, 0, 0, D3DXSHADER_DEBUG, addr a_PS,0dxbuf GetBufferPointer,a_PSb_PS,eaxdev9 CreatePixelShader, pd3dDevice,b_PS ,addr c_PS_Scene endp_Render_Parameters proc

.CODEdev9 SetRenderState, pd3dDevice, D3DRS_CULLMODE, D3DCULL_NONEdev9 SetRenderState, pd3dDevice, D3DRS_ZENABLE,D3DZB_TRUEdev9 SetSamplerState, pd3dDevice, 0, D3DSAMP_MIPFILTER,D3DTEXF_ANISOTROPICdev9 SetSamplerState, pd3dDevice, 0, D3DSAMP_MAGFILTER, D3DTEXF_ANISOTROPICdev9 SetSamplerState, pd3dDevice, 0, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPICdev9 SetSamplerState, pd3dDevice, 1, D3DSAMP_MIPFILTER,D3DTEXF_ANISOTROPICdev9 SetSamplerState, pd3dDevice, 1, D3DSAMP_MAGFILTER, D3DTEXF_ANISOTROPICdev9 SetSamplerState, pd3dDevice, 1, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPICdev9 SetSamplerState, pd3dDevice, 2, D3DSAMP_MIPFILTER,D3DTEXF_ANISOTROPICdev9 SetSamplerState, pd3dDevice, 2, D3DSAMP_MAGFILTER, D3DTEXF_ANISOTROPICdev9 SetSamplerState, pd3dDevice, 2, D3DSAMP_MINFILTER, D3DTEXF_ANISOTROPIC_Render_Parameters endp

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

.DATAdd 1.0f ; Значение для очистки Z буфераdd 0 ; Цвет для очистки BackBuffer'а

.DATA?

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

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

jne noreset2                                              ;dev9 Reset, pd3dDevice, ADDR BackBufferWidth         ;Set_Render_Parameters:dev9 BeginScene, pd3dDevicedev9 SetRenderTarget,pd3dDevice,0, BackBufferPdev9 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 SetVertexShader,pd3dDevice,c_VSdev9 SetPixelShader,pd3dDevice,c_PSdev9 SetVertexShaderConstantF,pd3dDevice,0, addr m_VS1 , 4 ;c0dev9 SetFVF, pd3dDevice, TeapotPTdev9 SetStreamSource, pd3dDevice, 0 , TeapotP_VB, 0, TeapotPBdev9 SetIndices, pd3dDevice, TeapotP_IBdev9 DrawIndexedPrimitive, pd3dDevice, D3DPT_TRIANGLELIST,0,0,TeapotP_NV,0,TeapotP_NFdev9 EndScene, pd3dDevice

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

.DATAdd 0.0fdd 0.01f

.CODERotZPribRotZD3DXMatrixRotationZ, ADDR WorldMatrix, RotZdev9 Present, pd3dDevice, NULL, NULL, NULL, NULL ; Вывод BackBuffer'а на экран

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

mov eax, DWORD PTR [esp]MessageBox, hwnd, eax, ADDR szAppName, MB_ICONERROReaxDestroy_Direct3DExit

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

 

 

Результат выполнения



 

Заключение

directx графический программирование приложение

В ходе выполнения данной курсовой работы были освещены основы программирования графических приложений на основе DirectX для операционной системы Windows. В работе используются макросы invoke, d3dev9, d3dxmesh что заметно сокращает код программы. Это достигается за счет того, что макросы сами заботятся о помещении передаваемых параметров в стек, что позволяет избавиться от множества команд PUSH, макросы d3d к тому же берут на себя заботу по обращению к виртуальной таблице функций.

Для реализации программы, иллюстрирующей теоритическую информацию был использован 32-битный ассемблер MASM.

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


1.      Пирогов В. Ю. Ассемблер для Windows. - СПб.: Петербург, 2002 .

.        Фрэнк Д. Луна Введение в программирование трехмерных игр с DirectX 9.0. - Wordware Publishing, 2003

3.      «DirectX Graphics: Первый шаг», <http://vertexland.narod.ru/code/directx/dx_first.htm>

4.      «Что такое DirectX?», <http://citforum.ru/programming/digest/directxwhatis.shtml>

5.      «Уроки DirectX/OpenGL в masm32», http://www.wasm.ru/wault/

Похожие работы на - DirectX. Использование возможностей ОС по выводу графики

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!