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.

È stato utile?

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 Modelroba 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)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top