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