2012-04-15 21 views
11

Para iniciar con mi pregunta principal:Pixel Shader model> 2.0 en FireMonkey

¿Puedo usar pixel Shader Model 3, 4 ó 5 en mis aplicaciones FireMonkey?

Quiero ser capaz de crear dinámicamente sombreadores de píxeles en mi programa FireMonkey. Para hacer eso, ahora compilo un sombreador de píxeles usando fxc.exe que viene con DirectX SDK, y cargo el código compilado en mi descendiente TShaderFilter. Eso funciona bien (avíseme si le interesa cómo lo hago).

Sin embargo, solo puedo hacer que las cosas funcionen si compilo con ps_2_0 como un perfil de destino.

Actualmente me encuentro con las limitaciones del shader model 2.0. Por ejemplo, los bucles parecen ser desenrollados por el compilador, y hay una cantidad máxima de instrucciones que puede tener en los sombreadores de nivel 2. Por eso, el número de posibilidades es bastante limitado.


Ejemplo: El código de shader a continuación crea un fractal de Mandelbrot. Si configuro Iterations demasiado alto, no se compila. Mensaje de error:

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 el modelo de sombreado ps_3_0 puedo compilar con más iteraciones, pero el shader compilado no parece trabajar en FireMonkey. No recibo ningún mensaje de error; Acabo de obtener una imagen roja como resultado.


¿Hay alguien aquí tiene alguna idea sobre cómo evitar esto, o es simplemente no FireMonkey capaz de utilizar todo el potencial de mi tarjeta gráfica?

Nota, he visto que el requisito mínimo para FireMonkey es una tarjeta gráfica con nivel de sombreador 2.0, pero no está claro si eso significa que no puede usar el nivel de sombreado 3 o superior.

+3

+1, pregunta interesante! También me interesaría leer cómo estás compilando y usando shaders. –

Respuesta

3

Esta respuesta es correcta en el momento de la escritura, sino que posiblemente cambiar a medida que FireMonkey desarrolla:

No puede utilizar PixelShader o ShaderModel 3.0 o superior, como FireMonkey (bajo Windows) utiliza DirectX 9, mientras que PixelShader/ShaderModel 3.0+ son características de DirectX 10. Si mira en Winapi.D3DX9.pas (líneas 2871-2872), podrá confirmar que ps_3_0 no es un token válido aquí, mientras que en Winapi.D3DX10.pas (líneas 3224-3230) es compatible.

Entonces, la única forma en que podría usar PixelShader/ShaderModel 3.0+ sería modificar FireMonkey usted mismo para usar un contexto de DirectX 10, o solicitar (con el respaldo de otros) que Embarcadero lo cambie por usted .

+1

Creo que esto está mal. DirectX 9.0c (desde 2004) admite shader model 3.0. SM2 vino con la versión original de DirectX9.0, pero 9.0c tiene ocho años y es muy estándar. DirectX 10 introdujo SM4. No he revisado las traducciones de Pascal, por lo que tal vez les falta un token válido, pero esto significa que si FMX usa DirectX 9 definitivamente debería ser capaz de usar SM3. –

+0

Puede tener razón. Lo que puedo decir con certeza es que la traducción de Delphi para DX9 no * proporciona * la bandera ps_3_0. No estoy del todo seguro de si DirectX 9.0c agregó SM 3.0 y PS 3.0, pero los encabezados de Delphi ciertamente no lo hacen. – LaKraven