Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Mo Mai 20, 2024 00:12

Foren-Übersicht » Programmierung » Shader
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Multi Texture Lookup
BeitragVerfasst: So Dez 08, 2013 00:21 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey Leute,

ich hab mal wieder n Shader-Problem und zwar hab ich mir einen Deferred Renderer gebaut. Der muss im Fragment-Shader 7 Lookups in verschiedenen Texturen machen. TexCoord ist bei allen Lookups gleich. Kann ich die Lookups da irgendwie optimieren? Ich hatte an ein Texture2D-Array gedacht, aber da müsste ich die ja erst von der Graka in den RAM laden und dann als richtiges Texture-Array wieder auf die Graka packen. Kann ich das vlt. schon irgendwie beim generieren der Texturen optimieren, sodass ich's dann beim Lookup einfacher hab?

MfG & Thx Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Multi Texture Lookup
BeitragVerfasst: Mo Dez 09, 2013 08:26 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 06, 2005 18:34
Beiträge: 362
Wohnort: Hamburg
7 Lookups hört sich nach 7 Texturen im G-Buffer an … was speicherst du denn da alles? Ich komme wunderbar mit 4 aus (Diffuse Color, Position, Normal, Specular Color).
Ich weis dass man da noch ohne Probleme weitere aufnehmen könnte für hübsche Effekte und so, aber das sind denk ich die grundlegenden.

Eine Möglichkeit direkt in ein Texture Array zu schreiben (außer evtl mit Compute shadern) ist mir nicht bekannt. Ich würde versuchen die Anzahl der Texturen zu minimieren.
Du könntest z.B. werte packen. Z.B. Werte zw. -1 und 1 in ein 16bit float und dann jeweils 2 in einem kanal speichern. Dabei wirst du aber unweigerlich Genauigkeit verlieren. Ich hab mal ausprobiert alle 3 Komonenten einer Normale in einen Kanal zu packen, das war aber ne blöde Idee :)

Du solltest auch darauf achten für die Beleuchtung den Depth-Buffer der Scene zu benutzen um Fragmente der Light-Volumes, die nicht gezeichnet werden, auch nicht beachten zu müssen.
Zusätzlich könntest du den Stencil buffer benutzen um Pixel zu maskieren die tatsächlich in einem Light-Volume liegen, dadurch würdest du das überflüssige Berechnen eines Haufen pixels durch 2 maliges Zeichnen des Volumes in den Stencil buffer ersetzen. siehe http://ogldev.atspace.co.uk/www/tutoria ... ial37.html

_________________
Der Mensch hat neben dem Trieb der Fortpflanzung und dem zu essen und zu trinken zwei Leidenschaften: Krach zu machen und nicht zuzuhören. (Kurt Tucholsky)
Schwabbeldiwapp, hier kommt die Grütze. (Der Quästor)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Multi Texture Lookup
BeitragVerfasst: Mo Dez 09, 2013 13:53 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Position kann man sich auch sparen, wenn man die Position aus dem Depthwert und der X/Y-Position des Pixels berechnet


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Multi Texture Lookup
BeitragVerfasst: Mo Dez 09, 2013 17:35 
Offline
DGL Member
Benutzeravatar

Registriert: Di Apr 29, 2008 18:56
Beiträge: 1213
Programmiersprache: Delphi/FPC
Hey,

@Shaijan:
ich hab folgende Buffer:
Code:
  1. Position.xyz, shadow
  2. Color.rgba or ColorMap.rgba
  3. Normal.uvw, material.shininess
  4. material.ambient.rgba
  5. material.diffuse.rgba
  6. material.specular.rgba
  7. (lightmap.rgb * material.emission.rgb) * lightmap.a * material.emission.a, GlowFactor

Das mit dem packen ist ne gute Idee. Bei den ganzen Farben brauch ich das eh nich so genau. Hast du nen guten Algo dafür? Ich hab auf anhieb den hier gefunden:
Code:
  1. float pack(vec2 input, int precision)
  2. {
  3.     vec2 output = input;
  4.     output.x = floor(output.x * (precision - 1));
  5.     output.y = floor(output.y * (precision - 1));
  6.     return (output.x * precision) + output.y;
  7. }
  8.  
  9. vec2 unpack(float input, int precision)
  10. {
  11.     vec2 output = vec2(0.0);
  12.     output.y = input mod precision;
  13.     output.x = floor(input / precision);
  14.     return output / (precision - 1);
  15. }

@OpenglerF:
Die Position brauch ich doch aber für die Lichtbrechnung im ModelView. Wenn ich Fragment.xy + depth nehme dann ist das ja im ProjectionView. Die Matrix zum zurück rechnen hab ich nicht mehr, oder kann ich die Normalen vorher mit der Projektions-Matrix multiplizieren und dann einfach alles im ProjectionView rechnen?


€: Hab das mit dem packen grad mal durchgerechnet. Wenn ich mit ner Genauigkeit von 2^8 = 256 packe, dann hab ich einen maximalen Wert von 2^8^2 = 65535. Bei half-precision (16bit) floats werden Werte zwischen 32769 und 65536 auf ein Vielfaches von 32 gerundet. Heißt die beiden Werte würden unterschiedlich genau gespeichert werden: einer mit 8bit und einer mit 3bit = 10bit fraction + 1bit = 11bit. Wenn ich hingegen eine "normale" Textur mit 16bit Kanälen nutze, dann hab ich die vollen 16bit zur Verfügung und ich hätte kein Verlust. Natürlich müsste dann die pack und unpack Function noch etwas angepasst werden:
Code:
  1. float pack(vec2 input)
  2. {
  3.     vec2 output = input;
  4.     output.x = floor(output.x * 255);
  5.     output.y = floor(output.y * 255);
  6.     return (output.x * 256 + output.y) / 65535;
  7. }
  8.  
  9. vec2 unpack(float input)
  10. {
  11.     input *= 65535;
  12.     return vec2(input / 256, input mod 256) / 255;
  13. }

Seh ich das richtig, oder hab ich noch irgendwo nen Denkfehler?

MfG Bergmann.

_________________
Aktuelle Projekte: BumpMapGenerator, Massive Universe Online
Auf meiner Homepage gibt auch noch paar Projekte und Infos von mir.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Multi Texture Lookup
BeitragVerfasst: Mo Dez 09, 2013 22:20 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Die Buffer scheinen mir deutlich überdimensioniert.
Welcher Wer steht überhaupt in "shadow"? Unter den Werten des 7. Buffers kann ich mir ebenfalls nicht vorstellen.
Ich denke nicht, dass es sinnvoll ist, die Materialwerte in RGB zu speichern. (Außerdem ist der Alphawert sowieso ungenutzt)
Ich würde besser nur einen Luminanzwert speichern und die Farbe weglassen. Alleine physikalisch betrachtet, ergibt es keinen Sinn. Das Licht trifft auf eine Oberfläche auf und wird in Teilen absorbiert und der rest wieder zurückreflektiert. Das gibst du bereits mit der "Color" an. Glanzlicht ist einfach die "Rauheit". Den Ambientwert würde ich ebenfalls nicht im Material hinterlegen sondern diesen Wert global für die Szene setzen. Er hat ja den Sinn, das indirekte Licht der Natur zu ersetzen und das ist auch nicht an Materialien gebunden sondern wird durch die Umgebung bestimmt. Auch den Diffusewert kann man dann noch mathematisch herauskürzen, in dem man die Farbe einfach schon damit vormultipliziert und man den Glanzlichtparameter dadurch teilt. Bei einen Licht führt man ja im Prinzip folgende Rechnung aus:
PixelFarbe = Color * Diffuse * SceneAmbient + Color * Diffuse * Licht + Color * Specular * LichtReflektion
Du kannst "Color * Diffuse" ausklammern:
PixelFarbe = (Color * Diffuse) * SceneAmbient + (Color * Diffuse) * Licht + (Color * Diffuse) * (Specular / Diffuse) * LichtReflektion

Jetzt gibt es nur noch zwei Pixelweise-Parameter: (Color * Diffuse) und (Specular / Diffuse)
Wenn die Modelldaten unter Berücksichtigung dieser kleinen Änderung erstellt worden sind, fällt nichtmal weiterer Rechenaufwand an.

Die Position könnte man über die Inverse der ViewMatrix(Perspektive+Kamera) zurückrechnen aus den Pixelkoordinaten. Ob das performancemäßig sinnvoll ist, weiß ich aber nicht. Wenn der Shader aber durch den Durchsatz der Textureunit limitiert ist, wäre es vorstellbar.

Zum Packing: Seit längerer Zeit gibt es ja auch Integerberechnungen auf der GPU. Die besten Packraten wirst du erzielst du vermutlich, wenn du es einfach mit Shift und Bitweisen And die Komponenten extrahirst, wie du es auch auf der CPU machen würdest.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Multi Texture Lookup
BeitragVerfasst: Mo Dez 09, 2013 23:24 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 06, 2005 18:34
Beiträge: 362
Wohnort: Hamburg
Seit GLSL 4.10 gibts ein paar packing Funktionen (pack/unpack).
In GLSL 3.30 kann man die gut emulieren weil es ab da Funktionen zum umwandeln von floats in deren bit-darstellung und andersrum gibt.
Alles drunter habe ich mich selber noch nicht mit beschäftigt.

Ich hab das für mein aktuellen Projekt einmal gemacht für GLSL 3.30+ (siehe Anhang)
Vll hilft dir das ja weiter. Neben den von GLSL 4.10 bereitgestellten Versionen für 2x16 und 4x8 habe ich auch 3x10 hinzugefügt, die ich z.B. für meinen Versuch mit den Normalen benutzt habe.
Die Umwandlungen sind ziemlich straigt forward und ich habe keine Ahnung ob man da noch irgendwas tricksen kann :)

Wie OpenglerF auch schrieb:
Die Ambient Farbe halte ich auch für zu viel, die würde ich global einstellen.
Allerdings würde ich die Spec Color auch extra speichern, da das einem Artist ein schönes Maß an Freiheit gibt. Muss man halt wissen ob man die Kosten dafür wirklich zahlen will.


Dateianhänge:
pack.txt [3.39 KiB]
412-mal heruntergeladen

_________________
Der Mensch hat neben dem Trieb der Fortpflanzung und dem zu essen und zu trinken zwei Leidenschaften: Krach zu machen und nicht zuzuhören. (Kurt Tucholsky)
Schwabbeldiwapp, hier kommt die Grütze. (Der Quästor)
Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Multi Texture Lookup
BeitragVerfasst: Di Dez 10, 2013 07:14 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mai 29, 2006 21:13
Beiträge: 142
Wohnort: Ballenstedt/Sachsen-Anhalt
Ich klemm mich mal kurz rein, wenn ich schonmal wach bin :mrgreen:
OpenglerF hat geschrieben:
Die Buffer scheinen mir deutlich überdimensioniert.
Welcher Wer steht überhaupt in "shadow"? Unter den Werten des 7. Buffers kann ich mir ebenfalls nicht vorstellen.
Weniger hätte ich auch gern. Lach nicht, ich bin grad an einer Möhre, die nur 4 Buffer kann, muss das mal so einkürzen dass alle weiteren nicht mehr wichtig sind, nur noch "verschönern" ;-)
"shadow" ist der Verdeckungswert aus der Shadowmap (1->hell .. 0->Kernschatten), und der letzte Buffer ist die vormultiplizierte Emissive Map (vgl. Leuchttafeln).

OpenglerF hat geschrieben:
Ich denke nicht, dass es sinnvoll ist, die Materialwerte in RGB zu speichern. (Außerdem ist der Alphawert sowieso ungenutzt).
Hatte ich auch mal gedacht, dann aber in die Materialsammlung geguckt und festgestellt dass man fast nichts nur damit darstellen kann... Ambient hast du natürlich Recht, das ist vom globalen Pseudolicht, das kann man rausmultiplizieren. Die anderen brauchen wir aber noch ihn Rohform, um sie im LA-Pass mit den jeweiligen Lichtquelleneigenschaften zu verrechnen. Sonst wäre das so wie du beschreibst einfacher, ja.

Die Positionsberechnung wäre dann (Pseudocode aus'm Gedächtnis):
Code:
  1. vec2 screenspace = gl_TexCoord.st * 2 - vec2(1,1); // auf -1..1
  2. vec3 pos = ( vec4(screenspace, depth, 0) * matrixInvert(gl_ProjectionMatrix) ).xyz

Oder? Hatten wir mal kurz so drin, stimmte aber irgendwie nicht. Deswegen wieder diese doofe Map...

_________________
Gott sei Dank bin ich Atheist!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Multi Texture Lookup
BeitragVerfasst: Di Dez 10, 2013 14:10 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Emissive Color ist möglicherweise sinnvoll. Ich glaube, mit minimalen Einsparungen ganz ohne Packing sollten hier 4 Buffer im Moment auch vollkommen reichen.

"Specular"-Farbe ist unnötig. Einfach weil es in der Realität außer vielleicht bei extra speziell hergestellten künstlichen Oberflächen keinen diesen Effekt nicht gibt. "Könnte man irgendwie irgendwann mal brauchen" ist eine schlechte Ausrede. Und wenn der Designer die Werte braucht für gute Ergebnisse, dann stimmt irgendetwas anderes mit dem Renderer nicht. Freiheiten sind gut und schön aber nur da, wo es auch Sinn machen.

Ich wollte außerdem nochmal schnell daraufhinweisen, dass mit Packing sämtliche Texturefilterung zum Supergau wird. Das ist zwar bei solchen Texturen zum Deferred Shading nicht unbedingt notwendig, könnte aber auch manchmal sinnvoll sein.
Ansatt Floats in Integer im Shader umzuwandeln, wäre es doch sinnvoller, gleich eine Integertexture zu erstellen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Multi Texture Lookup
BeitragVerfasst: Di Dez 10, 2013 23:01 
Offline
DGL Member
Benutzeravatar

Registriert: Di Sep 06, 2005 18:34
Beiträge: 362
Wohnort: Hamburg
Ich bin kein Experte auf dem Gebiet aber specular colors haben durchaus ihren Anwendungsfall, z.B. bei Metallen.
Hab vor ner Weile mal diesen Artikel gelesen über lighting in Ryse. Fand ihn zwar nicht besonders bahnbrechend, aber die benutzen auch spec colors, allem Anschein nach aber auch nur für Metalle und wie im Artikel beschrieben wenige vorgegebene Farbwerte.

_________________
Der Mensch hat neben dem Trieb der Fortpflanzung und dem zu essen und zu trinken zwei Leidenschaften: Krach zu machen und nicht zuzuhören. (Kurt Tucholsky)
Schwabbeldiwapp, hier kommt die Grütze. (Der Quästor)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Multi Texture Lookup
BeitragVerfasst: Mi Dez 11, 2013 14:50 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Mai 29, 2006 21:13
Beiträge: 142
Wohnort: Ballenstedt/Sachsen-Anhalt
Und man muss ihnen ja eins lassen: das Gameplay ist eher nix, aber Ryse sieht ziemlich toll aus.
Shaijan hat geschrieben:
Hab vor ner Weile mal diesen Artikel gelesen über lighting in Ryse. Fand ihn zwar nicht besonders bahnbrechend, aber die benutzen auch spec colors, allem Anschein nach aber auch nur für Metalle und wie im Artikel beschrieben wenige vorgegebene Farbwerte.
Die Idee mit dem was die "Roughness" nennen hatte ich auch schon, so als Verhältnis zwischen Diffuse und Specular. Das könnte sogar passen, ich bin jetzt auf 4 Maps ohne Specular runter und habe noch den Alphakanal der Diffusemap übrig.

_________________
Gott sei Dank bin ich Atheist!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Multi Texture Lookup
BeitragVerfasst: Mi Dez 11, 2013 15:54 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Zitat:
durchaus ihren Anwendungsfall, z.B. bei Metallen.

Nein, eigentlich nicht. Metalle sind auch nur ganz normale Objekte die Licht reflektieren.
Das es noch recht viele machen, ist wohl hauptsächlich historisch bedingt. Die Fixed Pipeline hatte augrund der eingeschränkten Möglichkeiten und Hardwaregegebenheiten volle Farben für Materiallien. Wenn man sich physikalisch den Effekt anschaut, dann gibt es dass einfach nicht.

"Roughness" ist eine gute Idee auch ein Schritt zur physikalischen Korrektheit. Ziemlich änlich, was ich vorhin bereits vorgeschlagen habe... "Color, Diffuse zusammenfassen"

Heute mit Shadern ist das alles möglich. Früher hat man sich in der Grafik scheinbar zu wenig an der Realität orientiert. Warum auch normales Alpha und Emission eigentlich Quatsch ist, hat Krishty hier mal schön erklärt: zfx.info\Premultiplied Alpha


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Multi Texture Lookup
BeitragVerfasst: Mi Dez 11, 2013 16:35 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Lack kann allerdings so einen Einfluss haben. Da kann die Specular-Color anders sein als die Diffuse-Color. Und das ist garnicht so selten! (nicht matte) Weihnachtskugeln haben diesen Effekt schon. Meist ist es da dann so, dass Specular im gegensatz zu Diffuse nicht Rot ist.

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Multi Texture Lookup
BeitragVerfasst: Mi Dez 11, 2013 16:45 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Ja, es gibt Ausnahmen.
Für Weihnachtkugelrendering wäre eh ein eigener spezieller Shader angebracht, wenn man wirklich gute Ergebnisse erzielen will. Man denke auch an die Reflektionen unten an einer CD. Es gibt halt auch spezielle Materialien die aus dem Muster fallen, die würde ich allerdings auch speziell behandeln und es nicht krankhaft versuchen, alles mit einen allgemeinen Fall abzudecken.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Multi Texture Lookup
BeitragVerfasst: Mi Dez 11, 2013 18:51 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Soweit ich das verstanden habe, ist das aber genau gegen den Sinn von Deferred Shading.

grüße

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy photostream
„Writing code is like writing poetry“ - source unknown


„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Multi Texture Lookup
BeitragVerfasst: Mi Dez 11, 2013 18:57 
Offline
DGL Member

Registriert: Do Dez 29, 2011 19:40
Beiträge: 421
Wohnort: Deutschland, Bayern
Programmiersprache: C++, C, D, C# VB.Net
Nein, Deferred Shading soll sicherstellen, dass (Licht)berechnungen nur einmal pro Fragment ausgeführt werden und nicht mehrmals, wenn die einzelnen Objekte getrennt gerendert werden. (Mehrere Objekte hintereinander können überzeichnet werden, dann wäre an der Stelle die Rechenarbeit umsonst gewesen.)
Alles über einen Kamm scheren, funktioniert eh nicht, beziehungweise würde es stark rinschränken.
Dinge wie transparente Objekte und speziale Shader funktionieren prinzipiell nicht im deferred Pass.


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 17 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » Shader


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 8 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.011s | 17 Queries | GZIP : On ]