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

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.