Ich habe mich etwas mit Shader beschäftigt und muss sagen, dass sie mir besser gefallen, als die normale Renderpipline. Endlich versteht man den Ablauf.
Eine kleine Frage hätte ich allerdings noch, um den genauen Ablauf zu verstehen. Wo genau setzt der Fragmentshader ein? Mir gehts darum, den Rechenaufwand besser abschätzen zu können.
Angenommen wir haben eine Per-Pixel-Beleuchtung mit einer bestimmten Anzahl n von Lichtern. Wie hoch ist nun der Rechnenaufwand. Wird die Berechnung zur Beleuchtung nur auf die "zu sehenenden" 1280x800 Pixel (das ist halt meine Auslösung )angewendet? Wird also vorher durch den Tiefenbuffer aussortiert für welche Pixel diese Berechnung nicht nötig ist?
Wenn es denn so wäre, hätte ich groß einen Rechenaufwand von 1280x800xn.
Ich hoffe diese Anfängerfrage ist nicht all zu dämlich Danke schonmal
Die Frage ist gar nicht dämlich. Bei älteren Grafikkarten wird der Fragmentshader immer ausgeführt. Bei neueren Karten hat man "Early-Z" eingeführt, d.h. den Z-Test vor den Fragmentshader geschoben. Das funktioniert aber z.B. nicht wenn man schreibend auf gl_FragDepth zugreift, also der Shader die Tiefe nicht verändert. Hier sind auch noch diverse andere Gründe aufgelistet die Early-Z verhindern: http://www.gpgpu.org/w/index.php/Code_Examples#Early-z
Der Stencil-Test scheint dagegen immer noch nach dem Fragmentshader in der Pipeline zu liegen.
Das funktioniert aber z.B. nicht wenn man schreibend auf gl_FragDepth zugreift, also der Shader die Tiefe nicht verändert.
Das verstehe ich nicht so ganz genau. Logisch für mich wäre, wenn ich auf gl_FragDepth zugreife, also im (Fragment)Shader den Tiefenbuffer veränder, setze ich den Ealy-Z außer Kraft?!
Muss ich irgendwas beachten, also den Early-Z extra einschalten?
Ich schreib den Satz nochmal neu: "Early-Z funktioniert unter anderem nicht wenn man schreibend auf gl_FragDepth zugreift."
Zitat:
Logisch für mich wäre, ...
Genauso ist es ja auch
Zitat:
Muss ich irgendwas beachten, also den Early-Z extra einschalten?
Nein, das macht die Grafikkarte selbst. Es gibt auch keine sinnvolle Möglichkeit festzustellen ob die Karte Early-Z unterstützt. Bei neuen Karten kannst du aber davon ausgehen.
Ich hab ne Geforce 7600 Go. Müsste es hoffentlich untersützen. Der GeoShader ist leider nicht dabei
Fazit: Meine Lichtberechnung wird tatsächlich (solange der Early-Z aktiv ist) "nur" auf meine 1280x800 Pixel angewendet. So müsste es dann stimmen?
Eine Frage noch: Ich werde mich demnächst mit einem Schattenshader (Shadowmapping) beschäftigen. Hab bisher nur über die grobe Funktionsweise geschaut. Gibt es dort iwelche Operationen, die den Early-Z auschalten? Das alleinige Auslesen der Tiefe sollte dies nicht tun, oder ?
Registriert: Di Okt 13, 2009 17:25 Beiträge: 365
Programmiersprache: C++
simon1988 hat geschrieben:
Meine Lichtberechnung wird tatsächlich (solange der Early-Z aktiv ist) "nur" auf meine 1280x800 Pixel angewendet.
Wobei sie immer noch für jeden Pixel auf deinem Bildschirm mehrfach aufgerufen werden kann. Nämlich dann, wenn du zwei Objekte zeichnest, die übereinander liegen und das, was weiter hinten ist, zuerst gezeichnet wird. Deshalb kann es sinnvoll sein, die Objekte vor dem Rendern grob nach Entfernung zu sortieren oder einen extra Z-Prepass zu machen.
simon1988 hat geschrieben:
Gibt es dort iwelche Operationen, die den Early-Z auschalten? Das alleinige Auslesen der Tiefe sollte dies nicht tun, oder ?
Es gibt eigentlich keinen Grund, warum der Treiber Early-Z beim Auslesen verhindern sollte.
Zuletzt geändert von mrtrain am Mi Aug 31, 2011 20:24, insgesamt 1-mal geändert.
Ist es dann nicht schon eher sinnvoll, gleich deferred shading zu benutzen? Getestet hab ichs zwar nicht, aber ich könnt mir vorstellen, dass das dann wieder schneller ist, weil man da kleinere Lichter nicht über den ganzen Bildschirm ziehen muss.
Außerdem, zumindest ich konnte bezüglich Geschwindigkeit keinen Unterschied zwischen Per Vertex und per Pixel Beleuchtung bemerken. Und das obwohl sich meine Szenen im allgemeinen auf ne große DisplayList beschränken, also eher nicht bandbreitenlimitiert sind (und auch deutlich weniger Vertices als Pixeln haben).
Und das obwohl sich meine Szenen im allgemeinen auf ne große DisplayList beschränken, also eher nicht bandbreitenlimitiert sind (und auch deutlich weniger Vertices als Pixeln haben).
Ich vermute du spielst hier auf die Bandbreite zwischen Hauptspeicher und Grafikspeicher an. Wahrscheinlich liegt bei dir aber wohl eine Bandbreitenlimitierung vor: Innerhalb der Grafikkarte! Insbesondere Texturen aber auch Vertexdaten liegen im Speicher der Grafikkarte und müssen Stückenweise in den Cache der GPU geladen werden. Da hilft auch die Displayliste nicht.
In jedem Fall ist die (lokale) Lichtberechnung heute so schnell, dass du das quasi nicht bemerken wirst. Die anderen Faktoren (eben die Daten überhaupt erstmal in die GPU zubekommen) sind da weitaus ausschlaggebender. Einen Unterschied wirst du wohl erst bei richtig vielen Lichtquellen (100+) bemerken, wo dann auch Deferred Shading oder Inferred Lighting zu empfehlen sind.
Mitglieder in diesem Forum: 0 Mitglieder und 5 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.