2010-02-28 9 views
18

Ultimamente mi sono divertito con Direct3D 11 e sono stato frustrato dalla mancanza di documentazione sulle basi dell'API (come il semplice rendering della geometria). Uno dei punti di confusione causati dalla scarsa documentazione è l'(apparente) allontanamento dall'uso degli effetti per gli shader.File di effetti Direct3D 11 deprecati?

In D3D11 tutto il supporto dell'effetto (.fx) è stato rimosso dalle librerie D3DX e sepolto in una libreria di sorgenti condivise di difficile reperibilità (scarsamente documentata, ovviamente). Nessuno degli esempi inclusi lo usa, preferendo invece compilare direttamente i file HLSL. Tutto ciò mi dice che Microsoft sta cercando di convincere la gente a smettere di usare il formato del file effetto. È vero? C'è qualche documentazione di qualsiasi tipo che lo afferma? In ogni caso sto bene, ma da anni promuovono il formato .fx, quindi sembra strano che improvvisamente decidano di eliminarlo.

+0

Non potrei essere più d'accordo. [ID3DX11Effect] (http://msdn.microsoft.com/en-us/library/ff476652 (VS.85) .aspx) non è affatto referenziato negli esempi (eccetto il campione che fornisce ID3DX11Effect), e anche questo solo crea un file .lib. Perché è così difficile da ottenere, sembra scoraggiare la gente dal usarlo. – bobobobo

risposta

4

Sono nella stessa identica posizione, e dopo aver cercato Googling come un matto anche per il campione più semplice che utilizza D3DX11CreateEffectFromMemory, sono giunto anche alla conclusione che il supporto dei file .fx non è il loro più alto prio. Sebbene sia strano che abbiano aggiunto il concetto EffectGroup, che è nuovo a 11, se non vogliono che lo usiamo.

Ho giocato un po 'con la nuova API di reflection, quindi sembra che sia piuttosto semplice hackerare insieme le proprie funzioni per l'impostazione di variabili ecc., In pratica creando la propria classe Effect, e il passo successivo è vedremo quale supporto è per creare blocchi di stato di rendering tramite l'API. Essere in grado di modificare quelli direttamente nel file .fx è stato molto bello, quindi speriamo che qualcosa del genere esista ancora (o, nel peggiore dei casi, posso strappare quella parte dal codice Effect11).

+0

Alla fine ho optato per una classe helper che utilizzava la reflection API per analizzare i parametri vs/ps e utilizzava metodi come set_variable (nome, valore) per impostare i valori (in realtà mappavano il cbuffer se necessario e aggiornavano la memoria direttamente). Inoltre, ho implementato un sistema in cui avrei ricevuto una richiamata se il file sul disco fosse cambiato, così ho potuto ricaricare dinamicamente gli shader. Per gli stati di profondità dello stencil, ho finito per utilizzare queste funzioni di supporto: http://legalizeadulthood.wordpress.com/2009/07/12/description-helpers-for-direct3d-10-10-1-and- 11/ –

0

http://msdn.microsoft.com/en-us/library/ff476261(v=VS.85).aspx

Questo suggerisce che si può prendere un ombreggiatore o un effetto.

http://msdn.microsoft.com/en-us/library/ff476190(v=VS.85).aspx

Inoltre, qual è la differenza tra uno shader e un effetto?

+0

Nah, CompileFromFile funziona solo con gli shader, poiché richiede un nome di funzione passato come parametro pFunctionName e gli effetti non hanno funzioni allo stesso modo. La differenza tra uno shader e un effetto è che un effetto può essere visto come un contenitore, che contiene le impostazioni dello stato di rendering (e altri metadati) insieme a più shader, mentre uno shader è solo un singolo vertice o pixel shader. –

3

Molti sviluppatori di giochi e grafica professionali non utilizzano le interfacce di effetti in Direct3D e molti dei principali motori di gioco non li utilizzano. Invece, i sottosistemi di materiale/effetti personalizzati sono costruiti sulla base delle funzioni di gestione dello stato dello shader e dello stato grafico di livello inferiore. Ciò consente agli sviluppatori di fare cose come indirizzare sia Direct3D che OpenGL attraverso una pipeline di gestione delle risorse comune.

+0

IMO questo non ha nulla a che fare con l'argomento qui – thewhiteambit

1

C'è un runtime di effetti fornito come esempio nell'SDK di DirectX che dovrebbe essere in grado di aiutarti a usare i file .fx. Controlla la directory:% DXSDK_DIR% \ Samples \ C++ \ Effects11

+1

L'ultimo Effects 11 è ospitato su [CodePlex] (http://go.microsoft.com/fwlink/p/?LinkId=271568). –

3

Il problema principale è che il profilo fx_5_0 che è necessaria per compilare Effetti 11 shader con i metadati richiesti è deprecato dal team HLSL compilatore. Il runtime è shared-source, ma il compilatore no. Nell'ultimo D3DCompiler (# 47) emette un avviso a riguardo. fx_5_0 non è mai stato aggiornato per alcuni aspetti linguistici più recenti in DirectX 11.1 e 11.2, ma funziona "così com'è" per Direct3D 11.

Il secondo problema è che sono necessarie le API D3DCompile in runtime per utilizzare Effects 11. Poiché D3DCompile era 'solo sviluppo' per le app di Windows Store per Windows 8.0 e Windows phone 8.0, non era un'opzione disponibile. È tecnicamente possibile utilizzare Effects 11 oggi con le app di Windows Store per Windows 8.1 e Windows Phone 8.1 poiché D3DCompile # 47 fa parte del sistema operativo e include il supporto del compilatore "deprecato/as-is" per fx_5_0, ma questo uso è non incoraggiato.

La maggior parte degli esempi di DirectX SDK e tutti i campioni di Windows Store evitano l'uso di Effects 11. Ho inserito alcuni esempi di desktop Win32 che lo utilizzano su GitHub.

Quindi, in breve, si è scoraggiato dall'utilizzarlo ma è ancora possibile al momento se si può vivere con le dichiarazioni di non responsabilità.

+0

Quindi cosa si usa al posto di 'fx_5_0'? – MoonKnight

+0

Non si usano affatto gli effetti. Costruisci tutte le fasi di permutazione e di shader direttamente come '' vs_5_0'', '' ps_5_0'', ecc. –

Problemi correlati