OpenGL mit SDL verwenden

z.B. wxWidgets, GTK+, Qt, OpenGL, DirectX
Antworten
Benutzeravatar
Jside
Beiträge: 377
Registriert: Di Nov 11, 2008 12:56 am

OpenGL mit SDL verwenden

Beitrag von Jside » Mo Mai 04, 2009 9:23 pm

/* edit by Kerli: Wir schweifen wieder ab :) */
Dirty Oerti hat geschrieben:
jside hat geschrieben:...Mal nebenbei angemerkt, jeder 3te hier incl. Ich bastelt an einer GameEngine ...warum proggen wir nicht gleich zusammen eine?
Hier! ^^ :)
Hätte hier schonmal eine komplette INIT für SDL und OpenGL parat, aber noch ungetestet...^^

Code: Alles auswählen

typedef struct {
    int r;
    int b;
    int g;
    int alpha;
} GfxColor;

typedef struct {
    int   depth;
    int   width;
    int   heigth;
    int   lod; //Level of Detail, unbenutzt
    int   efflod; //Effect Level of Detail, ebenfalls unbenutzt
    int   fullscreen; //1= Fullscreen
    char *title; //Fenster Titel
    char *task; //Fenster Task
    GfxColor background; //OpenGL clear() hintergrund
}GfxOptions;

void SDLinit(GfxOptions Gfx) {
    if(SDL_Init(SDL_INIT_EVERYTHING) == -1) {
        fprintf(stderr,"Unable to init SDL: %s\n",SDL_GetError());
        return;
    }
    SDL_WM_SetCaption(Gfx.title, Gfx.task);
    SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
    if(!Gfx.fullscreen) SDL_SetVideoMode(Gfx.heigth, Gfx.width, Gfx.depth, SDL_OPENGL);
    else SDL_SetVideoMode(Gfx.heigth, Gfx.width, Gfx.depth, SDL_OPENGL|SDL_FULLSCREEN);
}

void GLinit(GfxOptions Gfx) {
    glEnable(GL_TEXTURE_2D);

    glBlendFunc(GL_SRC_ALPHA,GL_ONE);

    glClearColor(Gfx.background.r, Gfx.background.b, Gfx.background.g, Gfx.background.alpha);

    glClearDepth(Gfx.depth);

    glDepthFunc(GL_LESS);

    glEnable(GL_DEPTH_TEST);

    glShadeModel(GL_SMOOTH);

    glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
}

Benutzeravatar
Dirty Oerti
Beiträge: 2229
Registriert: Di Jul 08, 2008 5:05 pm
Wohnort: Thurndorf / Würzburg

Re: OpenGL oder SDL

Beitrag von Dirty Oerti » Mo Mai 04, 2009 9:25 pm

*Räusper*
Kann r,g,b, und a nicht nur Werte zwischen 0-255 annehmen..?
Wozu braucht man dann ints? Da tuns auch Chars...
Bei Fragen einfach an daniel[ät]proggen[Punkt]org
Ich helfe gerne! :)
----------
Wenn du ein Licht am Ende des Tunnels siehst, freu dich nicht zu früh! Es könnte ein Zug sein, der auf dich zukommt!
----
It said: "Install Win95 or better ..." So I installed Linux.

Benutzeravatar
Jside
Beiträge: 377
Registriert: Di Nov 11, 2008 12:56 am

Re: OpenGL oder SDL

Beitrag von Jside » Mo Mai 04, 2009 9:30 pm

Dirty Oerti hat geschrieben:*Räusper*
Kann r,g,b, und a nicht nur Werte zwischen 0-255 annehmen..?
Wozu braucht man dann ints? Da tuns auch Chars...
Joa, war nur schnell hingeproggt, da denke ich normalerweise nicht über sowas nach :D :lol:

Benutzeravatar
Kerli
Beiträge: 1456
Registriert: So Jul 06, 2008 10:17 am
Wohnort: Österreich
Kontaktdaten:

Re: OpenGL oder SDL

Beitrag von Kerli » Mo Mai 04, 2009 10:02 pm

Jside hat geschrieben:Joa, war nur schnell hingeproggt, da denke ich normalerweise nicht über sowas nach :D :lol:
Die Programmierer habe ich ja besonders gerne. Einfach Code schreiben und nicht mitdenken :P

Als weitere Optimierung könntest du die Strukturen noch als konstante Referenzen übergeben. Erspart unnötige Kopien und beseitigt ein paar mögliche Fehlerquellen.

Wer so etwas ähnliches in C++ haben möchte kann auch einmal auf meine Seite schauen. Das hab ich für meine Tutorials geschrieben, aber es kann sie natürlich jeder verwenden wie und wo er mag (Ist eine BSD-Lizenz).
"Make it idiot-proof and someone will invent an even better idiot." (programmers wisdom)

OpenGL Tutorials und vieles mehr rund ums Programmieren: http://www.tomprogs.at

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8488
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: OpenGL oder SDL

Beitrag von Xin » Di Mai 05, 2009 8:51 am

Jside hat geschrieben:Joa, war nur schnell hingeproggt, da denke ich normalerweise nicht über sowas nach :D :lol:
Der Informatiker rät: Niemals nur schnell hinproggen. Wird das Projekt größer, weiß man nicht mehr, was schnell hingerotzt wurde und was durchdacht wurde. Solange es nur rappelt, aber nicht auseinanderfliegt, bleibt alles so wie es ist. Wenn dann links und rechts rapelt und in Folge dazu aber in der Mitte auseinanderfliegt, wird die Sache kompliziert. Weil das in der Mitte ist durchdacht und eigentlich durch Tests abgesichert und kann eigentlich doch gar nicht kaputt gehen... oder!?

Programmiere lieber durchdacht und wirf in Folge dazu eventuell durchdachten Code als Prototypen wieder weg (passiert in der Realität eh nie...). Wenn man sich dran gewöhnt hat, grundsätzlich durchdacht zu programmieren, fällt das nicht mehr zeitlich ins Gewicht.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
Jside
Beiträge: 377
Registriert: Di Nov 11, 2008 12:56 am

Re: OpenGL mit SDL verwenden

Beitrag von Jside » Mi Mai 06, 2009 5:36 pm

Joa schon gut, ich hab jetzt schon einen guten Ansatz, und schon wenige, dafür aber sehr Kraftvolle Funktionen eingebaut, so in 2 Stunden arbeit, obwohl ich heute morgen ewtl. 5% Ahnung von OpenGL hatte, und nach ner Stunde Manuals lesen glaubisch schon ganz gut zurecht komme ^^ :) (ich hab vorallem ältere Handbücher gelesen, da da OpenGL noch nicht so verschaltelt war wie heute, und man alles viel besser verstehen kann)

Folgende funktionen hab ich drin:

int SDLinit(GfxOptions Gfx); //Kennt ihr, hab ich aber nochmals überarbeitet...(ver 0.2)
void GLinit(GfxOptions Gfx); //Auch etwas überarbeitet(ver 0.3)

void GfxDisplaySimpleTriangle(GfxTriangle client); //Generiert eine Simple Triangle
void GfxMultiTrangle(); //Start eines Multitriangle Models
void GfxMultiEnd(); //Ende eines Multi Triangle oder Quad Models
void GfxMultiQuad(); //Start eines Multi Quad Models
void GfxSetTriColor(GfxTriangle client, GfxColor color); //Setzt alle Vertex Farben des Triangles "client" auf die selbe Farbe.

Gerade im Moment in WIP:
void GfxDisplaySimpleQuad(GfxQuad client); // Dürfte klar sein
void GfxIdioteSecureMod(GfxViewport client, enum Gfxmod type); //Setzt den Modus(3D Perspektive oder 2D) Vollautomatisch auf die Viewport structur "client"
void GfxStartViewport(GfxViewport client); //Startet für alle Modelle, die danach angezeigt werden den vorher definierten, oder vollautomatisch definierten ViewPort.

TODO:
Rotation/Coordinaten
Texturen
etc.

Beispiele:
Einfache Triangle;
GfxOptions MainOptions;
/* Hier MainOptions definieren, oder auslesen lassen */

SDLinit(MainOptions);
GLinit(MainOptions);

GfxTriangle test;
/* hier test definieren, oder auslesen lassen */

DisplaySimpleTriangle(test);

SDL_GL_SwapBuffers();
sleep(2);
Model aus mehreren Triangles;
GfxOptions MainOptions;
/* Hier MainOptions definieren, oder auslesen lassen */

SDLinit(MainOptions);
GLinit(MainOptions);

GfxTriangle test[6];
/* hier test definieren, oder auslesen lassen */

GfxMultiTrangle();
DisplaySimpleTriangle(test[0]); // Ja auch sowas kann die Engine ;)
DisplaySimpleTriangle(test[1]);
DisplaySimpleTriangle(test[2]);
/* Punkt, Punkt, Punkt */
GfxMultiEnd()

SDL_GL_SwapBuffers();
sleep(2);
Einfacher gehts echt nitmehr, ohne das ich denjenigen, der die Engine benutzt bevormunde ;)

236 Codezeilen, Doxygen durchkommentiert(zumindest die Funktionen)

Bisjetzt jemand eine Idee/Kritik etc? Ich lads mal heute abend soweit hoch...

Benutzeravatar
Jside
Beiträge: 377
Registriert: Di Nov 11, 2008 12:56 am

Re: OpenGL mit SDL verwenden

Beitrag von Jside » Mi Mai 06, 2009 9:13 pm

Ok, ich hab bislang nix neues eingebaut, nur die Funktion GfxDisplaySimpleQuad() eingefügt,
http://jside.bplaced.net/enginev0.1.tar.gz
Einfach sh build ausführen, dann wird das ganze neu kompiliert...
Wenn alles läuft wird ein Dreieck angezeigt...

GfxSetTriColor hat einen Macken, da werden die Werte nicht richtig übergeben... :oops:
GfxSetQuadColor hab ich nochnicht geproggt...

Ich schreibe zurzeit an einer Dokumentation^^

Wer mithelfen will, kann einfach dran rumbasteln, und den Code mir per Email, PN oder in dem Fred hier Posten, dabei aber bei Veränderungen in bestehenden Funktionen im Kommentarheader den @version Wert eins höher setzten.


*geht schonmal in Deckung* :mrgreen: :mrgreen:

Antworten