Du bist nicht angemeldet.

Werbeanzeige

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

1

18.03.2009, 00:10

[Erledigt] SFML+OpenGL Funktionsweise

Hallo,
nachdem ich hier im Forum schon öfters gehört habe, dass SFML besser sein soll als SDL hab ich darauf mal einen Blick geworfen, die ersten Tuts auf deren Seite durchgelesen und aus den Codefragmenten nen Grundgerüst gebastelt, um das mal zu Testen...

Was mein Programm bis jetzt in etwa macht ist folgendes:
Zuerst erstelle ich ein sf:RenderWindow, damit ich auch die Sprites verwenden kann, dann konfiguriere ich OpenGL (soweit ich das verstanden habe) mit

C-/C++-Quelltext

1
2
3
4
5
6
7
glClearDepth(1.0f);
glClearColor(0.f, 0.f, 0.f, 0.f);
glEnable(GL_DEPTH_TEST);
glDepthMask(GL_TRUE);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90.f, 1.f, 1.f, 500.f);


Und Lade danach einmalig ein Image für ein TestSprite später..
In der Hauptschleife male ich dann mit:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glTranslatef(0.f, 0.f, -200.f);
        glRotatef(Clock.GetElapsedTime() * 50, 1.f, 0.f, 0.f);
        glRotatef(Clock.GetElapsedTime() * 30, 0.f, 1.f, 0.f);
        glRotatef(Clock.GetElapsedTime() * 90, 0.f, 0.f, 1.f);

        glBegin(GL_QUADS);
            glVertex3f(-50.f, -50.f, -50.f);
            glVertex3f(-50.f,  50.f, -50.f);
.......
        glEnd();

nen sich drehenden Würfel.... Danach erstelle ich ein Sprite, lade das Image von oben und lasse das Sprite malen...

Allerdings habe ich jetzt einige Probleme:
1. mit glEnable(GL_DEPTH_TEST); wird das (oder der?) Sprite nicht mehr angezeigt
2. wenn App.PreserveOpenGLStates(true); NICHT aufgerufen wurde, wird der Würfel nicht mehr gezeichnet... an sich für mich kein Problem, aber im Tutorial stand, dass diese Funktion sehr aufwändig ist, und nur im Notfall benutzt werden sollte.

Also ich habe bereits rausgefunden, wie alles korrekt funktioniert, aber nicht, wieso es anders (eben mit oder ohne die funktionen aus 1. und 2.) nicht mehr richtig läuft...

Kann mir jemand kurz erklären, was die Funktion aus 1. macht, ob sie wichtig ist, und wie es auch mit ihr funktionieren kann (falls das geht). Außerdem Wie ich vllt auch die Funktion aus 2. umgehen kann und was sie überhaupt bewirkt...

Was mich noch interessiert ist, ob man SFML so wie ich es will überhaupt verwenden sollte, also sf::images und sprites mit opengl vermischen, oder ob ich lieber alles mit opengl machen sollte..... (oder verwenden die tollen sprites intern sowieso schon opengl, weshalb es wenigstens performancetechnisch nur wenig unterschied macht)...

Viel Text, danke schonmal fürs lesen, ich hoffe irgendwer kann mir meine ganzen fragen beantworten :D

Jevermeister

Treue Seele

Beiträge: 130

Wohnort: Bremerhaven

Beruf: Student

  • Private Nachricht senden

2

18.03.2009, 00:26

Re: SFML+OpenGL Funktionsweise

Zitat von »"n0_0ne"«

Was mich noch interessiert ist, ob man SFML so wie ich es will überhaupt verwenden sollte, also sf::images und sprites mit opengl vermischen, oder ob ich lieber alles mit opengl machen sollte..... (oder verwenden die tollen sprites intern sowieso schon opengl, weshalb es wenigstens performancetechnisch nur wenig unterschied macht)...


SFML verwendet intern zur Darstellung OpenGL, es bringt dir also keine signifikanten Vorteile.
Das könnte auch erklären, warum dein Sprite nicht mehr angezeigt wird, zu dem Rest kann ich leider nicht viel sagen, da ich mich gerade aktuell eher mit DirectX beschäftige.

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

3

18.03.2009, 12:13

OK, das beantwortet mir ja schonmal einen Teil meiner Fragen, aber wenn die Sprites direkt auf OpenGL aufbauen, wie kommt es dann, dass wenn (um meine Fragen nochmal konkret zu formulieren):

Mit einem Sprite und ohne PreserveOpenGLStates(true); mein Würfel nicht mehr gezeichnet wird, er aber ohne Sprite und ohne PreserveOpenGLStates(true); doch noch gerendert wird...

Für mein Spiel, welches ich entwickeln will, brauche ich eigentlich kein 3D. Die Sprites würden mir da vollkommen ausreichen, und mit der Funktion funktioniert es ja auch beides zusammen nur wie gesagt steht im Tutorial

Zitat

Preserving OpenGL states is very CPU consuming and will degrade performances, use it only if you really need it. Also consider using your own code to manage the states you need to preserve, as it will be more efficient than the generic SFML code which takes care of every state, even the ones you don't care about.


Also kann mir jemand kurz erklären, was mit "manage the states" genau gemeint ist und anhand meines Minimalbeispiels mit einem Sprite und einem 3DWürfel, was ich da jetzt machen müsste.

4

18.03.2009, 16:59

ganz einfach: weil du pures OGL und SFML mixt, müssen natürlich zwischen deinen Drawcalls und denen des SFML die einstellungen angepasst werden. PreserveOpenGLStates(true) sorgt offensichtlich dafür, das SFML das für dich macht, allerdings speichert es dafür sämtliche einstellungen, und nicht nur die, die sich unterscheiden. Deshalb wärs performanter, wenn du den kram selbst machst (das ist mit manage the states gemeint).

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

5

18.03.2009, 23:52

Um keinen neuen Thread erstellen zu müssen frage ich hier mal schnell nach:

Ich bin grade dabei mein altes Spiel, was ich angefangen habe, von SDL für die SFML umzuschreiben, bin gerade bei einer Klasse für animierte Sprites, mit einigen extra Funktionen....
Allerdings frage ich mich gerade, ob es bei SFML überhaupt sowas gibt wie ColorKeys aus SDL?!

Für die sf::image Klasse gibt es garkeine Funktion um eine Farbe zu setzen, und für Sprites nur einen sehr allgemeinen Namen SetColor(...), wobei ich hier aus der Doku nicht rauslesen kann, was diese überhaupt macht...

Kann man mit der SFML also bei Bildern eine Farbe auch als "unsichtbar" darstellen lassen, oder geht das überhaupt nicht? Dann würde ich nämlich doch bei der SDL bleiben :?

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

n0_0ne

1x Contest-Sieger

  • »n0_0ne« ist der Autor dieses Themas
  • Private Nachricht senden

7

19.03.2009, 01:08

Tatsächlich, vollkommen übersehen, danke :D

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

8

19.03.2009, 11:48

Ja die Funktion musste ich auch erstmal suchen, aber ich glaube nicht, dass Laurent sie in Zukunft umbenennen wird ;-)

Werbeanzeige