DirectX. Использование возможностей по выводу графики
Содержание
Цель
работы
Краткая
теория
Описание
используемых DirectX-функций
Исходный
текст отлаженной программы
Результаты
работы программы
Вывод
Цель работы
Использование DirectX для решения задач по
выводу и обработке графики в Microsoft Windows.
В качестве задачи взята проблема проверки
принадлежности точки полигону. Так как в нашем случае важен не сам алгоритм, а
демонстрация работы DirectX, то задача максимально упрощена и в качестве
полигона берется его частный случай - треугольник, а в качестве точки - текущее
положение указателя мышки.
Краткая теория
(от англ. direct - прямой, непосредственный) -
это набор API, разработанных для решения задач, связанных с программированием
под Microsoft Windows. Наиболее широко используется при написании компьютерных
игр. Пакет средств разработки DirectX под Microsoft Windows бесплатно доступен
на сайте Microsoft. Зачастую обновленные версии DirectX поставляются вместе с
игровыми приложениями.
Практически все части DirectX API представляют
собой наборы COM-совместимых объектов.
В целом, DirectX подразделяется на:Graphics,
набор интерфейсов, ранее (до версии 8.0) делившихся на:: интерфейс вывода
растровой графики. (Его разработка давно прекращена)D (D3D): интерфейс вывода
трёхмерных примитивов.: интерфейс, используемый для обработки данных,
поступающих с клавиатуры, мыши, джойстика и пр. игровых контроллеров.:
интерфейс сетевой коммуникации игр.: интерфейс низкоуровневой работы со звуком
(формата Wave): интерфейс воспроизведения музыки в форматах Microsoft.: интерфейс,
используемый для ввода/вывода аудио и/или видео данных.Instruments -
технология, позволяющая на основе мультимедийного API DirectX создавать и
использовать программные синтезаторы. В отличие от DX-плагинов, такие программы
могут полностью управляться по MIDI и служат главным образом не для обработки,
а для синтеза звука. Технология DXi была популярна в 2001-2004 гг., особенно в
программных продуктах Cakewalk, но со временем проиграла «войну форматов»
технологии VST от Steinberg.: часть, ответственная за установку DirectX.Media
Objects: реализует функциональную поддержку потоковых объектов (например,
кодировщики/декодировщики)D : интерфейс вывода двухмерной графикипришел на
смену GDI. Простые игры, которые не требуют быстрой графики, могут использовать
GDI. Однако GDI не обеспечивает качественной анимации, поскольку в нём нет
возможности синхронизации с кадровым буфером. Также, в GDI нет растеризации для
отрисовки 3D-графики. Современные игры используют DirectX или OpenGL, что даёт
программистам доступ к большему количеству аппаратных возможностей.
Но DirectX используется не только в играх, но и
в клиентских приложениях. Начиная с версии 3.0 .NET Framework начал в себя
включать WPF (Windows Presentation Foundation) - систему для построения
клиентских приложений под Windows.
В основе WPF лежит векторная система
визуализации, не зависящая от разрешения устройства вывода и созданная с учётом
возможностей современного графического оборудования. WPF предоставляет средства
для создания визуального интерфейса, включая язык XAML (Extensible Application
Markup Language), элементы управления, привязку данных, макеты, двухмерную и
трёхмерную графику, анимацию, стили, шаблоны, документы, текст, мультимедиа и
оформление.
Графической технологией, лежащей в основе WPF,
является именно DirectX, в отличие от Windows Forms, где используется GDI/GDI+.
Производительность WPF выше, чем у GDI+ за счёт использования аппаратного
ускорения графики через DirectX.
Описание используемых DirectX-функций
IDirect3D9* Direct3DCreate9(
UINT SDKVersion
);: UINTvalue:
IDirect3D9*CreateDevice(
[in] UINT Adapter,
[in] D3DDEVTYPE DeviceType,
[in] HWND hFocusWindow,
[in] DWORD BehaviorFlags,
[in, out] D3DPRESENT_PARAMETERS
*pPresentationParameters,
[out, retval] IDirect3DDevice9
**ppReturnedDeviceInterface
);value: HRESULTD3DXCreateFont(
_In_ LPDIRECT3DDEVICE9 pDevice,
_In_ INT Height,
_In_ UINT Width,
_In_ UINT Weight,
_In_ UINT MipLevels,
_In_ BOOL Italic,
_In_ DWORD CharSet,
_In_ DWORD OutputPrecision,
_In_ DWORD Quality,
_In_ DWORD PitchAndFamily,
_In_ LPCTSTR pFacename,
_Out_ LPD3DXFONT *ppFont
);[in]: LPDIRECT3DDEVICE9
Указатель на
IDirect3DDevice9 интерфейс,
который
ассоциируется
с
шрифтом.
Height [in]: INT
Высота символа в логических единицах.[in]: UINT
Ширина символа в логических единицах.
Weight [in]: UINT
Вес шрифта.[in]:
BOOLдля
italic шрифта,
иначе
false.[in]: LPCTSTR
Строка с
именем
шрифта.
ppFont [out]: LPD3DXFONT*
Возвращает указатель на ID3DXFont интерфейс,
представляющий созданный объект шрифта.
Return value: HRESULTDrawText(
[in] LPD3DXSPRITE pSprite,
[in] LPCTSTR pString,
[in] INT Count,
[in] LPRECT pRect,
[in] DWORD Format,
[in] D3DCOLOR Color
);[in]: LPD3DXSPRITE
Указатель на
ID3DXSprite, содержащий строку.
Может
быть NULL, если Direct3D будет отрисовывать строку своим sprite object. [in]:
LPCTSTR
Указатель на строку для вывода. Если параметр
Count равен -1, то строка должна быть null-terminated.[in]: INT
Количество символов в строке.[in]: LPRECT
Указатель на RECT, содержащий область, в которой
будет отрисовываться текст. [in]: DWORD
Метод форматирования текста.
Color [in]: D3DCOLOR
Цвет текста.value:
INTCreateVertexBuffer(
[in] UINT Length,
[in] DWORD Usage,
[in] DWORD FVF,
[in] D3DPOOL Pool,
[out, retval] IDirect3DVertexBuffer9
**ppVertexBuffer,
);[in]: UINT
Длина буфера
в
байтах
FVF [in]: DWORD
Комбинация D3DFVF, определяет формат вершин в
этом буфере[in]: D3DPOOL
Член D3DPOOL тип перечисления представляет собой
рабочий класс памяти в который отправляется ресурс. Не устанавливать
D3DPOOL_SCRATCH.[out, retval]: IDirect3DVertexBuffer9**
Адрес на указатель IDirect3DVertexBuffer9
интерфейса, представляет созданный буферный ресурс.
pSharedHandle [in]: HANDLE*
Занято. Установить
этот параметр в NULL.
Return value: HRESULTClear(
[in] DWORD Count,
[in] const D3DRECT *pRects,
[in] DWORD Flags,
[in] D3DCOLOR Color,
[in] float Z,
[in] DWORD Stencil
);[in]: DWORD
Количество прямоугольников
в
массиве
pRects. [in]
Type: const D3DRECT*
Указатель на массив структур D3DRECT, содержащих
прямоугольники на очистку. [in]: DWORD
Комбинация одного или более флагов D3DCLEAR
определяющих поверхности на очистку.[in]: D3DCOLOR
Отрисовка поверхности в этом цвете ARGB.[in]:
float
Очищает буфер глубины к значению z варьирующейся
от 0 до 1.
Stencil [in]: DWORD
Очищает stencil буфер.value:
HRESULTBeginScene();
Функция без
параметров.value:
HRESULT
Останавливает сцену вызванную
IDirect3DDevice9::BeginScene.
Syntax++EndScene();
Функция без
параметров.
Return value: HRESULT
Связывает буфер вершин и поток данных.
HRESULT SetStreamSource(
[in] UINT StreamNumber,
[in] IDirect3DVertexBuffer9
*pStreamData,
[in] UINT OffsetInBytes,
[in] UINT Stride
);[in]
Type: UINT
Определяет поток данных.[in]:
IDirect3DVertexBuffer9*
Указатель на IDirect3DVertexBuffer9 интерфейс,
представляющий буфер вершин, связуемых с выбранным потоком данных.[in]: UINT
Сдвиг от начала потока в байтах.
Return value: HRESULTSetFVF(
[in] DWORD FVF
);[in]
Type: DWORDсодержащий фиксированную функцию типа
вершины.
Return value: HRESULTDrawPrimitive(
[in] D3DPRIMITIVETYPE PrimitiveType,
[in] UINT StartVertex,
[in] UINT PrimitiveCount
);[in]: D3DPRIMITIVETYPE
Член
D3DPRIMITIVETYPE перечисления,
содержит
тип
примитива.[in]:
UINT
Индекс первой
вершины.[in]
Type: UINT
Количество примитивов которых нужно отрисовать.
Return value: HRESULTPresent(
[in] const RECT *pSourceRect,
[in] const RECT *pDestRect,
[in] HWND hDestWindowOverride,
[in] const RGNDATA *pDirtyRegion
);[in]: const RECT*
Указатель на значения, должен быть NULL .[in]
Указатель на значения, должен быть NULL .[in]:
HWND
Указатель на окно, которое является целью для
показа.
pDirtyRegion [in]: const RGNDATA*
Указатель на значения, должен быть NULL .
Исходный текст отлаженной программы
#include <d3d9.h>
#include <d3dx9.h>
#include <strsafe.h>C_VERTEX
{x, y, z, rhw; color;
};
{
{ 150.0f, 50.0f, 0.5f, 1.0f,
0xff00bdff, },
{ 250.0f, 150.0f, 0.5f, 0.0f,
0xff00ff00, },
{ 50.0f, 150.0f, 0.5f, 0.0f,
0xff00ffff, },
};WINDOW_WIDTH = 400;WINDOW_HEIGHT =
300;textx = 10;texty = 10;res = false;InitD3D( HWND hWnd )
{( NULL == ( g_pD3D =
Direct3DCreate9( D3D_SDK_VERSION ) ) )E_FAIL;DPRESENT_PARAMETERS d3dpp;(
&d3dpp, sizeof( d3dpp ) );dpp.Windowed = TRUE;dpp.SwapEffect =
D3DSWAPEFFECT_DISCARD;dpp.BackBufferFormat = D3DFMT_UNKNOWN;( FAILED(
g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL,
hWnd,DCREATE_SOFTWARE_VERTEXPROCESSING,
&d3dpp, &g_pd3dDevice ) ) )
{E_FAIL;
}(D3DXCreateFont(g_pd3dDevice, 15,
0, FW_BOLD, 1, 0, DEFAULT_CHARSET,_DEFAULT_PRECIS, DEFAULT_QUALITY,
DEFAULT_PITCH, L"Arial", &g_Font));S_OK;
}DrawString()
{FontPos = { textx, texty, textx +
100, texty + 40 };(res)_Font->DrawText(NULL, L"Point in the
polygon.", -1, &FontPos, DT_NOCLIP, D3DCOLOR_ARGB( 255, 255, 0, 0
));_Font->DrawText(NULL, L"Point out of the polygon.", -1,
&FontPos, DT_NOCLIP, D3DCOLOR_ARGB( 255, 0, 0, 0 ));
}IsPointInPolygon(int x, int y)
{result = false;j = 2; (int i = 0; i
< 3; i++)
{((Vertices[i].y < y
&& Vertices[j].y >= y)
|| (Vertices[j].y < y
&& Vertices[i].y >= y))
{(Vertices[i].x + (y -
Vertices[i].y) / (Vertices[j].y - Vertices[i].y) * (Vertices[j].x -
Vertices[i].x) < x)
{= !result;
}
}= i;
}result;
}
InitPolygon()
{( FAILED(
g_pd3dDevice->CreateVertexBuffer( 3 * sizeof( C_VERTEX ),
, D3DFVF_C_VERTEX,DPOOL_DEFAULT,
&g_pVB, NULL ) ) )
{E_FAIL;
}
* pVertices;( FAILED(
g_pVB->Lock( 0, sizeof( Vertices ), ( void** )&pVertices, 0 ) ) )E_FAIL;(
pVertices, Vertices, sizeof( Vertices ) );_pVB->Unlock();S_OK;
}Cleanup()
{( g_pd3dDevice != NULL
)_pd3dDevice->Release();( g_pD3D != NULL )_pD3D->Release();(g_Font)
_Font->Release();
}Render()
{( NULL == g_pd3dDevice
);_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB( 240, 248, 255
), 1.0f, 0 );
( SUCCEEDED(
g_pd3dDevice->BeginScene() ) )
{_pd3dDevice->SetStreamSource( 0,
g_pVB, 0, sizeof( C_VERTEX ) );_pd3dDevice->SetFVF( D3DFVF_C_VERTEX
);_pd3dDevice->DrawPrimitive( D3DPT_TRIANGLELIST, 0, 1
);();_pd3dDevice->EndScene();
}_pd3dDevice->Present( NULL,
NULL, NULL, NULL );
}WINAPI MsgProc( HWND hWnd, UINT
msg, WPARAM wParam, LPARAM lParam )
{( msg )
{WM_DESTROY:();( 0 );0;WM_PAINT:();(
hWnd, NULL );0;WM_MOUSEMOVE:x = LOWORD(lParam);= HIWORD(lParam);=
IsPointInPolygon(x, y);();;
}DefWindowProc( hWnd, msg, wParam,
lParam );
}WINAPI wWinMain( HINSTANCE hInst,
HINSTANCE, LPWSTR, INT )
{wc =
{( WNDCLASSEX ), CS_CLASSDC,
MsgProc, 0L, 0L,( NULL ), NULL, NULL, NULL, NULL,"C_WORK", NULL
};( &wc );hWnd = CreateWindow(
L"C_WORK", L"POINT IN POLYGON",_OVERLAPPEDWINDOW, 100, 100,
WINDOW_WIDTH, WINDOW_HEIGHT,, NULL, wc.hInstance, NULL );( SUCCEEDED( InitD3D(
hWnd ) ) )
{(SUCCEEDED( InitPolygon()))
{( hWnd, SW_SHOWDEFAULT );( hWnd );
msg;( GetMessage( &msg, NULL, 0,
0 ) )
{( &msg );( &msg );
}
}
}( L"C_WORK", wc.hInstance
);
return
0;
}
графика функция программа
Результаты
работы программы
Рисунок
1
Рисунок
2
Вывод
В
результате выполнения курсовой работы был изучен один из разделов операционной
- работа с графикой. Была написана программа на C++ с применением
DirectX-функций.