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/