Меню
Главная
Авторизация/Регистрация
 
Главная arrow Информатика arrow 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 <d3d9.h>

#include <d3dx9.h>

#include <strsafe.h>

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

 
Если Вы заметили ошибку в тексте выделите слово и нажмите Shift + Enter
 
Предметы
Агропромышленность
Банковское дело
БЖД
Бухучет и аудит
География
Документоведение
Естествознание
Журналистика
Инвестирование
Информатика
История
Культурология
Литература
Логика
Логистика
Маркетинг
Математика, химия, физика
Медицина
Менеджмент
Недвижимость
Педагогика
Политология
Политэкономия
Право
Психология
Региональная экономика
Религиоведение
Риторика
Социология
Статистика
Страховое дело
Техника
Товароведение
Туризм
Философия
Финансы
Экология
Экономика
Этика и эстетика
Прочее