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

Fnord42

Frischling

  • »Fnord42« ist der Autor dieses Themas

Beiträge: 18

Beruf: Student

  • Private Nachricht senden

21

27.09.2011, 02:15

Hab die Engine.cpp nochmal geupdated, die Render-Methode ist nun besser strukturiert und kommentiert.
http://dl.dropbox.com/u/12845003/ShadowTest.zip

Fnord42

Frischling

  • »Fnord42« ist der Autor dieses Themas

Beiträge: 18

Beruf: Student

  • Private Nachricht senden

22

27.09.2011, 14:34

omg, es funktioniert endlich! Ich kanns kaum glauben xD
Folgender fießer Fehler war dran Schuld:

C-/C++-Quelltext

1
glUniformMatrix4fv(m_shadow_shader.get_uniform_location("light_pos"), 1, false, (GLfloat*) &light_position);

sollte eigentlich

C-/C++-Quelltext

1
glUniform3fv(m_shadow_shader.get_uniform_location("light_pos"), 1, (GLfloat*) &light_position);

heißen.

Danke für eure Hilfe!

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

23

27.09.2011, 14:49

Cool ;)
Aber eigentlich hast du dir ja selbst geholfen :D
Zeig doch nochmal einen Screenshot!

Fnord42

Frischling

  • »Fnord42« ist der Autor dieses Themas

Beiträge: 18

Beruf: Student

  • Private Nachricht senden

24

27.09.2011, 15:11

Cool ;)
Aber eigentlich hast du dir ja selbst geholfen :D
Zeig doch nochmal einen Screenshot!


ok, da hast du recht ;)
Dann aber auf jeden Fall danke für eure Hilfsbereitschaft :D

Hier mal noch die 2 Test-Szenarios mit nun funktionierenden (aber noch ungefilterten) Schatten:


(Link)



(Link)


Falls ich Zeit finde, werde ich vielleicht mal noch ein Tutorial zu diesem Thema verfassen.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

25

27.09.2011, 15:15

Nice :)
Ich wollte auch immer mal Cube-Shadow-Maps implementieren.
Planst du auch selektive Updates einzelner Faces, z.B. wenn sich nur in einer Richtung etwas verändert, was ein neues Rendern der Shadow-Map erfordern würde?

Fnord42

Frischling

  • »Fnord42« ist der Autor dieses Themas

Beiträge: 18

Beruf: Student

  • Private Nachricht senden

26

27.09.2011, 15:39

Nice :)
Ich wollte auch immer mal Cube-Shadow-Maps implementieren.
Planst du auch selektive Updates einzelner Faces, z.B. wenn sich nur in einer Richtung etwas verändert, was ein neues Rendern der Shadow-Map erfordern würde?

Hab ich noch nicht wirklich drüber nachgedacht. Für Lichter mit statischen Positionen könnte sich das ja durchaus lohnen.

Da ich voraussichtlich eine statische Map mit dynamischen Entitäten verwenden werde, könnte man eventuell für die Lichter die im View-Frustum liegen checken ob sich Positionen/Richtungen der Entitäten die innerhalb der Licht-View-Frustas (Frusten, Frusti?) liegen sich verändert haben, und nur die Flächen wo sich Objekte verändert haben neuberechnen.

Oder eventuell die Depthmaps der statischen Map bei der Initialisierung berechnen und bei jedem Frame über diese Ausgangsdepthmaps die dynamischen Entitäten drüberrendern. Dabei könnte man eventuell noch die Entitäten aussortieren, die nicht im Lichtfrustum liegen und nicht in den Octree-Zellen liegen die im PVS der Licht-Zelle sind.

Ich überlege mir im Moment ob es nicht vielleicht ne Möglichkeit gibt die Shadowcubemap in nur einem Pass zu berechnen. Da man aufgrund der OpenGL-Rasterisierung nicht so in eine Cubemap rendern kann wie man daraus liest (also mit Richtungsvektor) kann man nicht einfach die Projektionsmatrix weglassen und gl_Position auf den Richtungsvektor von Licht zu Fragment setzen, aber eventuell kann man eine 2D-Textur nehmen und irgendwie die Richtungsvektoren in 2D-Koordinaten umrechnen ohne das Koordinaten verschwendet werden oder doppelt vorkommen. Mal genauer drüber nachdenken...

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

27

27.09.2011, 15:44

Das würde ich mir auch wünschen (direktes Rendern in eine Cube-Map).
Es gibt die Möglichkeit, mit Geometry Shadern zumindest jedes Dreieck nur einmal an die Karte schicken zu müssen, im Prinzip ist das nur 1 Pass. Im Shader musst du dann schauen, welche Faces ein Dreieck abdeckt.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

28

27.09.2011, 15:48

In D3D10+ ist das durch Geometry Shader möglich. In OpenGL hab ich das noch nie gemacht, weiß daher nicht wie das Feature dort umgesetzt ist. Aber zumindest über Extensions sollte es auf jeden Fall verfügbar sein.

EDIT: Ok, GLSL bietet dir mit gl_Layer wohl die 1:1 Entsprechung zu SV_RenderTargetArrayIndex.

Fnord42

Frischling

  • »Fnord42« ist der Autor dieses Themas

Beiträge: 18

Beruf: Student

  • Private Nachricht senden

29

27.09.2011, 15:53

Das würde ich mir auch wünschen (direktes Rendern in eine Cube-Map).
Es gibt die Möglichkeit, mit Geometry Shadern zumindest jedes Dreieck nur einmal an die Karte schicken zu müssen, im Prinzip ist das nur 1 Pass. Im Shader musst du dann schauen, welche Faces ein Dreieck abdeckt.

Hab ich auch schon von gelesen, allerdings hat man immer noch 6 Pässe beim Fragmentshader, was glaub ich das rechenintensivste ist.
Ist die Frage welche Methode effektiver ist, mit der Methode mit Geometry Shader würde man der Lokalität der Vertexdaten entgegenkommen, mit 6 komplett getrennten Pässen würde man eventuell der Lokalität der Cubemap-Textur entgegenkommen (nicht sicher wie diese intern angelegt ist, aber durch die initialisierung würde ich Schätzen dass die im Speicher einfach als 6 2D-Texturen vorzufinden ist).
Ich könnte mir vorstellen, dass die Methode mit Geometry-Shader nochmal etwas schneller ist, da eine Textur sich AFAIK wesentlich besser für Random-Access eignet als der Speicher in dem die Vertex-Daten stehen.

edit: @dot: Danke für die Infos, allerdings schon bekannt :)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

30

27.09.2011, 16:03

Naja, die 6 Pässe durch den Fragment Shader hättest du sowieso, egal ob du jetzt 1x6 oder 6x1 Ansichten renderst ;)
Ich denk es hängt vor allem von der Hardware (GeometryShader Performance) und etwas von der Art deiner Szene ab.

Werbeanzeige