2d lightmap in OpenGL
-
ich versuche grade eine 2D Szene zu beleuchten. Ich hab schon was davon gehört, dass man erst alles abdunkelt, und dann die beleuchteten Stellen mit weiß übermalt, damit sie heller erscheinen. Das halte ich aber für sehr idiotisch, denn das Weiße kann man dann genauso gut erkennen, wie vorher das unbeleuchtete schwarze, dur eben dass es dann weiß ist.
Meine Idee ist folgende:
Als erstes wird eine Komplett weiße shadowmap erstellt, und lichtquellen mit schwarzen Flecken darauf dargestellt (invertierte farben halt). Jetzt render ich meine Szene, ohne beleuchtung. Über das gerenderte Bild zeiche ich dann noch meine shadowmap, aber indem ich die Farbe von der shadowmap von denen im Hintergrund abziehe.Von meiner Idee bin ich zwar überzeugt, dass sie gehen wird, nur weiß ich nicht, wie ich das in OpenGL umsetzten kann, kann mir da einer helfen
danke.
-
du willst einfach nur wissen wie man eine lightmap einbinden? ganze einfach, schatten sind schwarz, dort wo licht hinscheint ist es weiss (in deiner lightmap) und dann blendest du im zweiten pass die lightmap multiplikativ rein z.b. mit GL_SRC_ALPHA,GL_ZERO
-
Wohl eher mit (GL_DST_COLOR, GL_ZERO) oder (GL_ZERO, GL_SRC_COLOR).
-
gibts auch ein minibeispiel?
-
// (Szene normal rendern) // ... // Light-Map drüber-blenden glEnable(GL_BLEND); glBlendFunc(GL_DST_COLOR, GL_ZERO); glBindTexture(GL_TEXTURE_2D, lightMapTexture); // (jetzt ein großes Rechteck oder was auch immer über die Szene malen) // ...
-
TomasRiker schrieb:
Wohl eher mit (GL_DST_COLOR, GL_ZERO) oder (GL_ZERO, GL_SRC_COLOR).

-
Ok habs jetzt mit glBlendFunc(GL_ZERO,GL_SRC_COLOR); hinbekommen, danke. So mssen die lichter la nichtmal mehr negativ sein. Aber jetzt wüsste ich gerne noch, wie ich die Lichtquellen auf die shadowmap zeichnen kann. Das ganze sollte schon so aufgebaut sein, dass ich das für jeden Frame machen kann, denn schließlich sieht es nur schön aus, wenn sich die Lichtquellen auch bewegen können.
-
additiv, mit GL_ONE auf beiden seiten. oder wo liegt das problem?
-
ne das Blending ist schon verstanden, ich möchte nur die lightmap für jeden Frame neu erstellen. Also ungefähr so:
while(running){ clear_screen(); Hintergrund_malen(); //hier umschalten, folgende zeichnungen landen nicht //mehr auf dem Bildschierm, sondern in der Textur "shadowmap" alle_Lichtquellen_malen(); //zurückschalten die_shadowmap_ueber_die_Szene_blenden(); swap_buffer(); }wie ich die fehlenden Funktionen umsetzen könnte, würde ich noch gernen wissen.
-
Da habe ich einen schönen Artikel für dich:
http://www.gamedev.net/reference/programming/features/2dsoftshadow/Du musst es ja nicht unbedingt gleich so komplex machen.
-
danke für den Link, ist genau das was ich suche, muss mich nur halt reinarbeiten. Aber bevor ich mit der Idee, die die dort verwenden weitermache, würde ich gerne noch meine Idee etwas ausbauen. Gibt es denn wenigstens in OpenGL die möglichkeit eine gerenderte szene schnell in eine Textur zu packen, dann kann ich meine shadowmap vor dem rest der Szene rendern, in eine Textur packen, und zu schluss neu oben drüber legen.