Помощь в написании студенческих работ
Антистрессовый сервис

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

КонтрольнаяПомощь в написанииУзнать стоимостьмоей работы

Но DirectX используется не только в играх, но и в клиентских приложениях. Начиная с версии 3.0 .NET Framework начал в себя включать WPF (Windows Presentation Foundation) — систему для построения клиентских приложений под Windows. Вывод В результате выполнения курсовой работы был изучен один из разделов операционной — работа с графикой. Была написана программа на C++ с применением DirectX-функций… Читать ещё >

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

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

Цель работы Использование DirectX для решения задач по выводу и обработке графики в Microsoft Windows.

В качестве задачи взята проблема проверки принадлежности точки полигону. Так как в нашем случае важен не сам алгоритм, а демонстрация работы DirectX, то задача максимально упрощена и в качестве полигона берется его частный случай — треугольник, а в качестве точки — текущее положение указателя мышки.

Краткая теория

DirectX (от англ. direct — прямой, непосредственный) — это набор API, разработанных для решения задач, связанных с программированием под Microsoft Windows. Наиболее широко используется при написании компьютерных игр. Пакет средств разработки DirectX под Microsoft Windows бесплатно доступен на сайте Microsoft. Зачастую обновленные версии DirectX поставляются вместе с игровыми приложениями.

Практически все части DirectX API представляют собой наборы COM-совместимых объектов.

В целом, DirectX подразделяется на:

DirectX Graphics, набор интерфейсов, ранее (до версии 8.0) делившихся на:

DirectDraw: интерфейс вывода растровой графики. (Его разработка давно прекращена)

Direct3D (D3D): интерфейс вывода трёхмерных примитивов.

DirectInput: интерфейс, используемый для обработки данных, поступающих с клавиатуры, мыши, джойстика и пр. игровых контроллеров.

DirectPlay: интерфейс сетевой коммуникации игр.

DirectSound: интерфейс низкоуровневой работы со звуком (формата Wave)

DirectMusic: интерфейс воспроизведения музыки в форматах Microsoft.

DirectShow: интерфейс, используемый для ввода/вывода аудио и/или видео данных.

DirectX Instruments — технология, позволяющая на основе мультимедийного API DirectX создавать и использовать программные синтезаторы. В отличие от DX-плагинов, такие программы могут полностью управляться по MIDI и служат главным образом не для обработки, а для синтеза звука. Технология DXi была популярна в 2001—2004 гг., особенно в программных продуктах Cakewalk, но со временем проиграла «войну форматов» технологии VST от Steinberg.

DirectSetup: часть, ответственная за установку DirectX.

DirectX Media Objects: реализует функциональную поддержку потоковых объектов (например, кодировщики/декодировщики)

Direct2D: интерфейс вывода двухмерной графики

DirectX пришел на смену 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

);

Parameters

SDKVersion

Type: UINT

Return value

Type: IDirect3D9*

HRESULT CreateDevice (

[in] UINT Adapter,

[in] D3DDEVTYPE DeviceType,

[in] HWND hFocusWindow,

[in] DWORD BehaviorFlags,

[in, out] D3DPRESENT_PARAMETERS *pPresentationParameters,

[out, retval] IDirect3DDevice9 **ppReturnedDeviceInterface

);

Return value

Type: HRESULT

HRESULT D3DXCreateFont (

_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

);

Parameters

pDevice [in]

Type: LPDIRECT3DDEVICE9

Указатель на IDirect3DDevice9 интерфейс, который ассоциируется с шрифтом.

Height [in]

Type: INT

Высота символа в логических единицах.

Width [in]

Type: UINT

Ширина символа в логических единицах.

Weight [in]

Type: UINT

Вес шрифта.

Italic [in]

Type: BOOL

True для italic шрифта, иначе false.

pFacename [in]

Type: LPCTSTR

Строка с именем шрифта.

ppFont [out]

Type: LPD3DXFONT*

Возвращает указатель на ID3DXFont интерфейс, представляющий созданный объект шрифта.

Return value

Type: HRESULT

INT DrawText (

[in] LPD3DXSPRITE pSprite,

[in] LPCTSTR pString,

[in] INT Count,

[in] LPRECT pRect,

[in] DWORD Format,

[in] D3DCOLOR Color

);

Parameters

pSprite [in]

Type: LPD3DXSPRITE

Указатель на ID3DXSprite, содержащий строку. Может быть NULL, если Direct3D будет отрисовывать строку своим sprite object.

pString [in]

Type: LPCTSTR

Указатель на строку для вывода. Если параметр Count равен -1, то строка должна быть null-terminated.

Count [in]

Type: INT

Количество символов в строке.

pRect [in]

Type: LPRECT

Указатель на RECT, содержащий область, в которой будет отрисовываться текст.

Format [in]

Type: DWORD

Метод форматирования текста.

Color [in]

Type: D3DCOLOR

Цвет текста.

Return value

Type: INT

HRESULT CreateVertexBuffer (

[in] UINT Length,

[in] DWORD Usage,

[in] DWORD FVF,

[in] D3DPOOL Pool,

[out, retval] IDirect3DVertexBuffer9 **ppVertexBuffer,

[in] HANDLE *pSharedHandle

);

Parameters

Length [in]

Type: UINT

Длина буфера в байтах

FVF [in]

Type: DWORD

Комбинация D3DFVF, определяет формат вершин в этом буфере

Pool [in]

Type: D3DPOOL

Член D3DPOOL тип перечисления представляет собой рабочий класс памяти в который отправляется ресурс. Не устанавливать D3DPOOL_SCRATCH.

ppVertexBuffer [out, retval]

Type: IDirect3DVertexBuffer9**

Адрес на указатель IDirect3DVertexBuffer9 интерфейса, представляет созданный буферный ресурс.

pSharedHandle [in]

Type: HANDLE*

Занято. Установить этот параметр в NULL.

Return value

Type: HRESULT

HRESULT Clear (

[in] DWORD Count,

[in] const D3DRECT *pRects,

[in] DWORD Flags,

[in] D3DCOLOR Color,

[in] float Z,

[in] DWORD Stencil

);

Parameters

Count [in]

Type: DWORD

Количество прямоугольников в массиве pRects.

pRects [in]

Type: const D3DRECT*

Указатель на массив структур D3DRECT, содержащих прямоугольники на очистку.

Flags [in]

Type: DWORD

Комбинация одного или более флагов D3DCLEAR определяющих поверхности на очистку.

Color [in]

Type: D3DCOLOR

Отрисовка поверхности в этом цвете ARGB.

Z [in]

Type: float

Очищает буфер глубины к значению z варьирующейся от 0 до 1.

Stencil [in]

Type: DWORD

Очищает stencil буфер.

Return value

Type: HRESULT

HRESULT BeginScene ();

Parameters

Функция без параметров.

Return value

Type: HRESULT

Останавливает сцену вызванную IDirect3DDevice9: BeginScene.

Syntax

C++

HRESULT EndScene ();

Parameters

Функция без параметров.

Return value

Type: HRESULT

Связывает буфер вершин и поток данных.

HRESULT SetStreamSource (

[in] UINT StreamNumber,

[in] IDirect3DVertexBuffer9 *pStreamData,

[in] UINT OffsetInBytes,

[in] UINT Stride

);

Parameters

StreamNumber [in]

Type: UINT

Определяет поток данных.

pStreamData [in]

Type: IDirect3DVertexBuffer9*

Указатель на IDirect3DVertexBuffer9 интерфейс, представляющий буфер вершин, связуемых с выбранным потоком данных.

OffsetInBytes [in]

Type: UINT

Сдвиг от начала потока в байтах.

Return value

Type: HRESULT

HRESULT SetFVF (

[in] DWORD FVF

);

Parameters

FVF [in]

Type: DWORD

DWORD содержащий фиксированную функцию типа вершины.

Return value

Type: HRESULT

HRESULT DrawPrimitive (

[in] D3DPRIMITIVETYPE PrimitiveType,

[in] UINT StartVertex,

[in] UINT PrimitiveCount

);

Parameters

PrimitiveType [in]

Type: D3DPRIMITIVETYPE

Член D3DPRIMITIVETYPE перечисления, содержит тип примитива.

StartVertex [in]

Type: UINT

Индекс первой вершины.

PrimitiveCount [in]

Type: UINT

Количество примитивов которых нужно отрисовать.

Return value

Type: HRESULT

HRESULT Present (

[in] const RECT *pSourceRect,

[in] const RECT *pDestRect,

[in] HWND hDestWindowOverride,

[in] const RGNDATA *pDirtyRegion

);

Parameters

pSourceRect [in]

Type: const RECT*

Указатель на значения, должен быть NULL .

pDestRect [in]

Указатель на значения, должен быть NULL .

hDestWindowOverride [in]

Type: HWND

Указатель на окно, которое является целью для показа.

pDirtyRegion [in]

Type: const RGNDATA*

Указатель на значения, должен быть NULL .

Исходный текст отлаженной программы

#include

#include

#include

struct C_VERTEX

{

FLOAT x, y, z, rhw;

DWORD color;

};

#define D3DFVF_C_VERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)

LPDIRECT3D9 g_pD3D = NULL;

LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;

LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL;

LPD3DXFONT g_Font = NULL;

C_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, },

};

int WINDOW_WIDTH = 400;

int WINDOW_HEIGHT = 300;

int textx = 10;

int texty = 10;

bool res = false;

HRESULT InitD3D (HWND hWnd)

{

if (NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))

return E_FAIL;

D3DPRESENT_PARAMETERS d3dpp;

ZeroMemory (&d3dpp, sizeof (d3dpp));

d3dpp.Windowed = TRUE;

d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;

d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;

if (FAILED (g_pD3D->CreateDevice (D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd,

D3DCREATE_SOFTWARE_VERTEXPROCESSING,

&d3dpp, &g_pd3dDevice)))

{

return E_FAIL;

}

SUCCEEDED (D3DXCreateFont (g_pd3dDevice, 15, 0, FW_BOLD, 1, 0, DEFAULT_CHARSET,

OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH, L" Arial", &g_Font));

return S_OK;

}

void DrawString ()

{

RECT FontPos = { textx, texty, textx + 100, texty + 40 };

if (res)

g_Font->DrawText (NULL, L" Point in the polygon.", -1, &FontPos, DT_NOCLIP, D3DCOLOR_ARGB (255, 255, 0, 0));

else

g_Font->DrawText (NULL, L" Point out of the polygon.", -1, &FontPos, DT_NOCLIP, D3DCOLOR_ARGB (255, 0, 0, 0));

}

bool IsPointInPolygon (int x, int y)

{

bool result = false;

int j = 2;

for (int i = 0; i < 3; i++)

{

if ((Vertices[i]. y < y

&& Vertices[j]. y >= y)

|| (Vertices[j]. y < y

&& Vertices[i]. y >= y))

{

if (Vertices[i]. x + (y — Vertices[i]. y) / (Vertices[j]. y — Vertices[i]. y) * (Vertices[j]. x — Vertices[i]. x) < x)

{

result = !result;

}

}

j = i;

}

return result;

}

HRESULT InitPolygon ()

{

if (FAILED (g_pd3dDevice->CreateVertexBuffer (3 * sizeof (C_VERTEX),

0, D3DFVF_C_VERTEX,

D3DPOOL_DEFAULT, &g_pVB, NULL)))

{

return E_FAIL;

}

VOID* pVertices;

if (FAILED (g_pVB->Lock (0, sizeof (Vertices), (void**)&pVertices, 0)))

return E_FAIL;

memcpy (pVertices, Vertices, sizeof (Vertices));

g_pVB->Unlock ();

return S_OK;

}

VOID Cleanup ()

{

if (g_pd3dDevice ≠ NULL)

g_pd3dDevice->Release ();

if (g_pD3D ≠ NULL)

g_pD3D->Release ();

if (g_Font)

g_Font->Release ();

}

VOID Render ()

{

if (NULL == g_pd3dDevice)

return;

g_pd3dDevice->Clear (0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB (240, 248, 255), 1.0f, 0);

if (SUCCEEDED (g_pd3dDevice->BeginScene ()))

{

g_pd3dDevice->SetStreamSource (0, g_pVB, 0, sizeof (C_VERTEX));

g_pd3dDevice->SetFVF (D3DFVF_C_VERTEX);

g_pd3dDevice->DrawPrimitive (D3DPT_TRIANGLELIST, 0, 1);

DrawString ();

g_pd3dDevice->EndScene ();

}

g_pd3dDevice->Present (NULL, NULL, NULL, NULL);

}

LRESULT WINAPI MsgProc (HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)

{

switch (msg)

{

case WM_DESTROY:

Cleanup ();

PostQuitMessage (0);

return 0;

case WM_PAINT:

Render ();

ValidateRect (hWnd, NULL);

return 0;

case WM_MOUSEMOVE:

int x = LOWORD (lParam);

inty = HIWORD (lParam);

res = IsPointInPolygon (x, y);

Render ();

break;

}

return DefWindowProc (hWnd, msg, wParam, lParam);

}

INT WINAPI wWinMain (HINSTANCE hInst, HINSTANCE, LPWSTR, INT)

{

WNDCLASSEX wc =

{

sizeof (WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L,

GetModuleHandle (NULL), NULL, NULL, NULL, NULL,

L" C_WORK", NULL

};

RegisterClassEx (&wc);

HWND hWnd = CreateWindow (L" C_WORK", L" POINT IN POLYGON" ,

WS_OVERLAPPEDWINDOW, 100, 100, WINDOW_WIDTH, WINDOW_HEIGHT,

NULL, NULL, wc. hInstance, NULL);

if (SUCCEEDED (InitD3D (hWnd)))

{

if (SUCCEEDED (InitPolygon ()))

{

ShowWindow (hWnd, SW_SHOWDEFAULT);

UpdateWindow (hWnd);

MSG msg;

while (GetMessage (&msg, NULL, 0, 0))

{

TranslateMessage (&msg);

DispatchMessage (&msg);

}

}

}

UnregisterClass (L" C_WORK", wc. hInstance);

return 0;

}

графика функция программа

Результаты работы программы Рисунок 1

Рисунок 2

Вывод В результате выполнения курсовой работы был изучен один из разделов операционной — работа с графикой. Была написана программа на C++ с применением DirectX-функций.

Показать весь текст
Заполнить форму текущей работой