[DX9] Schnelles dynamisches Licht
[DX9] Schnelles dynamisches Licht
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..
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..
- Aramis
- Moderator
- Beiträge: 1458
- Registriert: 25.02.2009, 19:50
- Echter Name: Alexander Gessler
- Wohnort: 2016
- Kontaktdaten:
Re: [DX9] Schnelles dynamisches Licht
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.
Re: [DX9] Schnelles dynamisches Licht
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
Link
- Schrompf
- Moderator
- Beiträge: 5157
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: [DX9] Schnelles dynamisches Licht
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
Bye, Thomas
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Re: [DX9] Schnelles dynamisches Licht
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
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
Re: [DX9] Schnelles dynamisches Licht
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...
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...
Re: [DX9] Schnelles dynamisches Licht
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:
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.
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:
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.
- Schrompf
- Moderator
- Beiträge: 5157
- Registriert: 25.02.2009, 23:44
- Benutzertext: Lernt nur selten dazu
- Echter Name: Thomas
- Wohnort: Dresden
- Kontaktdaten:
Re: [DX9] Schnelles dynamisches Licht
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.
Re: [DX9] Schnelles dynamisches Licht
@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.
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?
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;
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?
Re: [DX9] Schnelles dynamisches Licht
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.
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.
Re: [DX9] Schnelles dynamisches Licht
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.
- Aramis
- Moderator
- Beiträge: 1458
- Registriert: 25.02.2009, 19:50
- Echter Name: Alexander Gessler
- Wohnort: 2016
- Kontaktdaten:
Re: [DX9] Schnelles dynamisches Licht
Mit [ code=c ].PS: Wie konnte man nochmal sagen, dass das Syntaxhighlighting c ist für den geposteten Code?
-
- 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
Äh, die Auflösung der Lightmaps erhöhen?!DomiOh hat geschrieben:da Lightmaps aufgrund zu geringer Auflösung keine Option sind.
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!