Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

hanhau

Treue Seele

  • »hanhau« ist der Autor dieses Themas

Beiträge: 80

Wohnort: St. Pölten, Österreich

Beruf: schueler

  • Private Nachricht senden

1

12.08.2015, 18:20

[C++/OpenGL/SFML] Dynamisches ->2D<- Licht in OpenGL ?

Hallo !

Zu dem, was ich erreichen will:

Eine dynamische und halbwegs realistische Lichtengine für mein Spiel.
Licht, das bei Rechtecken, Quadraten und Kreisen einen Schatten hinterlässt.
Spotlichter und normales Licht für 360°.
Zudem soll sie eine halbwegs gute Performance haben.

Was ich mir gedacht habe:

Ein Himmelsobjekt für jedes Level, das in Containern sämtliche Lichter auflistet
und zudem eine render-Funktion hat.
Die Informationen zu den "Licht-abprall-Körpern" ist dann in jeden GameObject implementiert,
diese GameObjects werden später global aufgelistet, so kann jedes Modul meiner GameEngine
darauf zugreifen, was für mich einiges einfacher macht :)

----------------------------------------------------------------------------------------------------------

So, ich dachte dabei an so etwas, allerdings noch mit einer
Glättung an den Kanten und der Lichtkegel natürlich rund, bzw als Spotlicht.


(Link)


Mein Wunsch wäre, OpenGL zu verwenden, da es schnell sein soll.
Meine grundsätzliche Idee wäre es, die "lichtmap" auf eine sf::RenderTexture zwischenzurendern.
In etwa der Reihenfolge:

1. Himmelsfarbe, Nebel an sf::RenderTexture anwenden
2. Dann Schatten mit einer durchsichtigen Farbe ausschneiden und dabei die Kanten geglättet lassen
3. Die sf::RenderTexture im sf::RenderWindow rendern lassen

Wäre das eine Option ?

Danke für Anregungen, Tipps, Hinweise und eventuelle Links :)

MfG, Hannes !
Oft denke ich an sie, niemals habe ich sie gefragt, niemals etwas gesagt,
nur verzweifelt am PC gesessen und dabei die Zeit vergessen, sie ist weg.

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

2

12.08.2015, 19:06

Klar geht das.

Die erste Frage sollte sein, ob du den Effekt auf der CPU berechnen möchtest oder auf der GPU. Zweiteres bietet mehr Potential, ist allerdings ein wenig komplizierter, falls du noch nie mit Shadern gearbeitet hast. Wenn sich die Komplexität der Geometrie im Rahmen hält (zb. nur ein paar Tausend Vertices) ist das prinzipiell nicht unbedingt notwendig. Du kannst die Dreiecke einfach auf der CPU dann einfach auf der CPU berechnen und mit OpenGL/SFML mit multiplikativen Blending rendern. (Mit einem stinknormalen VBO in OpenGL bzw. in der SFML API heißt das, glaube ich, VertexArray).

Wenn das auch mit mehreren Lichtern klappen soll, ist es am Einfachsten, wenn du alle Lichter erstmal eine Textur renderst. Dort kannst du alle Lichter mit additiven Blending aufaddiert. Diese Lightmap-Textur kannst du dann einfach mit der Szene multiplizieren.
Das rendern in eine Textur geht in OpenGL mit einem FBO und in SFML mit einer "RenderTextur".

Zur Berechnung der Umrisse des Schattens solltest du einfach mal im Internet danach suchen. Wenn ich das implementieren müsste, würde ich im Prinzip erst alle Vertices im Uhrzeigersinn ordnen und anschließend die Dreiecke aufziehen. Die Helligkeit nimmt einfach Abhänig vom Abstand der Lichtquelle.

Ich glaube nicht, dass das du das unbedingt benötigst, aber als Alternative gäbe es eben noch die GPU Lösung. Dort kann man zum Beispiel in einem Geometry Shader die Eckkanten extrudieren oder möglicherweise auch die Eckkanten auf Pixelbasis extrudieren. Ich bin mir nicht ganz sicher, aber ich glaube, dass hat zum Beispiel Schrompf in seinem Spiel gemacht.

3

12.08.2015, 19:12

ncase.me ;)

MfG
Check

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

12.08.2015, 19:13

Klingt möglich, halte ich aber für eine ineffiziente Lösung. Es gibt im Netz viele schöne Tutorials, wie man die Szene komplett verzerren, rendern und wieder entzerren kann und damit nur durch GPU-Arbeit und ohne Polygon-Berechnung sehr schöne Schatten produzieren kann.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

hanhau

Treue Seele

  • »hanhau« ist der Autor dieses Themas

Beiträge: 80

Wohnort: St. Pölten, Österreich

Beruf: schueler

  • Private Nachricht senden

5

12.08.2015, 19:23

Danke, VertexArrays sind mir schon vertraut :)
Blending zudem auch ^^

Werden bis Level bis zu 100 Lichter werden - nehme ich einmal an.

Danke für die Links, ich werde mir dort einmal alles in Ruhe durchlesen und mal selber testen,
das Mathe ist für mich gottseidank nicht mehr so schwer ^^

Ja, das ist nun die Frage:
Was macht für euch Sinn ?
Hat dazu schon jemand Erfahrung ?

Ich wäre nach Stichworten dankbar, damit ich etwas recherchieren kann :)
Oft denke ich an sie, niemals habe ich sie gefragt, niemals etwas gesagt,
nur verzweifelt am PC gesessen und dabei die Zeit vergessen, sie ist weg.

6

12.08.2015, 20:08

Shader machen schon am ehesten Sinn.

@Hello_Kitty: Kann man eigentlich auch mal einen einzigen Beitrag wieder von dir lesen oder postest du aus Russland?

MfG
Check

Hello_Kitty!

unregistriert

7

12.08.2015, 20:22

Mein Traffic wird bit-genau innerdeutsch geroutet, aber danke der Nachfrage! :)

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

8

12.08.2015, 20:32

@BlueCobold
Wie wäre es mit einem Link? Ich kann mir da gerade nix darunter vorstellen.
Für die klasische Shadowmap-Berechnung müsste man ja aus der Sicht der Lichtquelle rendern und das sind dann ist die Welt nur noch eine unendlich dünne Linie die außerdem 360° umschließt. Das könnte auch möglich sein, scheint mir aber eine eher ungewöhnliche Lösung.

hanhau

Treue Seele

  • »hanhau« ist der Autor dieses Themas

Beiträge: 80

Wohnort: St. Pölten, Österreich

Beruf: schueler

  • Private Nachricht senden

10

12.08.2015, 21:04

JAAAAAAA, genau so etwas in der Art wäre nice :)
Wie bei jeden Link muss ich das mal durchgehen, danke !
....
aber wie setze ich das in SFML um ?
Ich muss ja das mit jeden Licht machen, ist es da nicht gleich besser mit den "Strahlen" zu jeden Punkt ?
Oft denke ich an sie, niemals habe ich sie gefragt, niemals etwas gesagt,
nur verzweifelt am PC gesessen und dabei die Zeit vergessen, sie ist weg.

Werbeanzeige