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

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

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/