2012-04-15 18 views
11

Per iniziare con la mia domanda principale:Pixel Shader modello> 2.0 in FireMonkey

Posso usare pixel shader model 3, 4 o 5 nelle mie applicazioni FireMonkey?

Desidero essere in grado di creare dinamicamente pixel shader nel mio programma FireMonkey. Per fare ciò, compilo un pixel shader usando fxc.exe fornito con DirectX SDK e carica il codice compilato nel mio discendente TShaderFilter. Funziona bene (fammi sapere se sei interessato a come lo faccio).

Tuttavia, riesco a far funzionare le cose solo se compilo con ps_2_0 come profilo di destinazione.

Attualmente sto correndo nei limiti dello shader modello 2.0. Ad esempio, i loop sembrano essere srotolati dal compilatore e c'è un numero massimo di istruzioni che è possibile avere in shader di livello 2. Per questo motivo, il numero di possibilità è piuttosto limitato.


Esempio: Il codice dello shader di seguito crea un frattale di Mandelbrot. Se imposto troppo alto Iterations, non viene compilato. Messaggio di errore:

error X5608: Compiled shader code uses too many arithmetic instruction slots (78). Max. allowed by the target (ps_2_0) is 64.

#define Iterations 12 

float2 Pan; 
float Zoom; 
float Aspect; 
float4 main(float2 texCoord : TEXCOORD0) : COLOR0 
{ 
    float2 c = (texCoord - 0.5) * Zoom * float2(1, Aspect) - Pan; 
    float2 v = 0;   
    for (int n = 0; n < Iterations; n++) 
    { 
     v = float2(v.x * v.x - v.y * v.y, v.x * v.y * 2) + c; 
    }   
    return (dot(v, v) > 1) ? 1 : 0; 
} 

Con shader model ps_3_0 posso compilare con più iterazioni, ma lo shader compilato non sembra funzionare in FireMonkey. Non ricevo alcun messaggio di errore; Ho appena ottenuto un'immagine rossa come risultato.


Qualcuno qui ha qualche idea su come aggirare il problema, o è FireMonkey semplicemente non in grado di utilizzare tutto il potenziale della mia scheda grafica?

Nota, ho visto che il requisito minimo per FireMonkey è una scheda grafica con livello di shader 2.0, ma non è chiaro se ciò significa che non è possibile utilizzare lo shader di livello 3 o superiore.

+3

+1, domanda interessante! Sarei interessato a leggere come stai compilando e usando anche gli shader. –

risposta

3

Questa risposta è corretta al momento della scrittura, ma sarà eventualmente cambiare come FireMonkey sviluppa:

Non è possibile utilizzare PixelShader o ShaderModel 3.0 o superiore, come FireMonkey (in Windows) utilizza DirectX 9, mentre PixelShader/ShaderModel 3.0+ sono caratteristiche di DirectX 10. Se si guarda in Winapi.D3DX9.pas (righe 2871-2872), si sarà in grado di confermare che ps_3_0 non è un token valido qui, mentre in Winapi.D3DX10.pas (righe 3224-3230) è supportato.

Quindi, l'unico modo per utilizzare PixelShader/ShaderModel 3.0+ è modificare FireMonkey in modo autonomo per utilizzare un contesto DirectX 10 o richiedere (con il supporto di altri) che Embarcadero cambi questo per te .

+1

Penso che questo sia sbagliato. DirectX 9.0c (dal 2004) supporta lo shader model 3.0. SM2 è arrivato con la versione originale di DirectX9.0, ma 9.0c ha otto anni ed è molto standard. DirectX 10 ha introdotto SM4. Non ho controllato le traduzioni Pascal e quindi forse manca un token valido, ma questo significa che se FMX usa DirectX 9 dovrebbe sicuramente essere in grado di usare SM3. –

+0

Potresti avere ragione. Quello che posso dire con certezza è che la traduzione di Delphi per DX9 non * fornisce * il flag ps_3_0. Non sono del tutto sicuro che DirectX 9.0c abbia aggiunto SM 3.0 e PS 3.0, ma le intestazioni di Delphi certamente no. – LaKraven