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] HANDLE *pSharedHandle

);[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;

};

#define D3DFVF_C_VERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)D9 g_pD3D = NULL; DDEVICE9 g_pd3dDevice = NULL; DVERTEXBUFFER9 g_pVB = NULL; DXFONT g_Font = NULL; _VERTEX Vertices[] =

{

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


Содержание Цель работы Краткая теория Описание используемых DirectX-функций Исходный текст отлаженной программы Результаты работы программы

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ