Що таке DirectX? Відповідь на це запитання дамо такою цитатою. DirectX - це набір низькорівневих програмних інтерфейсів (АРІ) для створення ігор та інших швидкісних мультимедійних програм. Розробником DirectX є Microsoft.
Надамо загальний перелік основних компонентів DirectX та їхнє призначення.
Direct3D — підтримка 3D-графіки.
DirectАпітаtіоп — створення анімаційних ефектів.
DirectDraw — швидка двовимірна графіка на основі прямого доступу до відеопам'яті.
DirectInput — підтримка периферійних пристроїв -- джойстика, миші, клавіатури тощо.
DirectXMusic — обробка музичних даних.
DirectРІау — модемна комунікація й мережні інтерфейси програмування ігор.
DirectSetup — простий АРІ для встановлення компонентів DirectX.
DirectShow — відтворення ущільнених аудіо- та відеоданих.
DirectSound — програмування звуку і його відтворення.
Тут необхідно зауважити, що склад компонентів та їхні назви змінюються відповідно до версій DirectХ.
Можна відзначити швидку зміну версій DirectХ (особливо їхніх номерів). Суттєвим моментом є сумісність — програми, що розроблені для старих версій, коректно виконуються у середовищі нових версій DirectХ.
Поява DirectХ пов'язується із ОС Windows 95 OSR2. Окрім підтримки ігрових та мультимедійних програм, DirectХ інтегрується в операційну систему для її внутрішніх потреб, наприклад, для підтримки графічного інтерфейсу користувача. Кожна наступна версія Windows, як правило, постачається з відповідною версією DirectХ, проте, передбачена можливість встановлення нових версій DirectХ і на старі операційні системи.
Зробимо короткий огляд версій DirectХ. Розпочнемо із сьомої версії. Можна зазначити, що DirectХ 7 забезпечив доступ до усіх апаратних можливостей графічних процесорів сучасних відеоадаптерів (геометричні розрахунки, освітлення, мультитекстурування та bump-текстури, антіаліасінг тощо). Багато комп'ютерних ігор використовували інтерфейси DirectDraw та Direct3D сьомої версії. Проте, впровадженню DirectХ 7 у широку практику програмістів заважала надзвичайна складність програмування цього інтерфейсу. Багато хто віддавав перевагу OpenGL, що має набагато простіший та зрозуміліший інтерфейс (і це незважаючи на те, що Microsoft у своїх операційних системах явно робить преференцію для DirectХ).
З появою графічних процесорів, які підтримують шейдери (наприклад, АТІ Radeon 8500), стає актуальним удосконалення DirectХ. Вже гостро відчувається обмеженість фіксованого конвеєра графічних команд, DirectХ повинен забезпечити доступ до програмованого конвеєра шейдерних мікропрограм GPU.
Восьма версія DirectХ (кінець 2000 р.) була значним кроком еволюції. З'явилася не тільки підтримка шейдерів, але суттєво змінилася загальна архітектура DirectХ. Зі складу DirectХ зник DirectDraw, і замість Direct3D зявився DirectX Graphics, який містить також функції колишнього DirectDraw. Завдяки цьому суттєво спростився інтерфейс для програмістів.
Версія DirectX 8.1 постачається у складі Windows XP та інших сучасних ОС. Основні відмінності від попередньої версії 8.0 – подальший розвиток шейдерних можливостей. Проте, мова програмування шейдерів є асемблероподібною й, отже, недуже зручною.
Наприкінці 2003 року з'явився DirectX 9. Головна відмінність – високорівнева мова програмування шейдерів.
Як дізнатися, яку версію DirectX встановлено на вашому комп’ютері? Для цього запустіть програму DxDiag.exe. ця програма знаходиться у папці Windows\System або Windows\System32 (у залежності від ОСWindows). Для отримання інформації про апаратні можливості вашого відеоадаптера ви можете використати таку програму, як 3DMark.
Є можливість оновлювати DirectX на комп’ютері. Для цього можна встановити необхідні файли, які поділяються на дві частини: runtime-файли і SDK (Software Developr Kit). Для розробки програм необхідні усі файли, а для запуску програм DirectX досить лише runtime-файлів.
SDK DirectX містить усі файли, необхідні для розробки програм, у першу чергу, це – файли заголовків (*.h) та бібліотеки для компіляторів (*.lib). крім того, до складу SDK також входить ряд прикладів програм та документація для розробки.
Приклад файлу форми Delphi3 для побудови сфери:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
OpenGL, Menus;
type
TfrmGL = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure FormResize(Sender: TObject);
procedure FormKeyPress(Sender: TObject; var Key: Char);
private
DC : HDC;
hrc: HGLRC;
ry : GLfloat;
tx : GLfloat;
end;
var
frmGL: TfrmGL;
mx,my:byte;
implementation
uses DGLUT;
{$R *.DFM}
procedure TfrmGL.FormPaint(Sender: TObject);
begin
glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glPushMatrix;
glScalef (my/mx, my/mx, my/mx);
glRotatef (ry, 0.0, 1.0, 0.0);
glTranslatef (tx, 0.0, 0.0);
glutSolidSphere (1.5, 20, 20);
glScalef (mx/my, mx/my, mx/my);
glPopMatrix;
SwapBuffers(DC);
end;
procedure SetDCPixelFormat (hdc : HDC);
var
pfd : TPixelFormatDescriptor;
nPixelFormat : Integer;
begin
FillChar (pfd, SizeOf (pfd), 0);
pfd.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
nPixelFormat := ChoosePixelFormat (hdc, @pfd);
SetPixelFormat (hdc, nPixelFormat, @pfd);
end;
procedure TfrmGL.FormCreate(Sender: TObject);
begin
DC := GetDC (Handle);
SetDCPixelFormat(DC);
hrc := wglCreateContext(DC);
wglMakeCurrent(DC, hrc);
glClearColor (0.5, 0.5, 0.75, 1.0);
glLineWidth (1.5);
glEnable (GL_LIGHTING);
glEnable (GL_LIGHT0);
glEnable (GL_DEPTH_TEST);
glEnable (GL_COLOR_MATERIAL);
glColor3f (1.0, 0.0, 0.0);
ry := 0.0;
tx := 0.0;
mx:=10;
my:=10;
end;
procedure TfrmGL.FormDestroy(Sender: TObject);
begin
wglMakeCurrent(0, 0);
wglDeleteContext(hrc);
ReleaseDC (Handle, DC);
DeleteDC (DC);
end;
procedure TfrmGL.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
If Key = VK_ESCAPE then Close;
If Key = VK_LEFT then begin
ry := ry + 2.0;
InvalidateRect(Handle, nil, False);
end;
If Key = VK_RIGHT then begin
ry := ry - 2.0;
InvalidateRect(Handle, nil, False);
end;
If Key = VK_UP then begin
tx := tx - 0.1;
InvalidateRect(Handle, nil, False);
end;
If Key = VK_DOWN then begin
tx := tx + 0.1;
InvalidateRect(Handle, nil, False);
end;
end;
procedure TfrmGL.FormResize(Sender: TObject);
begin
glViewport(0, 0, ClientWidth, ClientHeight);
glMatrixMode (GL_PROJECTION);
glLoadIdentity;
glFrustum (-1, 1, -1, 1, 2, 9);
glMatrixMode (GL_MODELVIEW);
glLoadIdentity;
glTranslatef(0.0, 0.0, -5.0);
glRotatef(30.0, 1.0, 0.0, 0.0);
glRotatef(70.0, 0.0, 1.0, 0.0);
InvalidateRect(Handle, nil, False);
end;
procedure TfrmGL.FormKeyPress(Sender: TObject; var Key: Char);
begin
if key = '-' then mx:=mx+1;
if key = '+' then mx:=mx-1;
InvalidateRect(Handle, nil, False);
end;
end.
Список використаної літератури
1. Тихомиров Ю. В. Программирование трехмерной графики в Visual C++. - Санкт-Петербург, 1998.
2. Майкл Янг. Программирование графики в Windows 95: Векторная графика на языке С++. 1997.
3. Шикин А. В., Боресков А. В. Компьютерная графика. Динамика, реалистические изображения. 1998.
4. Конспект лекцій.