|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
[OpenGL] Riuscirò mai a disegnare in 2D?
Sto cercando di programmare un gioco in 2D con SDL+OpenGL, ma nonostante i miei sforzi, non riesco ad avere alcun risultato.
Codice di inizializzazione: Codice:
SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
if (!(screen = SDL_SetVideoMode(vwidth, vheight, vbpp, SDL_OPENGL))) {
fprintf(stderr, "Impossibile cambiare modalità grafica (%s).\n", SDL_GetError());
fprintf(stderr, "Per usare \"" game_name "\" è necessario che la scheda grafica supporti il rendering hardware e il double buffering.\n");
// return false;
}
SDL_WM_SetCaption(game_name, NULL);
glViewport(0, 0, vwidth, vheight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0f, vwidth, 0.0f, vheight, -1.0f, +1.0f);
glMatrixMode(GL_MODELVIEW);
Ogni volta che devo disegnare sullo schermo, pulisco la visuale con questo codice: Codice:
glClearColor(0.0f, 0.0f, 0.0f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); Codice:
glPixelZoom(1.0, -1.0); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glRasterPos2f((GLfloat)(dst_rect->x/vwidth), (GLfloat)((dst_rect->y + dst_rect->h)/vheight)); glDrawPixels(dst_rect->w, dst_rect->h, GL_RGB, GL_UNSIGNED_BYTE, src->pixels); Codice:
glFlush(); SDL_GL_SwapBuffers(); Suggerimenti?
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Prova a disabilitare il depth buffer. Controlla se la viewport e' corretta. Non disegnare pixel, disegna triangoli (molto piu' veloce). Parti da un esempio che funziona e poi modificalo poco per volta per ottenere quello che vuoi tu.
Si parte tutti col famoso schermo nero
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
#3 | |||
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
Quote:
Quote:
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|||
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
In D3D sono due colpetti di DIP ed un paio di shader
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
|
#5 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
|
|
|
|
|
|
|
#6 | |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
Quote:
|
|
|
|
|
|
|
#7 | ||
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
Quote:
Comunque, ho sostituito "glOrtho(0.0f, vwidth, 0.0f, vheight, -1.0f, +1.0f);" del codice di prima con "glOrtho(0, vwidth, vheight, 0, -1, 1);", come letto in alcuni codici di MPlayer (se non sbaglio, in questo modo non dovrò specificare con glRasterPos l'angolo in basso a sinistra, ma quello in alto a sinistra). Inoltre, ho disabilitato anche il depth testing con questo codice: Codice:
if (glIsEnabled(GL_DEPTH_TEST)) {
glDepthMask(GL_FALSE);
glDisable(GL_DEPTH_TEST);
}
Prima di fare questi due cambiamenti, però, ho notato che c'era una sottile linea (credo di un solo pixel di altezza), nella parte bassa dello schermo, con pixel di vari colori. Quindi tutte le chiamate non andavano proprio a vuoto, ma forse erano sbagliate. Ora che ho fatto questi cambiamenti (e un altro paio), lo schermo è totalmente nero.
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
||
|
|
|
|
|
#8 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
secondo me ciò che non va è come fai glOrtho: imho devi passare (nell'ordine) valori del seguente tipo: negativo, positivo, negativo, positivo, positivo piccolo, positivo grande.
|
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
|
La sintassi di glOrtho e':
void glOrtho( GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar ); quindi da quanto mi pare di capire, quello che hai scritto dovrebbe essere corretto. Il depth buffer e' disabilitato di default, a meno che non lo abiliti con: glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); //o un'altra funzione per lo z-buffering glClearDepth(1.0f); Non conosco le sdl, ma e' possibile che ti manchi del codice da eseguire quando si esegue il resize della finestra? Qualcosa tipo: void reshape(int height, int width) { if (height == 0) height = 1; glViewport(0, 0, width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(...); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); } |
|
|
|
|
|
#10 |
|
Member
Iscritto dal: Aug 2003
Messaggi: 125
|
Dopo glMatrixMode(GL_MODELVIEW) prova ad aggiungerci un bel glLoadIdentity() per inizializzare la matrice.
Altrimenti... boh, hanno gia' detto tutto gli altri =) Ultima modifica di Bane : 21-08-2005 alle 12:45. |
|
|
|
|
|
#11 | ||||
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
Quote:
Quote:
Quote:
Aiutoooo!! Non capisco come si possa fare... proverò anche a leggermi un po' di sorgenti di SuperTux e altri giochi 2D. Ho già letto quelli di Chromium B.S.U. e a quanto pare, utilizza delle texture disegnate su quadrati disegnati sullo spazio 3D. Io volevo disegnare direttamente sullo schermo, per evitare di caricare le texture in OpenGL oltre che in SDL, generare le liste, gestire glBegin() e glEnd(), accertarsi che la visuale non sia angolata, ecc...
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
||||
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#13 |
|
Member
Iscritto dal: Aug 2003
Messaggi: 125
|
Se ti puo' essere d'aiuto, ho provato a scrivere quanto segue (in base al tuo codice):
unsigned char s[100*3]; for (int j = 0; j < 100*3; j++) s[j] = 50; glViewport(0, 0, 640, 480); glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0.0f, 640, 0.0f, 480, -1, +1); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glPixelZoom(1.0, -1.0); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glRasterPos2f(100, 100); glDrawPixels(10, 10, GL_RGB, GL_UNSIGNED_BYTE, s); e funziona correttamente, quindi il tuo problema deve stare altrove... Ultima modifica di Bane : 21-08-2005 alle 18:02. |
|
|
|
|
|
#14 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
A questo punto penso che la cosa migliore sia tornare ad usare il rendering software tramite SDL, anche se è decisamente più lento (circa quattro/cinque volte). Se poi la cosa vi incuriosisce posso anche allegarvi il progetto; è un po' lungo da leggere, ma non mastodontico (il file principale sono 421 linee, il progetto intero sono circa 642).
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#15 | |
|
Member
Iscritto dal: Aug 2003
Messaggi: 125
|
Quote:
|
|
|
|
|
|
|
#16 | |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
Ricordo che ai tempi belli usavo un'estensione per disegnare batch di triangoli, ed il singolo triangolo penso di non averlo mai neppure scritto in vita mia
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA Ultima modifica di fek : 22-08-2005 alle 11:42. |
|
|
|
|
|
|
#17 | |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
Quando disegni un solo pixel, la GPU e la CPU si devono sincronizzare, la CPU deve accedere alla memoria video, scrivere il pixel, e rilasciare la memoria video. A meno che il driver non mappi da solo il disegno di un pixel al disegno di un triangolo. Ma immagino che tu non voglia disegnare pixel, voglia disegnare uno sprite, giusto? Allora non e' altro che un quad con una texture mappata 1 a 1. Domanda a 71104 come si disegnano i quad che io sono arrugginito in OpenGL
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
|
#18 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
EDIT: whooops! Doppio post, perdonatemi....
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! Ultima modifica di DanieleC88 : 22-08-2005 alle 14:36. |
|
|
|
|
|
#19 | |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Quote:
Strana 'sta cosa... P.S.: HO RISOLTO! Ora, finalmente, funziona bene*. Sapete qual'era l'errore? ... ... ... . . . ...le immagini venivano disegnate fuori dallo schermo per un errore nel posizionamento... e io che ho fatto tutto quel casino! Ora non mi resta che capire come disegnare la mask (penso con glBitmap, vero?) e ho finito! Devo dire che, tutto sommato, sono soddisfatto, perché quello che finora ho fatto funziona bene sia con OpenGL che con SDL. Il progetto ve lo allego lo stesso, tanto per condividere con voi un po' di codice, visto che mi avete aiutato a risolvere. (ricordo che è ancora incompeto) Ultima cosa, rivolta a fek e 71104: questo è il progetto di cui ho parlato nel famoso thread del gioco che stiamo cercando di creare, dall'idea di questo gioco era nato poi t³, the teacher terminator... Altro P.S.: non includo il sottofondo musicale (anche se vorrei), perché le dimensioni sarebbero proibitive per HWUpgrade... * = ringrazio Bane per il suo ultimo post, mi ha dato la spinta per provare ancora una volta a cambiare quella parte di codice, che pensavo ormai fosse corretta. ![]() Edit: al diavolo! Non me lo fa caricare... lo linko da Altervista... http://jmc.altervista.org/killgloria.zip
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
|
|
#20 |
|
Senior Member
Iscritto dal: Jun 2002
Città: Dublin
Messaggi: 5989
|
Dimenticavo: se qualcuno proverà ad usare questo progetto, vedrà che il puntatore e il personaggio sono ancora una massa confusa di pixel grigi, perché mi sono messo a fare esperimenti con GL_RGB(A)/GL_BGR(A)/altri formati...
__________________
C'ho certi cazzi Mafa' che manco tu che sei pratica li hai visti mai! |
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 07:06.




















