Statisches Kompilieren von Vertex- & Pixelshadern mit fxc.exe
-
Hallo zusammen
Ich möchte die von mir geschriebenen Shader zur Entwicklungszeit kompilieren und schliesslich zur Laufzeit ausschliesslich die resultierenden Maschineninstruktionen laden. Das Funktioniert auch bisweilen sehr gut, nun möchte ich allerdings den Workflow beschleunigen und bewerkstelligen, dass Visual Studio 2008 sämtliche Dateien mit der Endung *.fx mit einem externen Compiler kompiliert und das Kompilat in ein ensprechendes Resourcenverzeichnis speichert, wo es schliesslich zur Laufzeit geladen werden soll.Momentan habe ich zusätzlich zum Visual Studio immer noch eine Konsole offen, in welchem ich den fxc Compiler aufrufen muss.
Meine Frage is nun, gibt es in Visual Studio 2008 ein Möglichkeit, die von mir beschriebenden Arbeitsschritte zu automatisieren.
Mfg Samuel
-
Ja, das geht. Ich selbst hab es aber noch nie gemacht, nur benutzt. Mir hats Tobias Zirr gezeigt, evtl. magst du den mal anschreiben? Es hat jedenfalls mit dem Custom Build Step zu tun. f'`8k
Gruß, TGGC (Was Gamestar sagt...)
-
Ich habe es mal mit folgender Scriptzeile in der CommandLine vom CustomBuild Step versucht. Leider scheint mir Visual Studio das % Zeichen zu entfernen und Escapen \% hat leider auch nichts gebracht.
for /r "$(InputDir)" %i in(*.fx) do "$(DXSDK)Utilities\bin\x86\fxc.exe" /T fx_2_0 %i
Hat vielleicht jemand eine Idee, wie man das Teil richtig hinbekommt?
-
Konnte nun eine Lösung ohne Schleife finden
Vielleicht wird das mal jemand von euch ebenfalls brauchen können:Anstatt beim Custom Build Step sollte man auf das entsprechende Projekt rechtsklicken -> Custom Build Rules -> New Rule File
Dort kann man schliesslich eine Neue Build Regel hinzufügen und zwar so, dass diese für jede Datei mit einer bestimmten Endung angewendet wird. Funktioniert super!
-
Ich denke mal, so hats der Tobias auch gemacht - ich habs halt nie selbst eingerichtet. Hab es in einem fertigen sln/vcproj nur konfiguriert. Unser Problem war dann nur, wenn es einen Fehler in der Einstellung gab, dann konnte man das Projekt nicht mehr laden. Man musste das dann von Hand in den Dateien aendern. Aber evtl. ist das auch ein Einschraenkung von meinen VC2k5 Express.
Noch als Hinweis, wenn man irgendwo einen Befehl nicht reinschreiben kann, den einfach in eine bat Datei schreiben und den aufrufen. Hatten letztens auch mal so einen Fall wegen Unfaehigkeit der php-Implementation. f'`8k
Gruß, TGGC (Was Gamestar sagt...)
-
normalerweise sollte visual studio fragen ob man fuer ne neue dateiendung einen custom buildstep erstellen will, sobald man eine unbekannte datei in ein projekt einfuegt.
-
@rapso
Tja, eigenartig, mein Visual Studio fragt mich nie, wenn ich eine Datei mit einer unbekannten Dateiendung hinzufüge.Ich habe übrigens jtzt noch ein Problem: Ich verwende das NShader Plugin für die Synthax Hervorhebung, doch dieses reagiert ausschliesslich auf *.fx Dateien. Ich habe allerdings *.vsi und *.psi für VertexShaderInput bspw. PixelShaderInput, da ich nicht das Effekt-Framework der Direct3D Extension Library benutze. Vertex sowie Pixelshader benötigen dann eben für den fxc Compiler ein jeweils anderes flag und somit habe ich eine separate Build Rule für diese beiden Endungen.
Ich habe bereits versucht, die Dateiendungen mit Hilfe eines Hex Editors umzubenennden, aber es gibt zuviele binäre Treffer für den String "fx". Ausserdem müsste ich noch irgendwie ein OR hineinplaumeln, was nicht allzuschwer wäre, würde es sich um x86 Assembler handeln, doch leider handelt es sich um ein C# Projekt.
Ich habe schliesslich bemerkt, dass man ohne weiteres den SourceCode von NVision herunterladen kann doch ich kann das Projekt nicht öffnen weil er ein VSSDK nicht finden könne. Diese habe ich jedoch mit Sicherheit installiert.
Hat jemand von euch Ehrfahrung mit dem NShader AddIn oder kennt vielleicht ein Anderes, welches meine Probleme beheben würde.
Mfg Samuel
-
dafuer braucht man kein plugin, syntax highlighting wird ueber ein kleines scriptfile definiert und ist ne standard funktion vom visual studio. scriptfiles gibt es im netz einige, fuer cg, hlsl, glsl etc.
tools -> options ->text editor -> file extensions -> add
kannst du nutzen um fuer eine endung ein vorgefertigstes scriptfile zu nutzen.googlen ist sicherlich viel hilfreicher als das forum, du bist nicht der erste der das ziel verfolgt
-
Danke für deinen Tip, doch der NShader gefällt mir eben so gut
Nun ja, ich konnte das Projekt in der Zwischenzeit doch noch öffnen und habe den Code an den entsprechenden Code geändert und die alte mit der resultierenden neuen dll überschrieben. Doch leider funktioniert das Teil immer noch nicht.
Folgende Test habe ich diesbezüglich durchgeführt:NShader.dll gelöscht:
Effekt: Visual Studio 2008 startet nicht mehr korrekt
Folgerung: Es ist die korrekte von Visual Studio geladene dll DateiDie Standard Endung ".fx" im Code entfernt kompiliert und dll überschrieben:
Effekt: Keiner (Synthaxhighligthing funktioniert nach wie vor für *.fx Dateien
Folgerung: Er lädt die akzeptierenden Dateiendungen offenbar nicht bei jedem Start von Visual Studio 2008 aus der dll, sondern diese wurden vermutlich bei der Installation des AddIns aus der Dll gelesen.Witzig finde ich auch, dass ich unter Tools->AddIn Manager überhaupt keinen Eintrag für dieses "AddIn" finde. Unter Systemsteuerung -> Software finde ich allerdings NShader 1.0
Ich kenne mich mit der AddInn Programmierung nicht aus, aber sollte dieses AddIn nicht eigentlich im AddIn Manager auftauchen?
-
ich kenne das addin nicht, aber vielleicht hat es nur ne endung registriert fuers highlighting? schau mal an der stelle die ich nannte ob da was steht.
-
@rapso
Nein leider nicht. Was ich allerdings sehe, ist, dass ich nun unter Text Editor ein neues Register "Shader Language" habe. Ebenfalls habe ich nun zusätzliche Optionen unter "Fonts and Color".Ich habe das Gefühlt, dass die Dll eine Funktion enthält, welche einfach bei der Installation aufgerufen wird und das Visual Studio 2008 ein wenig verändert. Und genau in diesem Teil der Dll habe ich wohl den Code angepasst. Ich habe nun die dll noch einmal umbenannt um diese Vermutung zu testen und tatsächlich: Visual Studio 2008 meckert beim Neustart, dass er die NShader.dll Datei nicht finden kann, "Shader Language" ist allerdings dennoch vorhanden. Das Syntaxhighlighting hingegen funktioniert dann auch bei den *.fx Dateien nicht mehr.
-
Ishildur schrieb:
@rapso
Nein leider nicht. Was ich allerdings sehe, ist, dass ich nun unter Text Editor ein neues Register "Shader Language" habe.ja, das ist das resultat von so einem scriptfile dass ich die ganze zeit erwaehne
Ich habe das Gefühlt, dass die Dll eine Funktion enthält, welche einfach bei der Installation aufgerufen wird und das Visual Studio 2008 ein wenig verändert.
es kopiert einfach das scriptfile ins entsprechende verzeichnis.
Und genau in diesem Teil der Dll habe ich wohl den Code angepasst.
vermutlich eher nicht, du muestest wohl das scriptfile loeschen um die installationsroutine der dll nochmal zu triggern.
Ich habe nun die dll noch einmal umbenannt um diese Vermutung zu testen und tatsächlich: Visual Studio 2008 meckert beim Neustart, dass er die NShader.dll Datei nicht finden kann, "Shader Language" ist allerdings dennoch vorhanden. Das Syntaxhighlighting hingegen funktioniert dann auch bei den *.fx Dateien nicht mehr.
scriptfile q.e.d.
NShader.dll ist also ein installer fuers scriptfile
-
Hmm ich bin noch nicht ganz überzeugt, und zwar weil die dll Datei eben doch noch irgendwie benötigt wird, um den Code effektiv zu hightlighten. Aber sehen wir mal, wohin das führt
Wo würde ich denn dieses Scriptfile finden? Also in welchem Verzeichnis meine ich?P.S.
Google: visual studio 2008 script files hat mir leider nichts brauchbares geliefert...Oder ich habe den Wald vor lauter Bäumen nicht gesehen. :p