Peliohjelmointirajapinnoista

Samankaltaiset tiedostot
Peliohjelmointirajapinnoista

Windowsin sanomanvälitys. Juha Järvensivu 2007

Windowsin sanomanvälitys. Juha Järvensivu 2008

OpenGL:n perusteet - Osa 1: Ikkunan luominen

Winapi. Juha Järvensivu 2007

Kontrollilaitteet. Arsenaali

Peliohjelmointi: Kontrollilaitteet. Teppo Soininen

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2007

Sisällys. T Tietokonegrafiikan perusteet. OpenGL-ohjelmointi 11/2007. Mikä on OpenGL?

OpenGL:n perusteet - Osa 2: 3D grafiikka

Graafisen käyttöliittymän ohjelmointi Syksy 2013

Graafisen käyttöliittymän ohjelmointi

T Tietokonegrafiikan perusteet. OpenGL-ohjelmointi

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

CODEONLINE. Monni Oo- ja Java-harjoituksia. Version 1.0

TIES471 Reaaliaikainen renderöinti

Rajapinta (interface)

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2008

1 of

CUDA. Moniydinohjelmointi Mikko Honkonen

JWT 2016 luento 11. to klo Aulikki Hyrskykari. PinniB Aulikki Hyrskykari

Kiertokysely. Sulautetut järjestelmät Luku 2 Sivu 1 (??)

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Ohjelmoinnin peruskurssien laaja oppimäärä

TIETOKANNAT: MYSQL & POSTGRESQL Seminaarityö

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

Android ohjelmointi. Mobiiliohjelmointi 2-3T5245

Solidity älysopimus ohjelmointi. Sopimus suuntautunut ohjelmointi

Java-kielen perusteet

Tapahtumat. Johdanto Ikkunointi Ikkunatapahtumat Päätapahtumasilmukka Tapahtumien käsittely Olioiden välinen kommunikointi.

OHJELMOINTIA MONIPUOLISESTI MATEMATIIKAN OPETUKSESSA LUMA-PÄIVÄT, TAMPERE

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

ELM GROUP 04. Teemu Laakso Henrik Talarmo

Apuja ohjelmointiin» Yleisiä virheitä

Ohjelmoinnin perusteet Y Python

Microsoft Visual J++ ohjelmointiympäristö

Sovellusarkkitehtuurit

TIE Principles of Programming Languages. Seminaariesityksen essee. Ryhmä 18: Heidi Vulli, Joni Heikkilä

WINE API ja Virtualisointiohjelmistot

815338A Ohjelmointikielten periaatteet

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

7/20: Paketti kasassa ensimmäistä kertaa

Sisältö. 22. Taulukot. Yleistä. Yleistä

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

XPages käyttö ja edut Jarkko Pietikäinen toimitusjohtaja, Netwell Oy

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

Java-API, rajapinnat, poikkeukset, UML,...

Delegaatit ja tapahtumakäsittelijät

Ohjelmointi 2 / 2010 Välikoe / 26.3

Java ja grafiikka. Ville Sundberg

7. Näytölle tulostaminen 7.1

13/20: Kierrätys kannattaa koodaamisessakin

Javan perusteita. Janne Käki

You can check above like this: Start->Control Panel->Programs->find if Microsoft Lync or Microsoft Lync Attendeed is listed

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

15. Ohjelmoinnin tekniikkaa 15.1

Ohjelmoinnin peruskurssien laaja oppimäärä

15. Ohjelmoinnin tekniikkaa 15.1

Harjoitus 2: Oppijan aktivointi ( )

20. Javan omat luokat 20.1

VHDL/Verilog/SystemC. Jukka Jokelainen

Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang

17. Javan omat luokat 17.1

Olio-ohjelmointi Javalla

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

ASCII-taidetta. Intro: Python

12. Näppäimistöltä lukeminen 12.1

1. Omat operaatiot 1.1

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo

Testiraportti Android virtuaalikone vs. natiivikoodi Ville Laine, Delta 23

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

JReleaser Yksikkötestaus ja JUnit. Mikko Mäkelä

Sovelmat. Janne Käki

Lyhyt kertaus osoittimista

17. Javan omat luokat 17.1

Johdatus ohjelmointiin

Se mistä tilasta aloitetaan, merkitään tyhjästä tulevalla nuolella. Yllä olevassa esimerkissä aloitustila on A.

Sisältö. 2. Taulukot. Yleistä. Yleistä

Visual Basic -sovelluskehitin Juha Vitikka

Muutamia peruskäsitteitä

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

Ohjelmoinnin peruskurssien laaja oppimäärä

Alkuun HTML5 peliohjelmoinnissa

TIE Principles of Programming Languages CEYLON

Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.

Ruby. Tampere University of Technology Department of Pervasive Computing TIE Principles of Programming Languages

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 16.3

Sisällys. 16. Lohkot. Lohkot. Lohkot

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 15.3

Älypuhelimet. Sisällysluettelo

1. Olio-ohjelmointi 1.1

T Ohjelmistotekniikan seminaari

Rajapinnasta ei voida muodostaa olioita. Voidaan käyttää tunnuksen tyyppinä. Rajapinta on kuitenkin abstraktia luokkaa selvästi abstraktimpi tyyppi.

Pong-peli, vaihe Aliohjelmakutsu laskureita varten. 2. Laskurin luominen. Muilla kielillä: English Suomi

4. Lausekielinen ohjelmointi 4.1

S11-09 Control System for an. Autonomous Household Robot Platform

Tietotekniikan valintakoe

.NET ja C# Virtuaalikone. Common Language Infrastructure (CLI) Periaate. Etuja. Haittoja. Mikä on CLI. CLI standardin merkitys (CLS, Ecma)

Loppukurssin järjestelyt C:n edistyneet piirteet

Transkriptio:

Peliohjelmointi: Peliohjelmointirajapinnoista Teppo Soininen & Antti Puhakka Lähteet: www.opengl.org, OpenGL-spesifikaatio, Tietokonegrafiikka luentomoniste, MSDN, Introduction to 3D Game Programming with DirectX 9.0

Open Graphics Library Open Graphics Library (OpenGL) sai alkunsa 1992 SGI:n esittelemästä 3D rajapinnasta nimeltä IRIS GL OpenGL oli alkuaikoina tähdätty ammattikäyttöön tehovaatimustensa takia Windows NT 4.0:ssa oli OpenGL jo mukana (muistanette screensaverit joissa pyöri esim. kellonaika?) Grafiikkaraudan kehittyessä myös halvemmat viihdekäyttöön tarkoitetut laitteet kykenivät vastaamaan OpenGL:n tehovaatimuksiin Nykyään yksi eniten käytetty grafiikka API 2

OpenGL on alustariippumaton grafiikka API Sisältää ~150 funktiota Ei sisällä mitään toiminnallisuutta ikkunoinin tai syötteidenkäsittelyn toteuttamiseksi OpenGL:ää standardoi OpenGL Architecture Review Board (ARB) 3DLabs, Apple, ATI, NVIDIA, IBM, Intel, SGI, Sun Microsystems, HP OpenGL rajapinta löytyy muutamalle eri kielelle (C/C++, ADA, Fortran ja Java) OpenGL on käytännössä iso tilakone Yli sata globaalia tilamuuttujaa (on/off) 3

OpenGL 1.1:n tilakone 4

Ohjelmointinäkökulmasta OpenGL on kokoelma funktiota joiden avulla voi: Määritellä geometrisia 2D/3D objekteja jotka koostuvat kymmenestä perusprimitiivistä GL_POINTS GL_LINES, GL_LINESTRIP, GL_LINE_LOOP GL_TRIANGLES, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN GL_QUADS, GL_QUAD_STRIP GL_POLYGON Hallita määriteltyjen objektien piirtämistä frame bufferiin (transforamaatiot, valaistukset jne) glrotate(), gltranslate(), glscale()... 5

OpenGL:stä ei löydy funktioita monimutkaisten primitiivien (pallot, kuutiot jne) piirtämiseen Monimutkaisempien primitiivien piirtämiseen tehdään usein omat Mesh luokat Jotkut korkeammantason rajapinnat tarjoavat apuja monimutkaisempien muotojen piirtämiseen (yleensä hyödyttömiä testaamisen ulkopuolella) 6

OpenGL hoitaa piirtämisen moniosaisella pipelinella Jokaisessa osassa tehdään yksi primitiivien esittämiseen tarvittava vaihe OpenGL Visualization Programming Pipeline 7

OpenGL v1.5 (29.7.2003) Yksi merkittävimmistä uudistuksista tässä versiossa olivat BufferObjektit OpenGL v2.0 (7.9.2004) OpenGL Shader Language vakiona (aikaisemmin erillinen) Textuureja, joiden koko ei ole 2:n potenssissa, voidaan käyttää (virheettömästi!) 8

OpenGL tukikirjastot SGI pitää kirjaa OpenGL:ään tehdyistä kirjastoista ARB:n speksaamia kirjastoja n. 40 Muita kirjastoja tässä listassa on 300+ Käyttöjärjestelmien mukanan tulee kirjastoja ikkunoinnin hoitamiseen OpenGL:n kanssa GLX (Unix) WGL (Windows) AGL (Apple) 9

GL Utility Toolkit (GLUT) Tarjoaa tominnallisuutta mm. ikkunoinnille, menuille, syöttölaitteille ja joillekkin perus muodoille (esim. pallo ja kuutio) Soveltuu lähinnä pieniin OpenGL sovelluksiin Rutiinit cross-platform ominaisuuksiensa takia liian hitaita todelliseen tehokäytöön (esim. peleihin) -> yleensä käytetetään käyttöjärjestelmän omia ikkunointi menetelmiä (GLX, WGL) GLUT ei ole avointa lähdekoodia (Mark Kilgard omistaa oikeudet GLUT:iin) Uusin versio 2.7 10

Simple Directmedia Layer (SDL) Alustariippumaton grafiikka- ja multimediarajapinta, toimii Windowsissa, Linuxissa, Macissa, Solariksessa jne. jne. Toiminnallisuutta mm. 2D- ja 3D-grafiikka, audio, syötelaitteet (hiiri, näppis ja joystick), tapahtumat, timerit,... SDL on ohut wrapperikerros, joka kutsuu esim. OpenGLrutiineja Kirjoitettu alunperin C:llä Bindingeja löytyy ainakin seuraaville kielille: Ada, Eiffel, Java, Lua, ML, Perl, PHP, Pike, Python, Ruby 11

Bindingit lisäävät käytännössä kuitenkin yhden kerroksen lisää raudan ja koodin väliin josta seuraa hidastaa koodia (ei usein käytetä tehoa vaativissa sovelluksissa, kuten peleissä) Käytännössä SDL on (kuuleman mukaan) melko hyvä ja yksinkertainen Suosiota lisännyt SDL:n open source -lisenssi Uusin versio 1.2 12

Microsoft DirectX DirectX-rajapinnan kehittäminen aloitettiin Microsoftilla joskus 90-luvun alussa OpenGL:n tehovaatimuksiin pystyttiin vastaamaan ainoastaan kallilla ammattilais laitteistoilla Ideana kehittää viihdekäyttöön tarkoitettu vatine OpenGL:lle Microsoftin aloitti DOS:in hyllyttämisen Piti saada pelien kehittäjät siirtymään Windows ympäristöön Tarvittiin rajapinta jonka avulla pelejä voitiin tehdä 13

Pelikoodaajat olivat aluksi haluttomia siirtymään Windowsiin DOS:ssa koodaajat pääsivät käsiksi suoraan "rautaan" ja tämän ansiosta saatiin aikaan tehokasta koodia Windowsissa pääsi "rautaan" käsiksi vain WinAPI:n kautta (ei tehokasta) Microsoft yritti korjata tämän ongelman WinG rajapinnan avulla Rajapinta oli vaikea käyttää ja melko tehoton Civilization ja Civilization 2 tiettävästi kuitenkin käyttivät WinG API:a DirectX:n ensimmäisen verion kehittely aloitettiin 1994 ja sitä tuettiin Windows 95:stä eteenpäin 14

DirectX:n ensimmäiset versiot olivat erittäin kokeellisia ja hankalia käyttää OpenGL:n tehovaatimuksiin pystyttiin nyt vastaamaan kuluttajille sopivan hintaisilla 3D kalustolla ja tämä aiheutti vastarintaa; "miksi käyttää DX:ää kun hyvä vaihtoehto on jo olemassa?" DirectX 5 oli ensimmäinen joka saavutti enemmän hyväksyntää Nykyään DirectX:ää käytetään erittäin paljon viihteeseen suunnattujen sovellusten ohjelmoinnissa Laitteistovalmistajat tukevat todella hyvin XBox käyttää modifioitua DirectX 8 rajapintaa Pelejä: FarCry, Doom 3 15

Viimeisin versio on DirectX 9.0 DirectX on kokoelma ohjelmointirajapintoja pelien ja multimedian ohjelmointiin 1) DirectGraphics - 2D/3D piirtämiseen (yhdistetty DirectDraw ja Direct3D) 2) DirectInput - syöttölaitteiden käsittelyyn (tuki mm. force feedbackille) 3) DirectPlay - rajapinta verkkopelaamista varten o Ei saavuttanut koskaan erityisen suurta suosiota 4) DirectSound - äänenkäsittelyyn (waveform) 5) DirectMusic - pakatun musiikin toistamiseen (MIDI, DMusic Producer) o Toimii DirectSound:in päällä 6) DirectShow - multimedian toistoon, tallentamiseen ja käsittelyyn (mm. videostreamit) 16

o Perustuu erilaisten filtterien yhdistelemiseen 7) DirectSetup - DirectX:n asentamisen hoitava API 8) DirectX Media Objects - streamattavat mediaobjektit (enkooderit, dekooderit ja efektit) o Yksinkertaisempi käyttää kuin DirectShow DirectX:stä käytetään eniten Direct3D:tä Useimmat em. rajapinnoista aiotaan korvata Windows Vistan julkaisemisen jälkeen XInput, XACT, Media Foundation... Lisää tukea suojatulle sisällölle jne. 17

Direct3D Direct3D toiminta perustuu Hardware Abstraction Layeriin (HAL) Grafiikkakorttien valmistajat toteuttavat oman HAL:n DirectX:ää varten Direct3D Hardware Abstraction Layer 18

Kaikki mitä on nahdollista tehdä, tehdään "raudalla" Mikäli grafiikkakortti ei tue jotain toiminnallisuutta, sitä voidaan mahdollisesti simuloida ohjelmistollisesti Direct3D:n kautta voidaan kysellä tukea eri toiminnallisuuksille (erityisen tärkeää silloin jos jotain toiminnallisuutte ei voi simuloida ohjelmistollisesti) Direct3D on toimintaperiaatteeltaan hyvin samantapainen kuin OpenGL Piirrellään vertexeistä koottuja perusprimitiivejä ruudulle (TriangleFan, TriangleStrip, TriangleList, LineStrip, LineList, PointList) 19

Direct3D Fixed Function and Programmable Transformation and Lighting Pipeline Direct3D ei ole alustariippumaton joten sen rutiinit on tehty ainoastaan Winows mielessä Tästä johtuen Direct3D:ssä on joitain erikoisen tuntuisia piirteitä 20

Windows-ohjelmoinnista Käytettäessä suoraan Windows API:a grafiikkaohjelmointiin täytyy huolehtia itse ikkunoiden luomisesta, viestien käsittelystä jne. Jo pelkän Hello World -tyyppisen sovelluksen aikaansaamiseksi tarvitaan paljon koodia Perus-Windows-sovellus sisältää WinMain-pääohjelman, joka on muotoa int APIENTRY WinMain( HINSTANCE hinstance, HINSTANCE hprevinstance, LPSTR lpcmdline, int ncmdshow ) 21

Pääohjelma tekee yleensä ainakin seuraavat asiat: 1. Rekisteröi ikkunaluokan 2. Luo tähän luokkaan kuuluvan ikkunan 3. Tekee ikkunan näkyväksi ja asettaa sen päivittymään 4. Pyörii silmukassa, joka lukee viestejä sovelluksen viestijonosta, ja ohjaa viestit eteenpäin ikkunoiden viestinkäsittelijöille 5. Lopettaa ohjelman saatuaan WM_QUIT-viestin Ikkunaluokan ominaisuudet määrätään sijoittamalla arvoja WNDCLASS- tai WNDCLASSEX-tyyppisen struktin kenttiin 22

Strukti annetaan parametriksi RegisterClass- tai RegisterClassEx-funktiolle, joka rekisteröi luokan: // Create a WNDCLASSEX struct and fill its memory area with zeros WNDCLASSEX wc; ZeroMemory( &wc, sizeof( WNDCLASSEX ) ); // Fill in the needed members of the struct created above wc.cbsize = sizeof( WNDCLASSEX ); // size of the window struct in bytes wc.style = CS_HREDRAW CS_VREDRAW CS_OWNDC; // window styles to use wc.lpfnwndproc = MsgProc; // function name of event handler wc.hinstance = hinstance; // handle to this apps instance wc.hbrbackground = ( HBRUSH )GetStockObject( GRAY_BRUSH ); // background colour of window wc.hicon = LoadIcon( NULL, IDI_APPLICATION ); // icon for the app window wc.hiconsm = LoadIcon( NULL, IDI_APPLICATION ); // icon when minimized to taskbar wc.hcursor = LoadCursor( NULL, NULL ); wc.lpszclassname = strappname; // name for this class // Register the window class RegisterClassEx( &wc ); Itse ikkuna luodaan CreateWindow tai CreateWindowExfunktiolla, jolle annetaan ikkunaluokan nimi g_hwnd = CreateWindow( strappname, strappname, WS_OVERLAPPEDWINDOW, 10, 10, g_d3dsettings.m_ndevicewidth, g_d3dsettings.m_ndeviceheight, NULL, NULL, wc.hinstance, NULL ); ShowWindow( g_hwnd, ncmdshow ); UpdateWindow( g_hwnd ); 23

Funktio palauttaa HWND-tyyppisen kahvan luotuun ikkunaan o Samasta luokasta voi halutessaan luoda useamman ikkunan Pääsilmukka lukee viestejä PeekMessage-funktiolla o Vastaava GetMessage-funktio jää odottamaan että viestejä on jonossa // Create a MSG struct for the widows messages MSG msg; ZeroMemory( &msg, sizeof( msg ) ); // The windows message loop while ( msg.message!= WM_QUIT ) { // If messages need to be processed do it, otherwise enter game loop if ( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) ) { } else { TranslateMessage( &msg ); DispatchMessage( &msg ); GameLoop(); } } 24

DispatchMessage-funktio välittää viestit asianmukaisille ikkunoille o TranslateMessage muuttaa mm. ASCII-merkkeihin liittyviä näppäintapahtumaviestejä WM_CHAR-viesteiksi Jokaiselle ikkunaluokalle määritellään oma viestinkäsittelyfunktio, joka käsittelee ko. luokan ikkunoita koskevat viestit: LRESULT WINAPI MsgProc( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam ) Viesti voi olla esimerkiksi näppäimistöviesti tai WM_PAINT, joka tarkoittaa että ikkuna kaipaa päivittämistä 25

Käytettäessä perinteistä Windows GDI:tä (Graphics Device Interface) piirto ikkunaan tapahtuu siihen liittyvän Device Context:in (DC) kautta Device context sisältää tiedon kyseiseen ikkunaan tai laitteeseen liittyvistä parametreistä: o käytettävissä olevat grafiikkaobjektit, kuten kynät, bittikartat, fontit, värit o tausta, skaalaaminen, koordinaatistomuunnokset, leikkausalue (clipping region) jne. Kutsumalla BeginPaint-funktiota ikkunafunktio saa ikkunaan liittyvän device context:in sekä PAINTSTRUCT-tyyppisen struktin 26

tämän yksi kenttä on RECT-tyyppinen strukti, joka sisältää päivitettävän alueen vasemman yläkulman ja oikean alakulman koordinaatit hdc = BeginPaint( hwnd, &PaintStruct );... EndPaint( hwnd, &PaintStruct ); DC:n koko ikkunaan saa myös GetDC-kutsulla, ja piirtoalueen GetClientRect-kutsulla OpenGL-ohjelmoinnissa tarvitaan lisäksi DC:hen läheisesti liittyvä Rendering Context, johon piirtäminen tapahtuu o Tämän saa wglcreatecontext(hdc) -kutsulla, ja se aktivoidaan wglmakecurrent(hdc,hrc) -kutsulla DirectX toimii kuitenkin hieman eri tavalla, koska se perustuu Microsoftin COM-komponenttimalliin 27

DirectX ja COM DirectX perustuu Microsoftin Component Object Model:iin (COM) COM komponenteissa kantava idea on luoda komponentteja (olioita) jolta komponenttien käyttäjä pyytää jotain tiettyä interfacea käyttöönsä Yksi komponentti sisältää usein monta erillistä interfacea Komponenttien erilliset interfacet eivät pääse toistensa sisältämään tietoon tai toiminnallisuuteen käsiksi (muuten kuin normaaleja reittejä) Interfacet eivät muutu niiden julkaisun jälkeen 28

Kaikki COM komponenttien interfacet periytetään IUnknown interfacesta jolla on ainoastaan metodit: AddRef(), QueryInterface() ja Release() Object ja Interface käsitteet sekavia MS:n omassa jopa dokumentaatiossa In casual usage, an object may sometimes be referred to by the name of its principle interface. However, strictly speaking, the two terms are not interchangeable IUnknown Interface1 Interface2 COM Object 29

Toimintaperiaate: 1) Käyttäjä pyytää interfacen joltain COM komponentilta 2) Komponentti antaa pyydetyn interfacen käyttäjälle ja lisää omaa reference counttia AddRef() -metodilla jotta tietää montako interfacea siitä on tehty 3) Käyttäjä tekee saamallaan interfacella mitä haluaa 4) Käyttäjä ei tarvitse interfacea ja tuhoaa sen kaikille COM interfaceille yhteisellä metodilla Release() 5) Release() -metodin seurauksenä COM komponentti (jolta interface oli pyydetty) vähentää reference counttiaan, mikäli interface oli viimeinen käytössä oleva interface tästä komponentista, komponentti tuhotaan. Muuten siltä voi edelleen käyttää olemassaolevien osoittimien kautta. 30

Release() ja AddRef() metodien taustalla on muistinkulutuksen tehostaminen ja hallittavuuden parantaminen Tavallisimpia ongelmia peleissä on muistin vuotamisesta aiheutuva pelin kaatuminen (peleissä toistetaan usein samoja rutiineja erittäin usein) COM interfacen metodien paluuarvot ovat usein HREF tyyppisiä Kertovat boolean tyyppisesti (tosin moniarvoisesti) tuloksen laadusta Tyypillisiä arvoja ovat: S_OK, E_FAIL (S -> Success, E -> Error) DirectX:n funktiot ottavat tyypillisesti parametrikseen jonkin DX:n määrittelemän struktin, jonka jäseniä täytetään tarpeen mukaan 31

Esimerkki: luodaan IDirect3D9 interface ja pyydetään siltä IDirect3DDevice9 g_pd3d = Direct3DCreate9( D3D_SDK_VERSION );... result = g_pd3d->createdevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hwndtarget, D3DCREATE_HARDWARE_VERTEXPROCESSING, &d3dpp, g_pdevice ); LPDIRECT3D9 g_pd3dcopy = g_pd3d; g_pd3dcopy->addref();... g_pdevice->release(); g_pd3dcopy->release();... g_pd3d->release(); 32