Frage

Ich frage mich, ob es möglich ist, einen Pixel-Schader dynamisch aus der Datei zu kompilieren und auf ein Netz anzuwenden.

Zuerst werde ich einfach mit einigen Hintergrundinformationen beginnen. Ich habe ein System, das HLSL-Pixel-Shaders basierend auf einer Reihe von Daten erstellt, die für die Frage nicht wirklich wichtig sind. Wichtig ist, dass diese Shader keine Techniken oder Pässe verwenden. Da sie nicht als .fx -Dateien verwendet werden sollen.

Das ShaderCompiler.CompileFromFile() Die Methode kann die Datei erfolgreich in a kompilieren CompiledShader.

Ist es möglich, diesen Shader auf ein Netz anzuwenden?

Da ich den Einstiegspunkt für jede Datei nicht in eine Technik einwickeln möchte, damit er als kompiliert werden kann Effect.

War es hilfreich?

Lösung

Zuallererst - wenn Ihr Shader keinen Einstiegspunkt hat, kompiliert Sie nichts! HLSL -Funktionen (es klingt so, wie Sie arbeiten) sind eingeführt Ausgehend vom Einstiegspunkt. Wenn Sie keinen Einstiegspunkt haben, haben Sie einen leeren Shader.

(Sie können dies bestätigen, indem Sie den resultierenden Shader nach dem Kompilieren zerlegen. Überprüfen Sie diese Frage und Antwort auf Anweisungen.)

Also zuallererst - du sind Ich muss Code schreiben, um Technikverpackungen zu generieren. Es sollte nicht sein das Es ist schwer, Ihre Quelle grob zu analysieren und den Funktionsnamen zu entdecken. Sie können die Quelle in einen Puffer laden und eine generierte Technikerklärung anhängen. Verwenden Sie dann die Version von ShaderCompiler.CompileFromFile das braucht a Stream dass Sie aus diesem Puffer erstellen.

Um diesen Shader auf der Grafikkarte in XNA 3.1 einzustellen, können Sie verwenden:

CompiledShader cs = ShaderCompiler.CompileFromFile(...);
PixelShader ps = new PixelShader(graphicsDevice, cs.GetShaderCode());
graphicsDevice.PixelShader = ps;

Wenn Sie XNAs eingebaute Maschenmaterial verwenden, möchten Sie verwenden ModelMeshPart.Draw um Ihre Maschen zu zeichnen. Dies umgeht alle alle Model's eingebaute Effekt-Zeug.

Es lohnt sich, darauf hinzuweisen, dass das Ganze ShaderCompiler, CompiledShader, PixelShader Das System wurde in XNA 4.0 aus XNA entfernt. Das ist hier erklärt. Der Weg zur dynamischen Zusammenstellung von Effekten in XNA 4.0 ist hier beschrieben.

(Da Sie den Effekt in XNA 4.0 verwenden müssen und dass es in XNA 3.1 zwischen Effekt und Pixelshader nicht wirklich viel Unterschied gibt, würde ich empfehlen, den Effekt zu verwenden und mit dem Kompilieren mit Effect.CompileEffectFromSource, wenn Sie sich dafür entscheiden, auf XNA 3.1 zu bleiben, anstatt zu verwenden ShaderCompiler)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top