DGL
https://delphigl.com/forum/

Texturefetch im Vertex-Shader langsam
https://delphigl.com/forum/viewtopic.php?f=20&t=10843
Seite 1 von 2

Autor:  Vinz [ Fr Mai 03, 2013 01:51 ]
Betreff des Beitrags:  Texturefetch im Vertex-Shader langsam

Hallo miteinander,
ich bastle an einem Shader, der im Vertexteil intensiven gebrauch von texture2D macht (Displacement mapping).
Aber es ist soo langsam!
Warum?
Im Fragmentshader fetche ich über riesige Schleifen für Millionen Pixel und es kratzt die Grafikkarte nicht, warum ist der Textutefetch im VertexShader so viel langsamer?
Gibt es eine Alternative?
Oder Optimierungsmöglichkeiten?

Autor:  Lord Horazont [ Fr Mai 03, 2013 13:17 ]
Betreff des Beitrags:  Re: Texturefetch im Vertex-Shader langsam

Kommt auf den Texturtyp an. Manche, besonders ältere Grafikkarten, unterstützen manche Texturtypen im Vertexshader so gut wie nicht. Z.B. ist auf meiner alten nVidia nur GL_RGBA32F performant gewesen – alles andere hat die Frameraten einbrechen lassen.

Der Grund … keine Ahnung. Wird wohl irgendeinen Pipeline-Abhängigen Grund geben.

grüße

Autor:  Vinz [ Fr Mai 03, 2013 17:20 ]
Betreff des Beitrags:  Re: Texturefetch im Vertex-Shader langsam

Hab es grad mit RGBA_32F-Texturen versucht, ist eindeutig noch langsamer, GK ist im übrigen auch relaiv neu (Geforce 600er serie).

Autor:  Vinz [ Fr Mai 03, 2013 23:06 ]
Betreff des Beitrags:  Re: Texturefetch im Vertex-Shader langsam

Hab interessehalber mal ganz grob verglichen, und es kam raus, dass der Vertexshader über 10 mal langsamer bei texture2D ist als der Fragmentshader.
Der Fragmentshader ist wohl auch dafür ausgelegt.
Kennt jemand Alternativen oder Optimierungsmöglichkeiten?

Autor:  Lord Horazont [ Sa Mai 04, 2013 10:14 ]
Betreff des Beitrags:  Re: Texturefetch im Vertex-Shader langsam

Vielleicht hilfts wenn du mal Typ + Treiberversion deiner Grafikkarte angibst (beides gut herauszubekommen mit diesem Tool, wo du auch gleich nen Report hochladen könntest). Gegebenenfalls mal explizit nach der Grafikkarte suchen und schauen, ob du irgendein Caveat übersehen hast.

grüße

Autor:  end [ Sa Mai 04, 2013 11:34 ]
Betreff des Beitrags:  Re: Texturefetch im Vertex-Shader langsam

Du kannst auch mal gDebugger drüber laufen lassen.

Autor:  Vinz [ Sa Mai 04, 2013 11:37 ]
Betreff des Beitrags:  Re: Texturefetch im Vertex-Shader langsam

Danke, werd ich ausprobieren.
Meinst Du also, dass es nicht normal ist, dass der Fragmentshader schneller auf Texturen zugreifen kann als der Vertexshader?

grüße
Vinz

Autor:  Lord Horazont [ So Mai 05, 2013 10:58 ]
Betreff des Beitrags:  Re: Texturefetch im Vertex-Shader langsam

Hast du mal Mipmaps und lineare Filterung ausgemacht? Also GL_NEAREST für alle Achsen?

grüße

Autor:  Vinz [ Mo Mai 06, 2013 11:29 ]
Betreff des Beitrags:  Re: Texturefetch im Vertex-Shader langsam

Hab es grad probiert, bringt immerhin ca. 20%, aber die Bildqualität leidet darunter.
Hab jetzt aber gelesen, dass Vertexshader einfach nicht so für den Texturzugriff optimiert sind.
Unter:
ftp://download.nvidia.com/developer/Pap ... xtures.pdf
heißt es:
"Since vertex texture reads are much slower than constant reads (see previous
section), we strongly advise against using vertex textures as constant memory. The
pixel processing architecture in the GPU is highly optimized to hide texture fetch
latency, but the vertex shader is not nearly as efficient. Therefore, you should limit
your vertex texture fetches to a small number of coherent accesses per vertex."

Es wäre also wesentlich schneller, wenn man die displacemnt-maps als uniform array überegeben würde, aber so viel Platz steht dafür wohl nicht zu Verfügung, oder?

grüße
Vinz

Autor:  Knittel [ Mo Mai 06, 2013 20:34 ]
Betreff des Beitrags:  Re: Texturefetch im Vertex-Shader langsam

Guck dir vielleicht mal Uniform Buffer Objects an, die könnten dir in der Hinsicht helfen, wenn du das mit Uniforms lösen willst.

Idee: Du speicherst in diesem Uniform Buffer Object die Werte für das Displacement in ein Array (praktisch nur die Texture) und übergibts dann in jedem Frame zum Beispiel Offset und Scale für die Displacement Map noch dazu und berechnest dann die Texturkoordinaten selber.

Oder: Vorher auf dem Prozessor berechnen und nur relevante Daten übertragen, oder zwischenspeichern. Da ich nicht weis was du genau machst, weis ich nicht ob das für dich in Frage kommt, weil wenn das Displacement sich nicht verändert, könntest dus ja auch ganz vorberechnen.

Wegen dem Speicherplatz... hm... also GL_MAX_UNIFORM_BLOCK_SIZE ist bei den ältesten GraKa (die diese überhaupt unterstützen) 16384 (Bit oder Byte, weis selber nicht^^). Das würde gerademal für einen 32x32 Textur mit 8 Bit Farbtiefe reichen, wahrscheinlich also nicht für deine Zwecke. Vielleicht müsstest du dann die Textur auf mehrere Uniforms aufspalten (normalerweise werden mindestens 1024 uniforms supported also könntest du schon irgendwie eine 512x512 vielleicht sogar 1024x1024 speichern), also der Platz dürfte kein Problem sein, aber ob dir das nachher einen Performanceboost bringt, wage ich zu bezweifeln!

Autor:  end [ Mo Mai 06, 2013 20:57 ]
Betreff des Beitrags:  Re: Texturefetch im Vertex-Shader langsam

Du musst am Ende eben vergleichen welche der 3-4 Lösungen am schnellsten/performantesten/geeignesten ist.

Hängt eigentlich auch von der Grafikkarte und dem Prozessor ab, ob die langsame Vertex-Shader Lösung dennoch schneller als der Prozessor an sich ist.

Autor:  Vinz [ Mo Mai 06, 2013 22:07 ]
Betreff des Beitrags:  Re: Texturefetch im Vertex-Shader langsam

Danke für die Antworten, ich werde mir Uniform Buffer Objects mal genauer anschauen, klingt praktisch.
Auf die Frage, was genau ich machen will:
Eine Wasseroberfläche, die mit verschiedenen, H-maps mit dynamischen Texturkoordinaten erzeugt wird.
Ich muss also für viele Vertices auf mehrere Werte zugreifen.

Autor:  Vinz [ Mo Mai 06, 2013 23:29 ]
Betreff des Beitrags:  Re: Texturefetch im Vertex-Shader langsam

Habe jetzt noch etwas mit uniforms rumprobiert, und bin zu dem Ergebnis gekommen, dass sie wenn überhaupt, nur unwesentlich schneller sind.
Ich bleibe bei Texturfetch.

Grüße
Vinz

Autor:  Knittel [ Di Mai 07, 2013 09:15 ]
Betreff des Beitrags:  Re: Texturefetch im Vertex-Shader langsam

Kannst du mal deinen Vertexshadercode zeigen, vielleicht können wir dann nochmal gucken ob wir die helfen können.

(Du könntest vielleicht auch versuchen mit Hilfe von Octtree, etc. deine Wasserfläche zu unterteilen und somit weniger Vertices durch den Shader zu jagen)

P.S. Hab mir nochmal deinen Link durchgelesen und bin auf folgendes gestoßen: "Performance dramatically improved by using dynamic branching both in pixel and vertex shaders."
Vielleicht hilft dir das ja nochmal weiter. ;)

Autor:  damadmax [ Di Mai 07, 2013 10:28 ]
Betreff des Beitrags:  Re: Texturefetch im Vertex-Shader langsam

Könnte eine Noise Funktion evtl schneller sein als ein Texturfetch?
Vielleicht kann man sich hier ein paar Anregungen holen.

Seite 1 von 2 Alle Zeiten sind UTC + 1 Stunde
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/