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-функций.
Больше работ по теме:
Предмет: Информационное обеспечение, программирование
Тип работы: Контрольная работа
Новости образования
КОНТАКТНЫЙ EMAIL: [email protected]
Скачать реферат © 2017 | Пользовательское соглашение
ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ