ich brauch für ein Tool verschiedene Shader.. so vonwegen Grayscale, Invert, Sharpen, Blur etc...
Man soll via Checkbox o.Ä. aktivieren können was man haben will, also z.B. Grayscale + Invert.
Wie stell ich das am geschicktesten an..?
Den Shader immer wenn man seine auswahl getroffen hat dementsprechend zusammenstellen und zur GraKa schicken, oder eher alle shader einzeln erstellen und dann irgendwie via Linking zusammenstöpseln??
Und.. wie funktioniert das mit dem Linking..?? Hab das nochnie gemacht
Registriert: Mi Jul 17, 2002 12:07 Beiträge: 976 Wohnort: Tübingen
Also ich kann dazu nur sagen: Probiers nicht mit if-Anfragen im Shader selbst. Dadurch wird das Ganze extrem langsam (jedenfalls auf meiner GF 6600), was irgendwie mit dynamischen Sprüngen zusammenhängt. Lars hat mir das mal erklärt, aber ich hab die genaue Begründung schon wieder vergessen
Aber mir fällt grad ein, du könntest ja je nach gesetztem Häkchen eine Datei vom Delphi aus aus vorher festgelegten Schnipseln zusammenstellen lassen, das als Stream speichern und als einen Shader auslesen lassen.
_________________ "Du musst ein Schwein sein in dieser Welt, sangen die Prinzen, das ist so 1.0. Du musst auf YouTube zeigen, dass dir dein Schweinsein gefällt, das ist leuchtendes, echtes Web 2.0." - Hal Faber Meine Homepage: http://laboda.delphigl.com
Registriert: Sa Jan 01, 2005 17:11 Beiträge: 2068
Programmiersprache: C++
La Boda hat geschrieben:
Also ich kann dazu nur sagen: Probiers nicht mit if-Anfragen im Shader selbst. Dadurch wird das Ganze extrem langsam (jedenfalls auf meiner GF 6600), was irgendwie mit dynamischen Sprüngen zusammenhängt. Lars hat mir das mal erklärt, aber ich hab die genaue Begründung schon wieder vergessen
Die (alten) Karten können keine IF-Abfrage und rechnen beides aus, nur das passende wird dann angezeigt.
Als Beispiel:
if ja then calcja else calcnein;
würde dazu führen, da calcja und calcnein berechnet werden, obwohl nur eine notwendig ist.
Einzelne Shader auszuwählen sollte nicht das Problem sein, ich sehe das Problem bei den Kombinierten.
Die müssten dann auch in einer Shaderdatei sein, mir ist zumindest nicht bekannt, dass mehrere Shader gleichzeitig aktiv sein können.
Ich kann mich i0n0s nur anschließen, die Shader müssten entweder so geschrieben sein, dass man sie wirklich einfach hintereinander in eine shaderdatei packen könnte, oder aber man müsste mit mehreren passes arbeiten (pro shader einer, jeweils mit dem Ergebnis des Vorherigen rechnen), aber ich würde vermuten das 1.Methode zwar evtl. etwas schwerer umzusetzen ist, aber Performancetechnisch vermutlich besser ist [solange du nicht andauernt Shaderteile aktivierst bzw. deaktivierst]
_________________ Bevor du definierst, was etwas ist, versichere dich seiner Existenz.
Registriert: Di Mai 18, 2004 16:45 Beiträge: 2623 Wohnort: Berlin
Programmiersprache: Go, C/C++
Ich hab das bisher immer so gesehen, das man einfach alle shader varianten als einzelne shader schreibt.
Dies hat den Grund, die Performance. Ich rate es dir wie folgt zu lösen.
Schreibe alle shader einzeln und zerschnippsel sie dann in header und code.
Nun lädst du alle headerfiles die du brauchst in eine File und gleiches machst du mit dem code.
Eventuell brauchst du noch ein footer für z.B. vertexshader.
Überlege dir Variablen die du gemeinsam nutzen willst für alle shader.
Z.B. endpos und läst am anfang die position von opengl einspeisen und die shader codes die dann folgen, nutzen diese var und am ende gibst du opengl diese var zurück.
Erinnert mich stark an PHP und Include
_________________ "Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren" Benjamin Franklin
Ja sowas wie den ID3DXFragmentLinker bräuchte man auch in OpenGL. Der macht nämlich genau das und optimiert den Shader noch dabei. Außerdem ist das Linken ausdrücklich sehr schnell.
Soweit ich weiß kann man auch in OpenGL kompilierte Shaderobjekte miteinander linken, wie man es aus der CPU-Programmierung kennt. Z.B. benutzt man in der main eine Funktion, die z.B. die Per-Vertex Farbe berechnet. Ist die Funktion aktiviert, linkt man dazu die Objektdatei, die die Funktion enthält, die die Berechnung durchführt. Andernfalls linkt man eine Funktion dazu, die einfach eine Konstante zurückgibt. Letztere Funktion kann der Compiler dann wegoptimieren.
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.