Mein kleines Rennspiel besitzt ein Terrain, welche sich zu nutzen macht, dass für viele Texturen eigentlich ein Graustufen-Bild ausreicht, welches dann jeweils passend eingefärbt wird. Daher habe ich in jeden Kanal eines Bildes ein unabhängiges Graustufenbild reingequetscht, welches dann der Fragmant-Shader dann zum Gewünschten Bild wieder zusammen fügt:
Vielen Dank für die schnelle Antwort Coolcat. Das hat tatsächlich geklappt. Kommt nicht oft vor, dass ein kleiner Codeschnipsel besser funktioniert ein Komplexerer.
Nur ne kleine Verständisfrage am Rande:
Woher weiß OpenGL intern eigentlich, welches Mipmap-Level es im Moment für den Rendervorgang verwenden soll ? Der Shader frägt ja nur dem sampler nach dem Wert der Textur an einer bestimmten Koordinate. Bzw. kann man da extern irgendwie Einfluss drauf nehmen ?
Woher weiß OpenGL intern eigentlich, welches Mipmap-Level es im Moment für den Rendervorgang verwenden soll ? Der Shader frägt ja nur dem sampler nach dem Wert der Textur an einer bestimmten Koordinate.
Es wird die lokale Ableitung der Texturkoordinaten berechnet bzw. approximiert. Das geht über Forward- bzw. Backward Differencing, also die Differenz zum Nachbarpixel. Kann man in GLSL über die Funktionen dFdx() und dFdy() machen. Hier mal eine Funktion aus meinem Code die das nötige Mipmap-Level im manuell über den "Edge-compression"-Ansatz im Fragmentshader berechnet. Intern wird da was ähnliches passieren. Anzumerken ist das bei mir die Mipmaps umgekehrt nummeriert sind als in OpenGL üblich. uFullEdge ist die Kantenlänge der Textur in höchster Auflösung, uMaxMipmap ist die Mipmapstufe mit der höchsten Auflösung.
Bzw. kann man da extern irgendwie Einfluss drauf nehmen?
Im Fragmentshader kannst ab GLSL 1.3 über die Funktion textureLod das Mipmap-Level manuell wählen, siehe GLSL Spec. Im Vertexshader ist es nicht möglich das Mipmaplevel automatisch bestimmen, daher musst du dort immer schon texture2DLod benutzen, wenn du was anderes als die höchste Auflösung willst.
Ah es hat also doch nix mit Magie zu tun. Sind diese Funktionen dFdx() und dFdy() nicht sehr aufwändig für die GPU ? Weil hier ja mehr oder weniger eine neue Instanz des Pixelshaders angeworfen werden muss ?
Sind diese Funktionen dFdx() und dFdy() nicht sehr aufwändig für die GPU ? Weil hier ja mehr oder weniger eine neue Instanz des Pixelshaders angeworfen werden muss ?
Wie das genau implementiert ist kann ich dir nicht sagen...das wissen wahrscheinlich nur diejenigen die entsprechende Chips entwerfen. Ich würde aber mal behaupten das ist irgendwie in den Rasterizer integriert: Wenn ein Fragment berechnet wird, ist die Wahrscheinlichkeit hoch das gerade auch ein Nachbarfragment berechnet wird. D.h. die Shaderunits können hier in gewissem Rahmen interagieren bzw. aufeinander warten. Es ist auch möglich das einfach der Fragmentshader für den Nachbarpixel nochmals aufgerufen wird. Das ist ggf. schneller als auf das Ergebnis einer anderen Shaderunit zu warten. => In jedem Fall: Der Aufwand ist akzeptabel....ist würde es als ähnlich wie einen Texturzugriff einschätzen. Du darfst aber gerne mal ein paar Benchmarks ansetzen und die Ergebnisse hier posten. Dann hätten wird etwas solideres als meine wilden Vermutungen Als Test würde ich einen Fragmentshader vorschlagen der sagen wir 10000 pseudozufällige Texturzugriffe in einer Schleife macht (z.B. Farbwerte aufsummieren) und dann das Ergebnis in dFdx() bzw. dFdy() einleitet. Wenn eine eigene Instanz gestartet wird sollte das ca. doppelt solange dauern wie ohne dFdx() und dFdy(). Der Zufallszugriff und die große Zahl der Zugriffe ist wichtig um Caching-Effekte auszuschließen.
Du darfst aber gerne mal ein paar Benchmarks ansetzen und die Ergebnisse hier posten. Dann hätten wird etwas solideres als meine wilden Vermutungen
Ich glaube du überschätzt meine GLSL bei weitem. Im Moment müsst ich euch für jede Zeile Code hier Forum mit Fragen nerven. Evt. mach ich sowas mal später, wenn mir die Sprache geläufiger ist.
Mitglieder in diesem Forum: 0 Mitglieder und 9 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.