PDA

View Full Version : [C++]Librerie grafiche


Mattyfog
31-08-2008, 21:25
Ciao,

lo so, in questo periodo sto prendendo troppe inizative :D (impare il C# 3o4 programmini da sviluppare ecc) e devo riordinarmi le idee in testa.
Ma c'è una cosa che è da tempo che cerco bene di capire girando su internet:
come posso creare videogiochi?
So che ci sono le OpenGL (che sono multipiattaforma) e le Direct (solo per Windows) oltre a un sacco di altre librerie grafiche (tra cui mi incuriosiva: http://gdk.thegamecreators.com/ va che grafica!!! anche se so che ci vogliono anni per riuscirci!!!:D ) .
Ora mi pongo 2 domande principalmente:
- programmo in C++ o in C#? So che di solito si usa il C++ per le librerie grafiche, mentre non so neanche se ce ne sono altre oltre alle direct (almeno penso) supportate dal C#!!!
- che librerie grafiche uso?

Infinite grazie per l'aiuto e il continuo supporto che mi state dando da quando mi sono iscritto.

Ciao!!!

Bonfo
31-08-2008, 22:05
Diciamo che lato Personal computer il mondo si divide in due come hai detto tu:
- OpenGL
- DirectX

OpenGL è cross-platform mentre DirectX no. Il GDK che hai segnalato tu è solo un "layer" costruito sopra le DirectX, quindi non lo prendo in considerazione (per adesso).

Entrambe possono essere progammate in tutti i linguaggi. Diciamo che entrambe sono un-managed, quindi se le vuoi usare su C# devi prima wrapparle in del codice managed. Se questa ultima frase non l'hai capita è bene che chiedi :D
Per esempio puoi programmare le OpenGL anche in Java, ma ti devi scricare il "wrapper" JOGL.

Questo però è la strada lunga, ma forse anche più soddisfacente. Altrimenti si può andare in modo molto più semplice con engine e toolkit già precostituiti.
Per il mondo Microsoft consiglio vivamente XNA: un ottimo punto di partenza. In questo senso puoi usare anche il GDK.

Se hai altre domande falle.... forse qualcuno risponderà ;)

Mattyfog
01-09-2008, 07:41
ciao grazie per la risposta,

Diciamo che entrambe sono un-managed, quindi se le vuoi usare su C# devi prima wrapparle in del codice managed. Se questa ultima frase non l'hai capita è bene che chiedi
allora chiedo: che vuol dire?

Per il mondo Microsoft consiglio vivamente XNA

cos'è l'XNA? un'altre roba tipo dark GDK?

d0c1Le.Killah
01-09-2008, 10:36
Ciao...
se posso dare la mia opinione, senza nessun dubbio punterei sulla coppia C++/OpenGL... Come tu dicevi, opengl è multipiattaforma e open, quindi ad esempio un lavoro accademico avrebbe molto più valore. se devi programmare un videogioco, sicuramente la velocità e le prestazioni di c++ sono la soluzione migliore... ovviamente dipende da quanto tempo vuoi sbatterci la testa e da quale sia il tuo fine (in teoria un giochino stupido lo fai pure in flash, tanto x dire una fesseria :D )

Mattyfog
01-09-2008, 10:50
ciao grazie,

il punto è che a vedere le Direct si direbbe che i giochi abbiano una grafica migliore e mi chiedevo se questo fosse per le direct sono più potenti o perchè ci sono più persone in ambito professionale che le usano rispetto alle OpenGL. aiutatemi anche qui!!!:D
poi perfavore rispondete anche alle altre domande:

ciao grazie per la risposta,
Quote:
Diciamo che entrambe sono un-managed, quindi se le vuoi usare su C# devi prima wrapparle in del codice managed. Se questa ultima frase non l'hai capita è bene che chiedi
allora chiedo: che vuol dire?
Quote:
Per il mondo Microsoft consiglio vivamente XNA
cos'è l'XNA? un'altre roba tipo dark GDK?

grazie a tutti
ogni aiuto risposta parere ed opinione sono bene accetti!!!

d0c1Le.Killah
01-09-2008, 11:15
Le openGL sono più usate dalla comunità open-source. Se vuoi imparare a programmare per lavorare poi in una azienda, credo proprio che la conoscenza di DirectX sia più richiesta. OpenGL richiede forse più "sbattimento", ma ti permette di gestire più a basso livello e c'è molta più documentazione online...
insomma la diatriba è complessa (per non parlare dei soliti discorsi etici e di w w l'open source). come ho letto una volta da qualche parte, la cosa migliore è scegliere in base agli obiettivi.
Io personalmente sto usando OpenGL, e lo faccio perchè utilizzo librerie opensource che si poggiano su esso. Inoltre credo che in ambito accademico-scientifico possa essere più apprezzato (il cross-platform in quei contesti credo sia indispensabile).

Spero di esserti stato utile. Ti consiglio di cercare un po' su google i vari confronti tra GL e DirectX, provando a leggere anche quelli schierati prima con uno, poi con l'altro.

Mattyfog
01-09-2008, 11:20
ok,

ma con

le opengl richiedono più sbattimento

stai dicendo che sono più difficili?
e poi è vero o no che sono meno potenti (ossia i risultato grafici sono più scadenti)?

d0c1Le.Killah
01-09-2008, 11:34
Non conosco la sintassi di directx, ma mi risulta che sia di più facile apprendimento.

Per saperne di più leggiti questo articolo (inglese):


http://en.wikipedia.org/wiki/Comparison_of_OpenGL_and_Direct3D


Se non sai usarle come si deve, sicuramente i risultati grafici saranno scadenti... :D

Mattyfog
01-09-2008, 11:40
Se non sai usarle come si deve, sicuramente i risultati grafici saranno scadenti...

comunque leggendo, correggetemi se sbaglio, ho letto che le openGl sono usate in ambito professionale mentre le direct sono usate nei videogiochi (e questo è ciò che mi interessa).
Solo il fatto che non siano compatibili con linux e che le openGL mi sembrano più usate da programmatori singoli nei vari forum (forse è una cazzata stratosferica!!!:D ) mi lascia perplesso.
Ora vado a leggere

d0c1Le.Killah
01-09-2008, 11:46
Generalizzando si. Le varie software house si stanno spostando un poco verso le OpenGL, ma in realtà tutti i videogiochi a cui tu giochi probabilmente sono fatti con DirectX. Ovviamente un videogioco fatto con questa piattaforma non ti partirà mai sotto linux (anche se ho letto di tool automatici di conversione, chissà che non funzionino bene...)

Mattyfog
01-09-2008, 11:51
per windows so che c'è il progetto wine che dovrebbe reimplementare le API windows ma mi pare abbia ancora molta strada da fare.
L'articolo me lo leggo un po' per volta perchè l'inglese per il momento non lo capisco benissimo.
Ti pongo ancora delle domande:
- usando le direct si possono rilasciare programmi opensource (penso di si ma non si sa mai)
- è vero che ci vuole tanto tempo prima che si diffondano ma ha senso imparare del direct 9 quando sono uscite le 10?

d0c1Le.Killah
01-09-2008, 11:56
Io non ne ho idea... :mbe:
Aspettiamo risp dagli altri ke sn curioso anche io ora.
In ogni caso, se vuoi rilasciare codice tuo, a rigor di logica, puoi farlo liberamente. Ciò che tocchi di DirectX sono i prototipi di funzione, le interfacce, non la loro implementazione...
Non so che cambia con la v10 di DirectX...

Mattyfog
01-09-2008, 11:57
ok aspettiamo,
intanto grazie infinite!!!!
penso che nel pomeriggio qualcuno si farà sentire.

Mattyfog
01-09-2008, 14:54
please help me!!!

Mattyfog
01-09-2008, 19:41
scusate se continuo a scrivere per riportare in alto la discussione ma vorrei iniziare già domani a studiare!!!

DanieleC88
01-09-2008, 20:12
Lascia stare il discorso del "si vede meglio", dipende tutto da come le si utilizzano le librerie grafiche: sia OpenGL che Direct3D sono di ottimo livello.

Per il mio modestissimo parere, anche se in passato ho usato solo OpenGL, ti direi di provare ad accoppiare C# e DirectX. Questo perché col C# ti eviti un po' di grattacapi che non sono mai d'aiuto per fare videogames e perché DirectX ti fornisce tutto il necessario per visualizzare elementi grafici, riprodurre elementi sonori e reagire agli input (OpenGL è esclusivamente una libreria grafica: per tutto il resto dovresti imparare ad usare altre librerie).

E comunque datti tregua :D

Mattyfog
01-09-2008, 20:45
ok,



Entrambe possono essere progammate in tutti i linguaggi. Diciamo che entrambe sono un-managed, quindi se le vuoi usare su C# devi prima wrapparle in del codice managed. Se questa ultima frase non l'hai capita è bene che chiedi

cosa sarebbe???

e poi ancora una domanda:
forse non è meglio usare c++ e il dark GDK che dovrebbe semplificare un po' la storia con le directX?

DanieleC88
01-09-2008, 21:17
Per quanto riguarda il codice managed, si tratta di codice che non viene compilato in un binario eseguibile nativamente dalla macchina, ma in un binario "intermedio" che viene gestito da una virtual machine (è il caso ad esempio del C# con il framework .NET). Siccome DirectX ed OpenGL sono pensati per codice che sia nativo, hai bisogno di accedervi tramite dei "wrapper" che facciano da tramite tra il codice managed e quello unmanaged.
Per DarkGDK invece non saprei, non l'ho mai usato. :boh:

ciao ;)

Mattyfog
01-09-2008, 21:42
allora pongo le ultime domanda prima di arrivare alle conclusioni:
- con l'uscita delle DirectX 10, ha senso imparare le 9? Io non ho una sheda video compatibile con le 10, quindi o 9 o niente. Se non sbaglio le 10 supportano comunque le 9, però non vorrei mai andare a finire in un vicolo ceco.
- tu mi hai proposto il C# perchè più semplice in alcune cose, io non so usare i wrapper e quindi non so se sia difficile, quindi la domanda è: se io mi semplifico un po' la vita con il C# ma me la complico con i wrapper non è che bilanciamo la cosa?
- infine se è ver che il codice deve essere "passato" tramite macchina virtuale non è che si ha un rallentamento del gioco?

||ElChE||88
01-09-2008, 21:44
Vuoi un consiglio?

Prova XNA. :)

http://en.wikipedia.org/wiki/Microsoft_XNA

Mattyfog
01-09-2008, 22:13
sapresti darmi un riferimento in italiano?
e poi sapresti rispondere anche a qualcuna delle altre domande?

grazie infinite

ps: riguardo alla programmazione C# con XNA ho letto questo su un forum:


> Quali sono le problematiche?

Le prestazioni, inferiori a quelle del C++ compilato. (*) Dal punto di
vista grafico non è un grossissimo problema (ci pensa la libreria), ma,
non essendoci un supporto per la fisica interno a XNA, è un problema se
ti serve la fisica o altro tipo di calcolo pesante.

Mattyfog
02-09-2008, 09:27
quando rispodete date un occhio anche alla pagina precedente ci sono domande importanti anche li (a cui nessuno a risposto...):D

DanieleC88
02-09-2008, 10:34
allora pongo le ultime domanda prima di arrivare alle conclusioni:
- con l'uscita delle DirectX 10, ha senso imparare le 9? Io non ho una sheda video compatibile con le 10, quindi o 9 o niente. Se non sbaglio le 10 supportano comunque le 9, però non vorrei mai andare a finire in un vicolo ceco.
- tu mi hai proposto il C# perchè più semplice in alcune cose, io non so usare i wrapper e quindi non so se sia difficile, quindi la domanda è: se io mi semplifico un po' la vita con il C# ma me la complico con i wrapper non è che bilanciamo la cosa?
- infine se è ver che il codice deve essere "passato" tramite macchina virtuale non è che si ha un rallentamento del gioco?
se non puoi fare altro, impara le 9 e poi rivedi solo le differenze tra le API (le 10 offriranno qualcosa in più e un po' di cose leggermente diverse, ma i principi saranno gli stessi). i wrapper sono solo un tramite, per farti un esempio, invece che glVertex3f() chiamerai nomewrapper.glVertex3f(), e magari nemmeno di quello hai bisogno. un certo rallentamento nel codice managed c'è, ma se devi sviluppare Assassin's Creed ha un senso porsi il problema, se il massimo che devi fare è un giochino 3D che usa un centinaio di poligoni e altrettante texture non hai di che preoccuparti.

Mattyfog
02-09-2008, 10:47
solo che il C# in videogiochi mi lascia alquanto perplesso. So che il C++ si usa molto di più...
la roba che mi complicherebbe la vita con il C++ sono i problemi di allocazione memoria?

DanieleC88
02-09-2008, 10:59
Sì, principalmente, poi anche la sintassi che è un po' meno "immediata" del C#, etc. Piccole cose, che però non ti sono d'aiuto.

Comunque non preoccuparti del linguaggio che l'industria dei videogames predilige, tu devi prima imparare a fare un videogame, e poi a farlo in un certo linguaggio. Il C++ puoi sempre impararlo anche in seguito. ;)

E poi, come ti dicevo, per quello che si fa "professionalmente" le performance sono un must, per quello che immagino starai per affrontare tu non ce n'è proprio bisogno, i PC di oggi sono abbastanza potenti da farti sviluppare un gioco "come si deve" anche in C#, e senza perdite prestazionali "sensibili".

ciao ;)

Mattyfog
02-09-2008, 11:02
benissimo convinto in pieno!!!
senti mi sapresti ancora dire una guida dalla quale incominciare??? (possibilemnte in italiano).
io non so niente sulla grafica (non so quali programmi usare per creare i personaggi, non ho ben chiari i concetti di texxture e altri, e non so benissimo come funziona...).

ps: cambia qualcosa tra DirectX e Direct3D???

Mattyfog
02-09-2008, 17:59
... :D

variabilepippo
02-09-2008, 18:06
Sono dell'opinione che sviluppare un gioco, soprattutto 3D, non sia una delle priorità che un programmatore alle prime armi dovrebbe porsi.

Prima di preoccuparsi di OpenGL, DirectX, XNA, nozioni matematiche necessarie, game design, software di modellazione 3D, ..., si dovrebbe imparare BENE (MOLTO BENE) un linguaggio di programmazione: sintassi, uso delle strutture dati avanzate messe a tua disposizione, libreria standard, tecniche di progettazione, uso/implementazione di librerie esterne, etc.

Un po' come per le case, non si può pensare di costruire il tetto (=game programming) se non si sono ancora gettate le fondamenta e tirati su i pilastri portanti. ;)

DanieleC88
02-09-2008, 20:37
Prima di preoccuparsi di OpenGL, DirectX, XNA, nozioni matematiche necessarie, game design, software di modellazione 3D, ..., si dovrebbe imparare BENE (MOLTO BENE) un linguaggio di programmazione
Notare il MOLTO BENE. :D

Be' sì che c'è differenza, Direct3D (che si occupa del rendering tridimensionale) è solo una delle componenti di DirectX, che invece comprende praticamente tutto ciò di cui c'è bisogno nello sviluppo di applicazioni multimediali (non solo videogames).
Guarda, non saprei consigliarti delle buone guide perché in passato ho sempre usato OpenGL, ma sono sicuro che con un po' di ricerca sarai in grado di trovarne di semplici e ben curate. Ti consiglierei magari, prima di buttarti su Direct3D, di fare un piccolo gioco in 2D, utilizzando DirectDraw, per entrare nella logica del gioco, e poi magari di fare qualcosa di più avanzato in 3D. Guarda che è un argomento tosto, non voglio scoraggiarti, ma il paragone della casa fatto da variabilepippo calza a pennello. :D

ciao ;)

variabilepippo
02-09-2008, 20:57
ma il paragone della casa fatto da variabilepippo calza a pennello.


Grazie. ;)

Ho dimenticato di scrivere esplicitamente che tra i pilastri portanti nello sviluppo di giochi 3D devi annoverare: la conoscenza dell'inglese (tutto il materiale che conta è disponibile solo in tale lingua), una consistente esperienza di programmazione in un linguaggio general-purpose, solide basi matematiche, studio di una o più librerie grafiche (o di un 3D engine/GDK), studio dei vari aspetti correlati (intelligenza artificiale, gestione delle collisioni, progettazione del software).

Tutto questo non deve scoraggiarti, anzi dovrebbe spingerti ad impegnarti nello studio e nell'applicazione dei concetti appresi. Di sicuro, se non hai tirato su i pilastri citati, non puoi partire ORA a sviluppare giochi 3D senza fare danni (=costruire una casa che crolli al primo soffio di vento). :)

Mattyfog
02-09-2008, 21:22
Ti consiglierei magari, prima di buttarti su Direct3D, di fare un piccolo gioco in 2D, utilizzando DirectDraw, per entrare nella logica del gioco, e poi magari di fare qualcosa di più avanzato in 3D.
quell sicuramente!!!

Tutto questo non deve scoraggiarti, anzi dovrebbe spingerti ad impegnarti nello studio e nell'applicazione dei concetti appresi. Di sicuro, se non hai tirato su i pilastri citati, non puoi partire ORA a sviluppare giochi 3D senza fare danni (=costruire una casa che crolli al primo soffio di vento).
non mi scoraggia per niente. So che la strada è lunga e che bisogna impegnarsi tanto ma io non ho nessunissima fretta e quindi voglio almeno provare. L'inglese lo so come lo so, voglio dire che qualcosa (i concetti principali) li capisco se leggo qualcosa. Il linguaggio lo impararo man mano: prima me lo studio bene per un po' e poi provo a studiare le DirectX partendo dal 2D e nel caso non avessi qualcosa di chiaro sul C# me lo studio sul momento. Se anche riuscissi a passare al 3D tra 5 anni va bene lo stesso in quanto, ripeto, non ho nessuna fretta!

DoubleAJ
03-09-2008, 02:57
Ciao!

Io quando ho deciso di cominciare ad imparare la progrmmazione di videogiochi mi sono buttato su Direct3D, e il meglio che ho trovato è stata la documentazione della Microsoft stessa:
http://msdn.microsoft.com/en-us/library/bb219837(VS.85).aspx

Mi sono detto che dopotutto è roba loro, quindi magari la sanno spiegare al meglio.

Ho fatto un giochino semplice, una specie di Arkanoid, ma in 3D.
Successivamente per fare qualcosa di più complesso sono venuto a conoscenza di Ogre3D (http://www.ogre3d.org/), un framework che si appoggia appunto sulle librerie grafiche Direct3D o OpenGL (la scelta è tua) e che ti fornisce gli strumenti per creare la componente grafica di applicazioni multimediali, con un occhio di riguardo verso i videogiochi.

Ovviamente, come ti hanno detto gli altri, prima di tutto è INDISPENSABILE che tu sappia programmare estremamente bene.
Una volta completato il tuo percorso di apprendimento, farai le tue scelte: quale linguaggio utilizzare, quali librerie, ecc.

Il tuo atteggiamento è una buonissima partenza: avere tanta curiosità e voglia di imparare, non avere fretta, e avere tanta pazienza e costanza.

Good luck!

niki89
07-09-2008, 23:24
Ragazzi secondo me non avete centrato bene il problema allora sono due le problematiche giusto???
Prima di tutto le principali differenze tra il c++ e il c# sono :

il c++ devi gestire manualmente la memoria (gestrione dinamica : puntatori )
il c # evita questa rottura perche lo gestisce il software stesso.però le conseguenze che crea una virtual macchine e perdi le prestazioni del processore circa del 15 %.

Poi la differenza tra directx e Opengl

le directx come hanno detto prima oltre a librerie grafiche gestisce tante altre cose. Cosa che Opengl non fanno....però il passaggio tra un directx 9 a directx 10 e le versione successive sono le modifiche al codice quindi non puoi implementare....invece con le Opengl ogni volta che esce una versione nuova puoi implementare...però ti devi studiare le librerie esterne...un altra cosa che mi sono dimenticato che se programmi opengl e directx ovviamente ti crei un motore grafico ci intendiamo :D
Invece se vuoi usare i motori grafici gia fatti (xna,ogre, irrlicht) ti liberi di circa 50 % del lavoro pero sei piu "limitato"...

spero di essere stato chiaro!

banryu79
08-09-2008, 08:30
Ragazzi secondo me non avete centrato bene il problema...

Nono, guarda: secondo me il problema l'hanno centrato benissimo.
Per quanto riguarda l'autore del thread (Mattyfog) il problema non è se usare OpenGL o DirectX, ne se scegliere C++ o C# con l'obiettivo di produrre un gioco 3D.

Il problema è imparare a programmare, prima di tutto.
E per questo ci vuole il giusto tempo. La programmazione 3D con annessi e connessi viene dopo, molto dopo, secondo me.
Proprio come dice Mattyfog stesso, tra qualche annetto, appunto :)

Mattyfog
14-09-2008, 07:17
scusate se ho potuto rispondervi solo ora comunque grazie avete centrato tutti il punto (anche se forse sono 5/6 :D )!!!

Tommo
14-09-2008, 16:17
Cmq a mio parere, è vero che chi impara a programmare solo ora non riuscirà ad avere un gioco divertente per almeno 1 annetto, ma non vedo il perchè di questo atteggiamento da "read the fucking manual"...

cioè, pure se uno inizia in grande e gli esce una gran m****ta, avrà comunque imparato molto dai suoi errori, e non avrà perso nulla perchè nessuno gli chiede nulla.
Al contrario, imparare "dalla base", dal low-level, dalle Directx ecc è lungo, frustrante, e porta solo in rari casi a sviluppare un gioco appena decente: basti vedere la quantità di engines 3D pessime, sviluppate da principianti che si trovano in giro... sinceramente preferirei vedere la stessa quantità di giochi decenti.

Quindi il mio consiglio è di prendere l'engine 3D più high level che si riesce a trovare, smanettarci, e da lì scendere per capire come funzionano.
In questa maniera imparare è sicuramente più "interessante" che "faticoso"... e tutte quelle "nozioni" sui software 3d, sulla modellazione, sulla pipeline dei contenuti in generale, verranno completamente da sè.
certo, se poi uno sente di poter imparare tutto assieme dalle basi tanto di cappello, ma per esperienza non si riesce e si spreca tempo.

71104
14-09-2008, 21:09
- infine se è ver che il codice deve essere "passato" tramite macchina virtuale non è che si ha un rallentamento del gioco? può anche darsi, solo che:
1) la perdita di performance è trascurabile, il CLR compila tutto in codice macchina just-in-time, e
2) a te non interessa minimamente, perché il lavoro pesante lo fa la scheda grafica, non la CPU; è sulla CPU che si manifesta l'eventuale perdita di performance dovuta alla piattaforma managed.
3) DirectX in alcuni casi è più performante in ambiente managed piuttosto che in ambiente nativo a causa del fatto che usandolo da .NET vi si accede direttamente senza passare per lo strato di interoperabilità COM (DirectX è esposto in ambiente nativo tramite oggetti COM).

71104
14-09-2008, 21:23
la roba che mi complicherebbe la vita con il C++ sono i problemi di allocazione memoria? si dice che in un buon programma C++ di puntatori ne girino pochi. di sicuro un videogioco deve allocare dinamicamente fracchi di memoria e di sicuro questo complica le cose perché tutti gli algoritmi devono essere progettati con un "constraint" in più (ad ogni new deve corrispondere una e una sola delete) e la cosa potrebbe non essere sempre banale, specialmente in un videogame dove ci sono parti performanti dove in genere si cerca di evitare di allocare/deallocare e che quindi richiedono anche un "deferring" delle deallocazioni; ma un buon uso di smart pointers aiuta.

non che questo significhi che devi programmare in C++ il tuo primo videogame, anzi non pensarci neanche: vai dritto su XNA.