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

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

21

06.02.2012, 09:13

Multipass-Rendering mit verschiedenen Shadern ist aber nicht das selbe wie den gleichen Shader bei einem einzelnen Pass mehrfach laufen zu lassen. Und das ist sicherlich eher das, was er meinte.
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]

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »BlueCobold« (06.02.2012, 09:27)


FSA

Community-Fossil

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

22

06.02.2012, 19:57

Also der Link hat mir einiges verständlicher gemacht. Danke :thumbsup:
Heißt das etwas das ich alles #(anzahl der Lichter) mal rendern muss? Also wenn ich mehrere Leuchtstoffröhren in meinem Level habe dann müsst ich die Szene ja 100 mal rendern :huh: Aber ein paar Sachen sind mir noch unklar zb das wo da der Backbuffer und so verändert werden. Da komme ich nicht mit :/ Und wenn ich dann meine Szene gerendert habe, muss ich dann alles zusammenfügen? Ich kann mir nciht vorstellen wie ^^
Dnake

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

23

06.02.2012, 20:46

Für sehr große Anzahl an Lichtquellen gibt es Deferred Lighting/Shading.
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]

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

24

06.02.2012, 21:13

Also der Link hat mir einiges verständlicher gemacht. Danke :thumbsup:
Heißt das etwas das ich alles #(anzahl der Lichter) mal rendern muss? Also wenn ich mehrere Leuchtstoffröhren in meinem Level habe dann müsst ich die Szene ja 100 mal rendern :huh: Aber ein paar Sachen sind mir noch unklar zb das wo da der Backbuffer und so verändert werden. Da komme ich nicht mit :/ Und wenn ich dann meine Szene gerendert habe, muss ich dann alles zusammenfügen? Ich kann mir nciht vorstellen wie ^^
Dnake


Ja wenn du einen Forward-Ansatz machen willst dann musst du theoretisch jedes Objekt für jede Lichtquelle rendern. Da das natürlich, in vielen Fällen, vollkommen unsinnig ist, weil du ja meißtens gar nicht alle Lichtquellen siehst, solltest du die einzelnen Lichtquellen cullen. Also schauen welche Lichter überhaupt sichtbar sind und dann nur für diese die Lichtinteraktion berechnen (Pseudocodemäßig):

C-/C++-Quelltext

1
2
3
4
5
enable additive blending

foreach visible object o
  for each visible light l
    render(o, l)


Im schlimmsten Fall sind das natürlich alle Lichter mit allen Objekten. Aber der Fall sollte im Normalfall nicht auftreten. Trotzdem ist diese Abhängigkeit von Geometrie und Lichtern nicht besonders erstrebenswert. Daher gibt es Deferred-Ansätze, die die Berechnung der Beleuchtung von der Darstellung der Objekte entkoppeln. Dabei wird ein sogenannter Geometriepuffer verwendet, der alle Materialeigenschaften enthält (z.B. Albedo, Normalen, ...). Wenn der G-buffer aufgebaut wurde werden alle Lichter gezeichnet und mithilfe der im G-buffer gespeicherten Materialinformationen die Szenenbeleuchtung berechnet:

C-/C++-Quelltext

1
2
3
4
5
foreach visible object o
  render material properties to g-buffer

for each visible light l
  frabebuffer += brdf(l, g-buffer)
@D13_Dreinig

Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

25

06.02.2012, 21:14

Dann kann man aber keine transparenten Objekte mehr rendern.
Ich denk mal, dass Deferred Lighting zwar in der Theorie ne feine Sache ist, aber in der Praxis weiß ich nicht wie weit das praktikabel ist. :hmm:

Die ganzen Texturen für den deferred Shader freßen ja auch einiges an Speicher.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

26

06.02.2012, 21:16

Dann kann man aber keine transparenten Objekte mehr rendern.
Ich denk mal, dass Deferred Lighting zwar in der Theorie ne feine Sache ist, aber in der Praxis weiß ich nicht wie weit das praktikabel ist. :hmm:

Die ganzen Texturen für den deferred Shader freßen ja auch einiges an Speicher.


Deferred Rendering wird doch von quasi fast allen aktuellen Renderengines verwendet...
@D13_Dreinig

FSA

Community-Fossil

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

27

06.02.2012, 21:17

Machen wir erstmal kleine Schirtte ;) Ich steige gerade in Beleuchtung mit Shadern ein. Das ist ein Thema von 3 was ich granicht mag :D Also ich bleib erstmal bei Multipass rendering.
Also wie funktioniert das genau jetzt? Z.B. Ich habe 3 Lichter. Und 2 Würfel. Ich render jetzt alle 3 Lichter bzw 3 mal die Szene mit einem Licht pro Durchgang. Und wo speichere ich den Output des erstem und zweitem Durchgangs?
@David_pb ich verstehe was du meinst habe aber schwierigkeiten mir das vorzustellen, denn der Pseudocode ist für mich Kryptisch ^^ Nein also ein wenig verstehe ich ihn aber ich frag lieber nochmal ;) Täusche ich mich oder ist das C#? Ich bin in C++ tätig ;)
@Spiele_programierer: Ja ich verwende transparente Objekte ;)

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »FSA« (06.02.2012, 21:23)


Beiträge: 1 223

Wohnort: Deutschland Bayern

Beruf: Schüler

  • Private Nachricht senden

28

06.02.2012, 21:19

Und wie machen die das dann mit transparenten Objekten?
Ich vermute jetzt einfach mal das FSA auch solche in seiner Szene hat.

Bei gutem Frustumculling und Early-Z fällt der typische Vorteil von deferred Shading auch weg.

EDIT:
Du speicherst die gar nicht seperat, sondern addierst normal mit Blending direkt hinzu.
Da das ebenfalls bei transparenten Objekten Probleme machen kann, musst du dich entweder mit RenderToTexture beschäftigen oder eine SinglePass Verfahren verwenden.

Ist im Prinzip auch nicht schwerer, du musst nur die einzelnen Lichtwerte im Shader aufaddieren.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Spiele Programmierer« (06.02.2012, 21:26)


FSA

Community-Fossil

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

29

06.02.2012, 21:26

@Spieleprogrammierer: Also heißt das mit dem Singlepassverfahren, das ich im Shader direkt alle lichtquellen render, dann 3 Werte habe(für 3 Lichter) und die Addiere und durch 3 teile. Hab ich das richtig verstanden?

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

30

06.02.2012, 21:27

Ich render jetzt alle 3 Lichter bzw 3 mal die Szene mit einem Licht pro Durchgang. Und wo speichere ich den Output des erstem und zweitem Durchgangs?

In einem Buffer. Du brauchst auch jeweils nur das Ergebnis des letztens Durchgangs, weil Durchgang X immer das Ergebnis mit dem aus X-1 verrechnet (sofern X-1 existiert).
Du teilst da gar nix, du addierst die alle auf, wie Lichter sich eben auch physikalisch nur addieren. Du willst ja keine Mittelwerte bilden.

Täusche ich mich oder ist das C#? Ich bin in C++ tätig ;)

Nein, das ist Pseudo-Code.
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]

Werbeanzeige

Ähnliche Themen