2012-11-23 10 views
6

Meine Shadern teilen häufig die gleiche Funktionalität. Zum Beispiel Berechnung der diffusen/spiegelnden Beleuchtung. Ich möchte dies einmal schreiben und dann den Code über verschiedene Shader wiederverwenden.Wie man wiederverwendbaren GLSL Code schreibt?

Glsl hat keine Kenntnis von Dateien und keine Unterstützung für eine c-like #include Präprozessordirektive.

Ich weiß, dass GSL Unterstützung für das Kompilieren der Quelle von mehreren Cstrings hat, aber wie würden Sie wissen, welche Cstrings enthalten? Implementieren Sie Ihre eigene Version von Include? Oder erstellst du eine Art Metadatei für jeden deiner Shader?

Antwort

4

In den großen Projekten werden Shader oft beim ersten Lauf (oder wenn Grafikoptionen geändert werden) zusammengefügt, so dass sie alle anbieterspezifischen Funktionen enthalten und für Benutzercomputer und Einstellungen optimiert sind. Und nicht nur Shader, sondern auch einige Stufen der Render-Pipeline.
Sie können GLSL als HTML \ CSS \ JavaSript-Code behandeln, der PHP-Skript als Antwort auf die Anfrage übergibt. Und Sie können die gleichen Techniken wie Tampeln, Code-Injektionen (zum Beispiel Menge der Textur-Lookup) in Schleifen verwenden. Und es ist auch gut für Grafikdesigner, da sie eine einfache Steuerung der Shader-Quelle durch Parametrisierung - Scheckheft, Eingabefelder usw. haben und für einzigartige Fälle einen eindeutigen Shader erzeugen können.

1

Ich habe eine benutzerdefinierte Lösung basierend auf http://blackpixel.com/blog/494/xcode-using-includes-in-opengl-shaders/ [404 jetzt]. Grundsätzlich gesagt, dass Sie m4 Werkzeug verwenden können, um die Dateien vor zu verarbeiten.

In den GLSL-Quelldateien enthalten nur das gewünschte Fragment Sie wiederverwenden möchten:

include(Utils.glsl) 
include(Colors.glsl) 

... 

void main (void) { 
    ... 
} 

In Xcode, fügen Sie alle glsl Dateien „Copy Bundle-Ressourcen“.

ein „Run Script“ Phase mit diesem Shell-Skript hinzufügen:

#!/bin/sh 

cd ${BUILT_PRODUCTS_DIR}/${WRAPPER_NAME} 
find . -name "*.fsh" | while read file; do 
    echo Preprocess $file 
    m4 "$file" > "$file.tmp" 
    mv "$file.tmp" "$file" 
done 

exit 0 

Das Skript übernimmt Ihre Shadern .fsh Erweiterung haben. Es ist trivial, es so zu modifizieren, dass es zu deinen Shader-Erweiterungen passt.

Seien Sie gewarnt: Ihre Shader werden für fast jeden zugänglich sein. Sie können es für die Entwicklung verwenden und sie in Zeichenfolgen konvertieren, bevor Sie sie freigeben (kein wirklicher Schutz, es sei denn, Sie verschlüsseln es ...).

Wenn es zwischen den Shadern nicht viele Shares gibt, wird am Ende viel ungenutzter Code übrig bleiben. Ich denke, der Shader-Compiler wird sich darum kümmern, aber ich bin nicht 100% sicher, ob es eine Leistungseinbuße gibt.