[DX9] Schnelles dynamisches Licht

Für Fragen zu Grafik APIs wie DirectX und OpenGL sowie Shaderprogrammierung.
Antworten
DomiOh
Establishment
Beiträge: 132
Registriert: 08.10.2002, 14:44

[DX9] Schnelles dynamisches Licht

Beitrag von DomiOh »

Hallo,

vielleicht hat von euch ja jemand eine Idee.
Ich versuche eine relativ große Indoor-Szene zu rendern. Diese beinhaltet immer ca. 20-25 Lichter, die ich gerne dynamisch hätte, da Lightmaps aufgrund zu geringer Auflösung keine Option sind.
Das Problem: Das ganze ist als Forward-Rendering ziemlich langsam und deferred Shading benötigt schon allein auf langsameren Systemen (z.B. GeForce 7800) viel zu viel Zeit. Selbst auf einer ATI 4850 ist deferred Shading nicht gerade der Hit.

Wenn jemand eine Idee dazu hat, immer her damit..
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: [DX9] Schnelles dynamisches Licht

Beitrag von Aramis »

Da gibt's keine Master-Lösung für, außer den üblichen Verdächtigen:
  • Agressives Culling und (geschicktes) Batching
  • Simulieren von entfernten Lichtern durch Sprites oder Decals.
DeRaaZuul
Beiträge: 15
Registriert: 19.03.2008, 00:25

Re: [DX9] Schnelles dynamisches Licht

Beitrag von DeRaaZuul »

Wie währs vllt mit Light Indexed Deferred Rendering ?Ich habs zwar noch nicht selbst implementiert aber mirs genau angesehen.Lief auf meinen Rechner sehr schnell und ich hab eine 8600GT, kannst es ja testen , beim Link ist ne Demo :
Link
Benutzeravatar
Schrompf
Moderator
Beiträge: 4854
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [DX9] Schnelles dynamisches Licht

Beitrag von Schrompf »

Die einzige Methoe, die mir dazu einfällt, ist wirklich das "agressive Culling" - sprich pro Mesh so weit wie möglich Lichtquellen ausschließen, die das Zielobjekt definitiv nicht beeinflussen können. Von den übrigen dann nach Möglichkeit viele in einen Pass zusammenfassen und additiv drüberrendern. Die Methode versagt natürlich bei sehr kleinen Lichtquellen (dann siehe Deferred Renderer) oder bei sehr großen Lichtquellen (dann siehe "Pech gehabt").

Bye, Thomas
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Zudomon
Establishment
Beiträge: 2254
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: [DX9] Schnelles dynamisches Licht

Beitrag von Zudomon »

Also zu dem "agressive Culling" kann ich nur sagen (falls ich das jetzt nicht verwechsle), das man dadurch auch nur begrenzt beschleunigen kann. Hatte bei meinem Defered Shading erst nur die Bounding-Box benutzt zum cullen. Um da wirklich nur jeden beleuchteten Pixel zu betrachten, der hinterher pro Lichtquelle in Frage kam, hatte ich dann nochmal mit einer Boundingsphere jeden Pixel im Stencil markiert, der noch zum Licht gehören kann. So weit ich mich erinnere, hatte das aber nichts mehr gebracht, und es war eigentlich genauso schnell, nur die Bounding Box zu benutzen. Vielleicht war die Implementierung auch nicht so gut. Ich will nicht zu der Technik entmutigen, sondern nur meine Erfahrung einbringen, damit man sich ein besseres Bild machen kann.

Aber das Indexed Deferred Rendering ist für mich neu und der absolute Hammer!! Das normale Defered Shading ist schon sehr gut und besonders bei vielen kleinen Lichtquellen zu empfehlen. Allerdings braucht man halt gigantisch viel Speicher, und umso komplexer Materialeigenschaften usw. werden, steigt der Speicherdurchsatz dementsprechend. Antialiasing usw. bleibt dadurch leider auf der Strecke.
Stattdessen nur die Indexe des Lichts in eine Textur oder so speichern, sollte dann natürlich um einiges besser sein. Wenn ich gerade drüber nachdenke, dann sehe ich in der Technik gerade sehr große Parallelen zu meiner Texturierungsmethode. Eigentlich ist das nämlich genau das gleiche, wobei dann statt Texturen Licht aufgetragen wird.
Ich glaube, ich werde das mal ebend einbauen und schauen, wie es wirkt!!

Gruß
Zudo
DomiOh
Establishment
Beiträge: 132
Registriert: 08.10.2002, 14:44

Re: [DX9] Schnelles dynamisches Licht

Beitrag von DomiOh »

also bei mir persönlich funktioniert Deferred Shading nicht so besonders.
Schon bei 6 Lichtern habe ich kaum noch rechenzeit.
Das Rendern auf die 3 Rendertargets "frisst" verdammt viel Zeit bei meinem Renderer.
Dabei wird gar nicht viel gemacht außer die Albedo-Textur auf ein RT, die Normalen auf ein 2.RT und die Tiefe (z/w) auf das 3.
Komisch, wieso das bei mir so langsam ist...
Benutzeravatar
Zudomon
Establishment
Beiträge: 2254
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: [DX9] Schnelles dynamisches Licht

Beitrag von Zudomon »

Seltsam, also bei mir hatte das damals recht gut geklappt.

Meine RT Targets (also jetzt nur die fürs DS) waren:
D3DXCreateTexture(D3DDEV, SizeX, SizeY, 0, D3DUSAGE_RENDERTARGET, D3DFMT_A32B32G32R32F, D3DPOOL_DEFAULT, iTexture);
D3DXCreateTexture(D3DDEV, SizeX, SizeY, 0, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, iTexture);
D3DXCreateTexture(D3DDEV, SizeX, SizeY, 0, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, iTexture);
D3DXCreateTexture(D3DDEV, SizeX, SizeY, 0, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT, iTexture);

Habs gerade nochmal ausgeführt. Also auf meiner gt9600 siehts folgendermaßen aus:
defered.jpg
Sichtbare Lichtquellen im Moment des Screenshots: 289
Das ganze bei 13 FPS
Jede Plasmagunrauchpartikel ist eine Lichtquelle. Allerdings werfen diese Lichter keinen Schatten.

Das ist jetzt allerdings das Standard Defered Shading.
Benutzeravatar
Schrompf
Moderator
Beiträge: 4854
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: [DX9] Schnelles dynamisches Licht

Beitrag von Schrompf »

Wie hast Du die Daten auf die Rendertargets verteilt? Und Du kannst natürlich keine MRTs benutzen, wenn Deine RTs unterschiedliche Bytegrößen pro Pixel haben. Und Antialiasing stirbt auch.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
Zudomon
Establishment
Beiträge: 2254
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: [DX9] Schnelles dynamisches Licht

Beitrag von Zudomon »

@Schrompf
Hatte es ja wegen DomiOh gepostet. Antialiasing ist dabei nicht möglich. Aber dieses Indexbasierte ist krass, würde das gerne mal ausprobieren.
MRT? Meinst du, dass er gleichzeitig in mehrere Targets rendert? Falls ja, also bei mir geht es, die können alle verschiedene Formate haben.
Allerdings war das noch DX9. Vielleicht ist es bei 10 anders, das weiß ich noch nicht.
Puh... Verteilung, da fragste mich was.
So wie es aussieht, hatte ich nur die drei beiden Texturen benutzt. Das angebene Format müsste stimmen, wobei es mich im nachhinein etwas wundert, dass ich da mit 8888 Bit ausgekommen bin.

Code: Alles auswählen

  output.col0 = float4(IN.rpos.z / IN.rpos.w, IN.tex1.r * tex.r, IN.tex1.g * tex.g, IN.tex1.b * tex.b);
  output.col1 = float4(nor.x, nor.y, nor.z, 1);
  output.col2 = tex;
  output.col2.w = tex2D(S_SPECULAR, IN.tex0).r;
Also in ersten RT war Position und die Farbe (Textur * Vertexcolor) gespeichert
In dem zweiten die Normale und in dem dritten RT nochmal die Textur und im Alphakanal die Specularkomponente.
Frag mich nicht, warum ich die Textur da scheinbar doppelt hatte. Könnte sein, dass das in den anderen Versionen dann weg optimiert war.

Gruß
Zudo

PS: Wie konnte man nochmal sagen, dass das Syntaxhighlighting c ist für den geposteten Code?
DomiOh
Establishment
Beiträge: 132
Registriert: 08.10.2002, 14:44

Re: [DX9] Schnelles dynamisches Licht

Beitrag von DomiOh »

Ja, ich hatte gleichzeitig in 3 Targets gerendert

Für Depthmap D3DFMT_R32F
für Normals D3DFMT_G16R16F (Z-Normale wird aus X/Y berechnet)
für Albedo D3DFMT_A8R8G8B8

bei meiner 4850 stirbt das ganze schon bei 30 Lichtquellen, dann habe ich nur noch knapp 55 Frames und überhaupt kein Platz (Zeit) mehr für die GameLogic.
Benutzeravatar
Zudomon
Establishment
Beiträge: 2254
Registriert: 25.03.2009, 07:20
Kontaktdaten:

Re: [DX9] Schnelles dynamisches Licht

Beitrag von Zudomon »

Beim Defered Shading ist es sehr wichtig, wie groß die Lichtquellen im Endeffekt sind. Wenn man 5 Lichtquellen hat, die Bildschirmfüllend sind, ist das langsamer, als wenn man 200 Lichtquellen hat, die nur wenige Pixel groß sind.
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: [DX9] Schnelles dynamisches Licht

Beitrag von Aramis »

PS: Wie konnte man nochmal sagen, dass das Syntaxhighlighting c ist für den geposteten Code?
Mit [ code=c ].
glassbear
Establishment
Beiträge: 324
Registriert: 08.04.2003, 18:09
Alter Benutzername: Enrico_
Echter Name: Enrico
Wohnort: San Diego
Kontaktdaten:

Re: [DX9] Schnelles dynamisches Licht

Beitrag von glassbear »

DomiOh hat geschrieben:da Lightmaps aufgrund zu geringer Auflösung keine Option sind.
Äh, die Auflösung der Lightmaps erhöhen?!
Ein Hoch auf uns Männer... Auf die Frau, die uns HAT ( oder hat, und nicht weiß, dass sie uns hat ) ...auf die Idiotinnen ... besser gesagt VOLLPFOSTINNEN ... die uns hatten und uns verloren haben ... und auf die GLÜCKLICHEN, die das Vergnügen & Glück haben werden uns kennenzulernen!
Antworten