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

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

1

26.02.2012, 20:40

Shadow-Mapping mit mehreren Lichtquellen

Hallo allerseites,
ich habe jetzt schon ein paar mal Shadow-Mapping mit GLSL und HLSL programmiert. afaik heißt der Algrithmus für den Schatten "PCF" (mit jittered Sampling) den ich verwendet habe (Aber das sagt ja nur was über die Qualität des Schattens aus).

Was ich jetzt mal versuchen will ist, mit mehreren Lichtquellen zu arbeiten die Shadow-Mapping anwenden, als nur eine.
Mal ganz abgesehn von den Performance-Problemen die da so mit sich kommen, wenn man die gesammte Szene 100 mal rendern muss um alle Depth-Maps zu generieren, wie lässt sich das mit dem den vielen Depth-Maps im Fragement-Shader am besten lösen?!

Ich meine afaik unterstützten die meisten GraKas ja nur 8 Texture-Layer. Und wenn ich schon eine Diffuse-Map, Normal-Map, Occlusion-Map und Depth-Map für das Deferred-Shading verwende bleiben mir nur noch 4 Layer für die Shadow-Maps.
Oder kann man im Shader weit aus mehr Texturen verwenden? afaik unterstützt DX10 bereits unlimitierte Anzahl Texturen, dann müsste OpenGL 4 das doch ähnlich unterstützten, oder?!

Und wie kann man elegant auf die Texturen zu greifen? Ich meine wenn ich 100 Shadow-Maps habe (nur rein theoretisch) dann will ich nicht 100 verschiedene "sampler2D" variablen im Shader Code verwenden müssen.
Kann man also bei GLSL auch bei Samplern ein 'uniform Array' verwenden? Ein Array für Shadow-Cube-Maps und ein Array für 'Normale' Shadow-Maps.

Ich hoffe jemand von euch kann mir da etwas weiter helfen :)

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

2

26.02.2012, 21:14

Ich kann dir leider weder sagen wie man es verwendet noch ob es in deinem Fall weiterhilft.

Aber es scheint in GLSL die Typen "sampler1DArray", "sampler2DArray", "sampler1DArrayShadow", "sampler2DArrayShadow" und "sampler2DMSArray" zu geben.

EDIT:
Hier steht was dazu:
http://www.opengl.org/registry/specs/EXT/texture_array.txt

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Spiele Programmierer« (26.02.2012, 23:16)


David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

3

26.02.2012, 23:10

Eine Möglichkeit ist ein Texturatlas für alle Shadowmaps zu verwenden. Eine andere Möglichkeit ist der triviale Ansatz:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
for each light l
  clearShadowMap(s)

  for each object o
    renderToShadowMap(o, l, s);

  for each object o
    lightInteraction(o, l, s);


Allerdings sind derart viele schattenwerfende Lichter eher unüblich. Es macht meißt Sinn die maximale Anzahl einzuschränken.
@D13_Dreinig

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »David_pb« (26.02.2012, 23:26)


Legend

Alter Hase

Beiträge: 731

Beruf: Softwareentwickler

  • Private Nachricht senden

4

27.02.2012, 09:27

Jep, es heisst schön pro Lichtquelle abwägen, ob deren Schatten wirklich bemerkbar ist oder nicht.
"Wir müssen uns auf unsere Kernkompetenzen konzentrieren!" - "Juhu, wir machen eine Farm auf!"

Netzwerkbibliothek von mir, C#, LGPL: https://sourceforge.net/projects/statetransmitt/

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

5

27.02.2012, 11:27

Jaja, schon klar. In meinem Editor soll man dann auswählen können welche Lichtquelle Shadow-Mapping anwenden wird und welche nicht. Ferne sollen Lichtquellen die zuweit vom Betrachter entfernt sind,
aus diesem Verfahren dynamisch ausgeschlossen werden können.
Aber in einigen Szenen werde ich dann schon mal auf 8 Lichtquellen kommen (von denen ja nicht zwangsläufig jede Shadow-Map in jedem Frame aktuallisiert werden muss). Da wären dann 8 Texture layer schon viel zu wenig.
Allerdings habe ich auf der OpenGL Man Page gelesen, dass mit OpenGL 3.0+ der Standard einen Texture-Support von mind. 48 Textur-Layern gewärleistet sein muss.

Bleibt nur noch meine Frage: ob ich bei uniform samplern auf arrays verwenden kann? Also so was:

C-/C++-Quelltext

1
2
3
4
5
#define SHADOWMAP_COUNT_2D 8
#define SHADOWMAP_COUNT_CUBE 8
uniform sampler2D ShadowMaps2D[SHADOWMAP_COUNT_2D];
uniform samplerCube ShadowMapsCube[SHADOWMAP_COUNT_CUBE];
/* ... */

PS: Die Idee mit dem Texture-Atlas hatte ich auch schon, aber was wenn der Framebuffer dann mal größer ist, als der OpenGL Render Context? D.h. Screen-Resolution ist 1024x768 und der Texture-Atlas ist 2048x2048 groß.
Kann da dann überhaupt reingerendert werden? Bei DX9 hatte ich bei so was jeden Falls mal Probleme.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

6

27.02.2012, 11:45

PS: Die Idee mit dem Texture-Atlas hatte ich auch schon, aber was wenn der Framebuffer dann mal größer ist, als der OpenGL Render Context? D.h. Screen-Resolution ist 1024x768 und der Texture-Atlas ist 2048x2048 groß.


Was für ein Problem siehst du denn dort? Im Allgemeinen ist ja ohnehin immer nur ein kleiner Teil des Atlas relevant. Was für ein Ansatz verwendest du für den Renderer bisher?
@D13_Dreinig

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

27.02.2012, 11:59

Ich würd wohl eher Texture Arrays benutzen. Die Anzahl der nötigen Passes lässt sich dann reduzieren, indem man möglichst viele Shadow Maps in einem Pass rendert (Im GeometryShader Dreiecke auf die verschiedenen Render Targets dispatchen. Ich weiß leider nicht wie genau das in OpenGL geht. In Direct3D gibt's dafür SV_RenderTargetArrayIndex). Natürlich kann man auch damit nur bedingt Performance gut machen.
Abgesehen davon, machen so extrem viele Shadowmaps natürlich kaum Sinn, weil das viel zu langsam werden wird.

LukasBanana

Alter Hase

  • »LukasBanana« ist der Autor dieses Themas

Beiträge: 1 097

Beruf: Shader Tools Programmer

  • Private Nachricht senden

8

27.02.2012, 13:53

Was ist denn eine realistische Anzahl an Shadow-Maps? Wenn's weniger ist als 4 kann ich auch einfach nur eine verwenden (sowas wie ne Taschenlampe) und den Rest mache ich dann doch mit Lightmaps.

Bis jetzt habe ich immer nur mit einer Lichtquelle eine Shadow-Cube-Map verwendet.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

9

27.02.2012, 13:55

Was ist denn eine realistische Anzahl an Shadow-Maps?

Das hängt natürlich von deiner Anwendung ab.
100 würd ich jetzt aber jedenfalls mal als sehr utopisch einstufen...

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

10

27.02.2012, 14:11

Im Allgemeinen reichen einige wenige Lichter die zeitgleich Schatten werfen. Das können z.B. ein Hauptlicht (Sonne etcpp) + die 3 nächstgelegenen Point/Spotlights sein. Je nach Rendermodell kannst du dann deine Schatten dann in ein RGBA8 Target akkumulieren. Lightmaps verwendet heute sogut wie niemand mehr (abgesehen vielleicht von mobilen Anwedungen u.Ä.).
@D13_Dreinig

Werbeanzeige