Compilare dinamicamente gli shader dal file in XNA
-
26-09-2019 - |
Domanda
Mi chiedo se è possibile compilare dinamicamente un pixel-shader dal file e applicarlo a una mesh.
Per prima cosa inizierò con alcune informazioni di base. Ho un sistema che crea shader pixel HLSL basato su una serie di dati che non è davvero importante per la domanda. Ciò che è importante è che questi shader non usano tecniche o passaggi. Poiché non sono pensati per essere usati come file .fx.
Il ShaderCompiler.CompileFromFile()
Il metodo è in grado di compilare correttamente il file in a CompiledShader
.
È possibile applicare questo shader a una mesh?
Poiché non voglio individuare il punto di ingresso per ogni file per avvolgerlo in una tecnica per consentire che venga compilato come un Effect
.
Soluzione
Prima di tutto - se il tuo shader non ha un punto di ingresso, in realtà non stai compilando nulla! Funzioni HLSL (sembra che sia quello con cui stai lavorando) sono inlineate A partire dal punto di ingresso. Se non hai un punto di ingresso, allora quello che hai è uno shader vuoto.
(Potresti confermarlo smontando lo shader risultante dopo averlo compilato. Controlla questa domanda e risposta per le istruzioni.)
Quindi prima di tutto - tu sono Dovrà scrivere codice per generare involucri tecnici. Non dovrebbe esserlo Quello Difficile analizzare approssimativamente la tua fonte e scoprire il nome della funzione. È possibile caricare la fonte in un buffer e aggiungere una dichiarazione di tecnica generata. Quindi usa la versione di ShaderCompiler.CompileFromFile
ci vuole un Stream
che crei da quel buffer.
Per impostare questo shader sulla scheda grafica, in XNA 3.1, è possibile utilizzare:
CompiledShader cs = ShaderCompiler.CompileFromFile(...);
PixelShader ps = new PixelShader(graphicsDevice, cs.GetShaderCode());
graphicsDevice.PixelShader = ps;
Quando si utilizza le cose in mesh integrate di XNA, vuoi usare ModelMeshPart.Draw
per disegnare le maglie. Questo bypassa tutto Model
roba da effetto integrato.
Vale la pena sottolineare che l'intero ShaderCompiler
, CompiledShader
, PixelShader
Il sistema è stato rimosso da XNA in XNA 4.0. Questo è spiegato qui. Il modo per compilare dinamicamente gli effetti in XNA 4.0 è descritto qui.
(Dato che devi usare l'effetto in XNA 4.0 e che non c'è davvero molta differenza in XNA 3.1 tra l'effetto e l'uso di pixelshader, ti consiglio di usare l'effetto, compilando con Effect.CompileEffectFromSource
, se scegli di rimanere su XNA 3.1, invece di utilizzare ShaderCompiler
)