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

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

OpenGL:n perusteet - Osa 2: 3D grafiikka

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2007

T Tietokonegrafiikan perusteet. OpenGL-ohjelmointi

Ohjelmointikielet ja -paradigmat 5op. Markus Norrena

Graafisen käyttöliittymän ohjelmointi Syksy 2013

Graafisen käyttöliittymän ohjelmointi

TIES471 Reaaliaikainen renderöinti

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

Rajapinta (interface)

Tapahtumapohjainen ohjelmointi. Juha Järvensivu 2008

CUDA. Moniydinohjelmointi Mikko Honkonen

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++?

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

Ohjelmoinnin peruskurssien laaja oppimäärä

TIETOKANNAT: MYSQL & POSTGRESQL Seminaarityö

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

Solidity älysopimus ohjelmointi. Sopimus suuntautunut ohjelmointi

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

Android ohjelmointi. Mobiiliohjelmointi 2-3T5245

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ä

Java-kielen perusteet

Microsoft Visual J++ ohjelmointiympäristö

WINE API ja Virtualisointiohjelmistot

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

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

7/20: Paketti kasassa ensimmäistä kertaa

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

Java ja grafiikka. Ville Sundberg

Ohjelmointi 2 / 2010 Välikoe / 26.3

Ohjelmoinnin perusteet Y Python

7. Näytölle tulostaminen 7.1

Sovellusarkkitehtuurit

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

Javan perusteita. Janne Käki

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Harjoitus 2: Oppijan aktivointi ( )

15. Ohjelmoinnin tekniikkaa 15.1

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

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

Ohjelmoinnin peruskurssien laaja oppimäärä

15. Ohjelmoinnin tekniikkaa 15.1

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

ASCII-taidetta. Intro: Python

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

Delegaatit ja tapahtumakäsittelijät

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

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

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

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

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

Muutamia peruskäsitteitä

Visual Basic -sovelluskehitin Juha Vitikka

Integrointi. Ohjelmistotekniikka kevät 2003

Johdatus ohjelmointiin

TIE Principles of Programming Languages CEYLON

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

Alkuun HTML5 peliohjelmoinnissa

Ohjelmoinnin peruskurssien laaja oppimäärä

20. Javan omat luokat 20.1

815338A Ohjelmointikielten periaatteet

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

Java kahdessa tunnissa. Jyry Suvilehto

VHDL/Verilog/SystemC. Jukka Jokelainen

13/20: Kierrätys kannattaa koodaamisessakin

Älypuhelimet. Sisällysluettelo

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

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

17. Javan omat luokat 17.1

T Ohjelmistotekniikan seminaari

1. Olio-ohjelmointi 1.1

Tietotekniikan valintakoe

Ohjeissa pyydetään toisinaan katsomaan koodia esimerkkiprojekteista (esim. Liikkuva_Tausta1). Saat esimerkkiprojektit opettajalta.

4. Lausekielinen ohjelmointi 4.1

Loppukurssin järjestelyt C:n edistyneet piirteet

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

Tech Conference Visual Studio 2015, C#6,.NET4.6. Heikki Raatikainen. #TechConfFI

Rajapinnat ja olioiden välittäminen

JS-kehitys - yleiskuvaus. TIEA255 - Juho Vepsäläinen

C# ja.net. Juha Järvensivu 2007

Osio 4: Graafinen käyttöliittymä

Olio-ohjelmointi Javalla

Oliot viestivät metodeja kutsuen

1. Omat operaatiot 1.1

Testiraportti Android virtuaalikone vs. natiivikoodi Ville Laine, Delta 23

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) OpenGL 1.1:n tilakone 3 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()... 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) 5 6 OpenGL hoitaa piirtämisen moniosaisella pipelinella Jokaisessa osassa tehdään yksi primitiivien esittämiseen tarvittava vaihe 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!) OpenGL Visualization Programming Pipeline 7 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) 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 9 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 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 11 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ä 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 13 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 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) 15 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 Direct3D Direct3D toiminta perustuu Hardware Abstraction Layeriin (HAL) Grafiikkakorttien valmistajat toteuttavat oman HAL:n DirectX:ää varten 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. Direct3D Hardware Abstraction Layer 17 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) 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ä 19 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 ) 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 21 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 ); 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 ) ) { 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 ); } } else { } TranslateMessage( &msg ); DispatchMessage( &msg ); GameLoop(); 23 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ä 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 25 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 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 27 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 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. Interface2 COM Object 29 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 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(); 31 32