DirectX. Использование возможностей по выводу графики
Использование DirectX для решения задач по выводу и обработке графики в Microsoft Windows. Описание используемых DirectX-функций. Исходный текст отлаженной программы. Техника работы с окнами. Результаты работы программы, составление алгоритма, листинг.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | контрольная работа |
Язык | русский |
Дата добавления | 18.05.2014 |
Размер файла | 226,0 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru
Содержание
Цель работы
Краткая теория
Описание используемых 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-функций.
Размещено на Allbest.ru
Подобные документы
Основы программирования графических приложений на основе DirectX для операционной системы Windows. Работа с различными интерфейсами. Описание некоторых функций, используемых для работы с Direct3D. Взаимосвязь между приложением, Direct3D и аппаратурой.
курсовая работа [156,2 K], добавлен 10.02.2015Пакет средств разработки DirectX под Microsoft Windows, характеристика наборов COM-совместимых объектов в его составе. Ключевые особенности версий, шейдерные языки. Описание основных используемых функций. Исходный код программы, примеры ее работы.
курсовая работа [422,2 K], добавлен 16.02.2015Ознакомление с интерфейсом, основными возможностями и преимуществами использования программы OpenGL - популярной библиотекой для работы с 2D и 3D графикой. Рассмотрение назначения, базовых компонент и правил инициализации программного движка DirectX.
презентация [19,4 K], добавлен 14.08.2013Общая характеристика основных и дополнительных возможностей графического стандарта OpenGL в области компьютерной графики. Исследование набора определенных инструментов и технологий DirectX, который используют разработчики игр и мультимедийных приложений.
реферат [160,8 K], добавлен 10.01.2012Разработка игрового "движка" с использованием языка C++ для написания кода, графического пакета DirectX9 для вывода графики. Использование физического "движка" PhysX для взаимодействия объектов. Технико-математическое описание задачи, листинг программы.
дипломная работа [4,5 M], добавлен 02.09.2013Основы работы с графиков средствами OpenGL в C#. Ее спецификации, принципы и возможности. Direct3D как самостоятельная часть библиотеки Microsoft DirectX, которая отвечает за графику и вывод графической информации. Независимость от языка программирования.
курсовая работа [2,1 M], добавлен 17.02.2013Основы программирования на 32-битном Ассемблере, разработка с его помощью программы, демонстрирующей работу одного из разделов ОС Windоws. Описание используемых АРI-функций как интерфейса программирования приложений. Листинг программы, результаты работы.
курсовая работа [164,5 K], добавлен 18.05.2014Алгоритм побудови лінії та використання графічної бібліотеки DirectX. Способи побудови довільної кількості довільного розміру точок на поверхні форми. Можливості комп'ютера виконувати мультимедійні програми під управлінням операційної системи Windows.
контрольная работа [416,9 K], добавлен 22.10.2009Разработка алгоритма и программы, обеспечивающей вычисление максимального значения функции на заданном отрезке, первой производной заданной функции. Методика расчёта, алгоритм решения задачи, описание программы. Результаты расчётов и графики функций.
курсовая работа [576,6 K], добавлен 17.05.2011Разработка программы, которая создает в отдельном потоке случайный массив целых чисел в заданном диапазоне и выводит на экран эти числа. Описание общего алгоритма, интерфейс программы. Методы решения и алгоритмы задач, реализуемых каждым потоком.
курсовая работа [372,6 K], добавлен 17.04.2014