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

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

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-функций.