Direct3D

Direct3D on tehnoloogiaettevõtte Microsoft loodud madala taseme graafika rakendusliides, mis on Windowsi operatsioonisüsteemides saadaval alates Windows 95 versioonist, osana DirectX-i rakendusliidete kogust. Direct3D avaldati osana DirectX 2-st. Direct3D aitab joonistada primitiive (nt punktid, jooned, pinnad),  kasutades renderdamise toru, ja on võimeline tegema kõrge paralleelsusega operatsioone graafikaprotsessori peal. Direct3D võimaldab teha edasijõudnud 3D-renderdamist ja kasutada riistvaralise kiirenduse teenuseid. Samuti võimaldab Direct3D anda arendajatele ligipääsu graafilistele võimalustele ja võimekustele, eriti suuremat võimsust vajavate lahenduste, näiteks mängude, animatsioonide ja filmide jaoks. 

Üldiselt toetavad uuema Direct3D versiooni toetavad riistvaralahendused ka vastavale versioonile eelnevaid Direct3D versioone, näiteks toetab mõni uuem graafikaprotsessor, millel on Direct3D 12 võimekus, ka vanemat Direct3D-d kasutavaid rakendusi, näiteks Direct3D 9 peale ehitatud rakendust. Oluline on seejuures märkida, et Direct3D 12 ise ei toeta Direct3D 9 rakendust, vaid riistvaraliselt on olemas Direct3D 9 tugi. Renderdamise toru toimimist võib visualiseerida kui jõge, millesse voolavad erinevad ojad, millest mõned osad on programmeeritavad, mõned on mõjutatavad. Direct3D sisaldab ka funktsionaalsust, et täita ülesandeid, mis pole seotud graafika kuvamisega, näiteks mahukad, paralleelsust vajavad arvutused. Nende ülesannete jaoks saab kasutada Direct3D arvutusvarjutaja (ing.k Compute Shader) võimalusi.

Direct3D põhiline konkurent on OpenGL ning selle järg Vulkan. Programme, mis kasutavad Direct3D rakendusliidest, võib olla võimalik kasutada ka teiste operatsioonisüsteemide peal läbi mõne emulaatori või ühilduvuskihi. Üks populaarsemaid ühilduvuskihte Windowsile kirjutatud tarkvara, kaasa arvatud Direct3D-d kasutavad rakendused, käivitamiseks POSIX operatsioonisüsteemidel on Wine. Wine, lühend sõnast Wine Is Not an Emulator, ei ole emulaator, kuna see tõlgendab Windowsi rakendusliideste käsud otse POSIXile sobivateks käskudeks. Aastast 2018 on olnud saadaval Valve'i arendatud Winel põhinev ühilduvuskiht Proton, mis erinevalt Wine'ist toetab ka Direct3D 12 ning on mõeldud eeskätt Steami mängude võimaldamiseks UNIX süsteemidel, kaasa arvatud Valve enda hiljutisel tootel Steam Deck, mis kasutab operatsioonisüsteemina Valve'i arendatud SteamOS-i.

Ülevaade versioonidest 

 Direct3D 2.0 – anti välja aasta 1996 juunis Windows 95-le. Arendati välja RenderMorphics tiimi poolt, kelle Microsoft ostis aastal 1995.
 Direct3D 3.0 – anti välja 1996. aasta septembris. Vähe erinevust 2.0-ga.
 Direct3D 4.0 – ei antudki välja.
 Direct3D 5.0 – avaldati aastal 1997. Windows 98 jaoks anti välja versioon 5.2 aastal 1998.
 Direct3D 6.0 – anti välja aastal 1998.
 Direct3D 7.0 – Saabus avalikule saadavusele aastal 1999, tõi endaga .dds (DirectDraw Surface) tekstuuride failitüübi toe. 
 Direct3D 8.0 – Väljalase aastal 2000. Olulise funktsionaalsusena tuli välja verteksi varjutajate (ing. k. vertex shader) ja piksli varjutajate (ing. k. pixel shader) programmeeritavus.
 Direct3D 9 – Tuli välja aastal 2002, üks olulistest uuendustest oli varjutaja mudel 2.0 (ing. k. Shader Model 2.0), mis sisaldus uusimas versioonis Microsofti HLSL-is (High Level Shader Language). Üks Direct3D 9 eesmärkidest oli võimaldada Windowsile mugavamat ja efektiivsemat mängude arenduse võimekust.
 Direct3D 9c – Loodi aastal 2004 Windows XP (SP2 ehk Service Pack 2) jaoks. Saadaval varjutaja mudel 3.0.
 Direct3D 9L – Loodi spetsiaalselt Windows Vista operatsioonisüsteemi jaoks.
 Direct3D 10 – anti välja aastal 2006. D3D10 (Direct3D 10 lühend) oli esimene Direct3D versioon, mis ei toetanud enam Windows XP-d ja varasemaid operatsioonisüsteeme kasutavaid platvorme. Direct3D 10 tõi endaga varjutaja mudeli 4.0, millel oli lisaks piksli ja verteksi varjutajatele ka geomeetria varjuaja (ing. k. geometry shader) aste. Alates Direct3D 10st on kõik Direct3D renderdamise toru astmed programmeeritavad HLSL keeles.
 Direct3D 11 – avaldati avalikkusele aastal 2009 koos Microsofti Windows 7 operatsioonisüsteemiga. D3D11 tõi endaga palju uut funktsionaalsust, kaasa arvatud arvutusvarjutaja tugi, mitme lõime paralleelse kasutuse (ing. k. multithreading) tugi, uued astmed renderdamise torus tessellatsiooni implementeerimiseks, Varjutaja Mudel 5.0, uuendatud tekstuuride funktsionaalsus ning võimekus kasutada ressursse, mille maht ületab 4 GB. Üks uutest tehnoloogiatest mis tuli D3D11-ga on Direct3D võimaluste tasemed (ing. k. feature levels), mille abil on võimalik luua rakendusi erinevatele Direct3D võimalusi toetavatele graafikaprotsessoritele. Määrates oma rakendusele võimaluste taseme, määrad sa riistvaralise miinimumi oma rakendusele, ehk 11_0 taseme funktsionaalsust kasutavat rakendust ei ole võimalik käivitada riistvaral, mis toetab maksimaalselt taset 10_1. Reeglina on kõrgema taseme toega riistvara alati võimeline jooksutama madalama taseme võimekust vajavat rakendust, näiteks, 9_3 taseme võimalusi kasutav rakendus käivitub ja jookseb ilma probleemideta riistvaral, mis toetab taset 12_2. Direct3D 11.0 toetab võimaluste tasemeid 9_1 kuni 11_0.
 Direct3D 11.1 – anti välja aastal 2012 operatsioonisüsteemi Windows 8 jaoks. Saadaval ka Windows 7-le läbi uuenduse. Tõi endaga võimaluste taseme 11_1. Lisainfo Direct3D 11.1 võimaluste kohta leiab inglise keeles siit.
 Direct3D 11.2 – anti välja aastal 2013 koos operatsioonisüsteemiga Windows 8.1. Täiendavat infot Direct3D 11.2 uue funktsionaalsuse kohta leiab inglise keeles siit.
 Direct3D 11.3 – tehti aastal 2015 operatsioonisüsteemile Windows 10, tõi veidi Direct3D 12 funktsionaalsust Direct3D 11 platvormile. Saabus Varjutaja Mudel 5.1 tugi. Täiendav info inglise keeles.
 Direct3D 12 – anti välja koos operatsioonisüsteemiga Windows 10 aastal 2015. Direct3D 12 on võrreldes varasemate versioonidega kiirem ja efektiivsem ning võimaldab arendajatele madalama taseme ligipääsu riistvara funktsionaalsusele. Direct3D 12 võimaldab arendajatel kirjutada läbi ühe rakendusliidese nii PC- kui ka Xbox One'i arvutitele. Direct3D 12 rakendus on ise vastutav oma mälukasutuse eest. Üks uutest võimalustest, mida D3D12 pakub, on nn käskude pakettide saatmine riistvarale, mis võimaldab riistvaral palju efektiivsemalt mitmeid käske paralleelselt täita. See erineb varasematest Direct3D versioonidest, kus suhtlus protsessori ja graafikaprotsessori vahel käis ühe käsu haaval ning graafikaprotsessor täitis neid käske ükshaaval.

Direct3D 9 
Direct3D 9 avaldamine aastal 2002 tõi endaga Microsofti poolt suurema pühendumuse videomängude arendajatele, nende eesmärk selle Direct3D versiooniga oli muuhulgas ka keskenduda mänguarendajate töö efektiivsemaks ja mugavamaks tegemisele. Direct3D 9 uus funktsionaalsus võrreldes varasemate versioonidega sisaldab muuhulgas ujukoma arvudega arvutamise tuge, varem oli toetatud vaid täisarvudega kalkulatsioonid. Palju uuendusi tehti ka varjutajate programmeerimise võimalustes, Direct3D 9 toetas võrreldes Direct3D 8-ga tunduvalt suuremal määral varjutajate programmeeritavust, kusjuures varjutajate programmeerimist oli võimalik teostada universaalselt arusaadavas Microsofti HLSL-is, milles kirjutatud koodi suutis NVIDIA loodud Cg (C for graphics) kompilaator kompileerida vastavale rakendusliidesele (Direct3D 8, Direct3D 9 või OpenGL) sobivaks masinkoodiks. Direct3D renderdamise toru avatus suurenes piksli ja verteksi varjutajate programmeeritavuse (Shader Model 2.0) tõttu tunduvalt.

Skeemil on välja toodud Direct3D 9 renderdamise toru astmed.

Direct3D 10 

Direct3D 10 väljalase aastal 2006 tõi endaga Windows XP operatsioonisüsteemi toe kadumise, väljalaskehetkel oli Direct3D 10 saadaval vaid Windows Vista operatsioonisüsteemil. Direct3D 10 riistvara standardid muutusid tunduvalt rangemaks võrreldes Direct3D 9-ga, muutes arendajate töö mugavamaks, kuna nad said olla kindlamad, et nende kirjutatud kood töötab eesmärgipäraselt ja stabiilselt mitmetel erinevatel riistvarakonfiguratsioonidel. Direct3D 10 toetab Varjutaja Mudel 4.0 (Shader Model 4.0) varjutajate funktsionaalsust. Varjutaja Mudel 4.0 toetab muuhulgas >=64000 instruktsiooni pesa, võrreldes Varjutaja Mudel 3.0 >=512 pesaga. Samuti on tugi kuni 8K x 8K 2D tekstuuride suurusele, võrreldes Varjutaja Mudel 3.0 2K x 2K maksimaalse tekstuuride suurusega. Kõik D3D10 renderdamise toru astmed on programmeeritavad HLSL-is. Renderdamise torusse on lisatud täiesti uus aste, geomeetria varjutaja aste, millega on võimalik protsessida terveid primitiive.

Direct3D 10 renderdamise toru on nähtav pildil. Toru astmeid, mis on kujutatud ümmarguste nurkadega kastides, on võimalik programmeerida kasutades Microsofti HLSL programmeerimiskeelt.

Sisend-assembler astme ülesanne on lugeda primitiivide andmeid (punktid, jooned ja/või kolmnurgad) kasutaja täidetud puhvritest ning koostada andmete põhjal primitiivid, mida saavad järgnevad toru astmed kasutada.

Verteksi varjutaja aste teostab sisendi astmest saadud verteksitega operatsioone. Verteksi varjutajad alati opereerivad ühe sisend-verteksi peal ning produtseerivad ühe väljund-verteksi. Verteksi varjutaja aste peab alati olema torus aktiivne, juhul, kui seda ei kasutata, peab siiski looma varjutaja, mis saadab sisendi väljundisse. Iga verteksi varjutaja sisend saab koosneda kuni 16st 32-bitilisest 4 komponendiga vektorist. Verteksi varjutaja aste on programmeeritav HLSL-is.

Geomeetria varjutaja astmes, erinevalt verteksi varjutajast (kus opereeritakse vaid ühe verteksi peal), on sisendiks primitiiv (üks verteks punkti puhul, kaks verteksit joone puhul või kolm verteksit kolmnurga puhul). Geomeetria varjutaja saab võtta sisendis juurde ka primitiiviga ühiseid külgi omavate primitiivide info. Geomeetria varjutaja astme väljundit saab saata kas Striim-väljundi astmesse või Rasterisaatori astmesse. Geomeetria varjutaja on programmeeritav HLSL-is.

Striim-Väljund aste tegeleb talle saadetud andmete pideva väljastamisega (striimimisega) puhvritesse mälus. Mällu striimitud andmeid saab saata kas uuesti toru algusest sisse, või saata kasutuseks mujale. Toetatud on kuni nelja puhvrisse korraga striimimine.

Rasterisaatori aste teostab vektor-informatsiooni (kujundid ja primitiivid) konversiooniga rasterpildiks, mis koosneb pikslitest. Rasterisatsiooni ajal muundatakse iga primitiiv piksliteks. Rasterisaator tegeleb ka verteks-infost perspektiivi loomisega, primitiivide info teiseldamisega kahedimensioonilisele vaatenurgale ning määratlemisega, mis moel rakendada piksli varjutajat.

Piksli varjutaja aste võimaldab rikkaid varjutuse võimalusi, näiteks piksli-kaupa valgustus ja järeltöötlus. Piksli varjutaja kombineerib konstandid, teksuurid, verteksite väärtused ja muud andmed et produtseerida piksli kaupa väljundeid. Piksli varjutaja aste on võimalik vahele jätta. Piksli varjutaja võtab kuni 32 32-bitist 4 komponendiga sisendit (16 tükki juhul kui geomeetria varjutaja aste jäeti vahele). Piksli varjutaja väljastab kuni 8 32-bitist 4 komponendiga värvi. Piksli varjutaja on programmeeritav HLSL-is

Väljund-Liitja aste genereerib lõpliku renderdatud piksli, kasutades kombinatsiooni renderdamise toru astmete väljundite andmetest ja puhvrites asetsevatest andmetest. Selles astmes otsustatakse, millised pikslis on nähtavad ning teostatakse viimased piksli värvide korrektuurid.

Direct3D 11 

Direct3D 11 avaldati aastal 2009 koos operatsioonisüsteemiga Windows 7. Direct3D 11 tõi esimese Direct3D versioonina arvutusvarjutaja, Compute Shader, toe, mille abil on võimalik kasutada Direct3D funktsionaalsust, et täita mitte-graafilisi arvutusi. Sarnaselt teiste varjutajatega saab seda varjutajat programmeerida HLSL-is, kuid seal sarnasused ka lõppevad. Arvutusvarjutaja suudab ära kasutada tänapäevaste graafikaprotsessorite suurt hulka paralleelseid protsessorituumi, et täita kiirelt erinevaid arvutusülesandeid. Direct3D 11 toob endaga Varjutaja Mudel 5.0-i, mis muuhulgas toetab varjutajate dünaamilist sidumist. Varem graafikaarendajad on pidanud looma kas väga suuri, kõike hõlmavaid varjutajaid või väga palju väikseid erinevaid varjutajaid erinevate riistvara ja muude muutujate muutumise tarvis. Varjutaja Mudel 5.0 lahendab selle probleemi läbi dünaamilise varjutajate sidumise, mis lisab objekt-orienteeritud programmeerimise elemente varjutajate programmeerimisele, et oleks lihtsam siduda varjutaja koodi fragmente omavahel läbi virtuaalsete funktsioonide, lubades rakendusel valida endale sobiliku fragmendi jooksmise ajal. See säästab ressursse, kuna pole vaja töötada läbi tervet suurt kõike hõlmavat varjutaja koodi. Samuti on alates D3D11-st toetatud protsessori mitme lõime paralleelne kasutus. Direct3D 11 tõi ka toe tessellatsiooni programmeerimiseks läbi varjutajate.

Direct3D 11 tõi renderdamise torule kolm uut astet, Kesta-varjutaja aste, Tessellatsiooni aste ja Domeeni-varjutaja aste. Kõigi kolme uue astme eesmärk on täiendada Direct3D tessellatsiooni võimekust. Skeemil on kolm uut astet märgitud teise värviga. Renderdamise toru üldine funktsionaalsus, välja arvatud tessellatsioon, ja astmete tööpõhimõtted on väga sarnane Direct3D 10 renderdamise torule.

Direct3D 12 
Direct3D 12 tuli välja aastal 2015 koos Windows 10-ga. Direct3D 12 on võrreldes varasemate versioonidega tunduvalt madalama taseme rakendusliides, andes arendajatele otsesema ligipääsu riistvara funktsionaalsusele. Direct3D 12 vähendab protsessori kasutust kuni 50%. Direct3D 12 renderdamise toru muudeti suuremahuliselt; Kui varem (D3D11 ja varasemad) oli renderdamise toru põhimõtteliselt ridamisi ühendatud blokid, mida sai individuaalselt programmeerida/mõjutada, mis on küll mugav kõrgetasemeline represenstatsioon graafiliste arvutuste toimumisest, kuid tänapäeval ei ühti enam eriti lähedalt reaalse graafikaprotsessori tööga. Direct3D 12 toob selle asemele Toru oleku objektid (ing. k. Pipeline state objects), mida on võimalik jooksvalt adapteerida riistvara vajadustele, nende objektide lõplik asetus ja ühenduvus finaliseeritakse lõplikult alles nende loomisel.

Viited