Compartir a través de


Organización del estado en un efecto (Direct3D 11)

Con Direct3D 11, el estado de efecto para determinadas fases de canalización está organizado por estructuras. Estas son las estructuras:

Estado de la canalización Estructura
Rasterización D3D11_RASTERIZER_DESC
Fusión de salida D3D11_BLEND_DESC y D3D11_DEPTH_STENCIL_DESC
Sombreadores Consulte a continuación

 

Para las fases del sombreador, donde el número de cambios de estado debe controlarse más mediante una aplicación, el estado se ha dividido en estado de búfer constante, estado de muestreo, estado de recurso de sombreador y estado de vista de acceso desordenado (para sombreadores de píxeles y proceso). Esto permite que una aplicación que esté cuidadosamente diseñada para actualizar solo el estado que está cambiando, lo que mejora el rendimiento al reducir la cantidad de datos que se deben pasar a la GPU.

¿Cómo se organiza el estado de la canalización en un efecto?

La respuesta es que el orden no importa. Las variables globales no tienen que ubicarse en la parte superior. Sin embargo, todos los ejemplos del SDK siguen el mismo orden, ya que es recomendable organizar los datos de la misma manera. Por lo tanto, se trata de una breve descripción del orden de datos en los ejemplos del SDK de DirectX.

Variables globales

Al igual que la práctica estándar de C, las variables globales se declaran primero, en la parte superior del archivo. A menudo, son variables que se inicializarán mediante una aplicación y, a continuación, se usarán en un efecto. A veces se inicializan y nunca cambian, otras veces se actualizan todos los fotogramas. Al igual que las reglas de ámbito de función de C, las variables de efecto declaradas fuera del ámbito de las funciones de efecto son visibles en todo el efecto; cualquier variable declarada dentro de una función de efecto solo es visible dentro de esa función.

Este es un ejemplo de las variables declaradas en BasicHLSL10.fx.

// Global variables
float4 g_MaterialAmbientColor;      // Material's ambient color

Texture2D g_MeshTexture;            // Color texture for mesh

float    g_fTime;                   // App's time in seconds
float4x4 g_mWorld;                  // World matrix for object
float4x4 g_mWorldViewProjection;    // World * View * Projection matrix


// Texture samplers
SamplerState MeshTextureSampler
{
    Filter = MIN_MAG_MIP_LINEAR;
    AddressU = Wrap;
    AddressV = Wrap;
};

La sintaxis de las variables de efecto se detalla más detalladamente en Sintaxis de variable de efecto (Direct3D 11). La sintaxis de los muestreadores de texturas de efecto es más detallada en Sampler Type (DirectX HLSL).

Sombreadores

Los sombreadores son programas ejecutables pequeños. Puede pensar en sombreadores como encapsular el estado del sombreador, ya que el código HLSL implementa la funcionalidad del sombreador. Canalización de gráficos hasta cinco tipos diferentes de sombreadores.

  • Sombreadores de vértices: funciona en datos de vértices. Un vértice en produce un vértice fuera.
  • Sombreadores de casco: funcionan en los datos de revisión. Fase de punto de control: una invocación produce un punto de control; Para cada bifurcación y fases de combinación: una revisión produce cierta cantidad de datos constantes de revisión.
  • Sombreadores de dominio: funcionan en datos primitivos. Un primitivo puede producir 0, 1 o muchos primitivos.
  • Sombreadores de geometría: funcionan en datos primitivos. Un primitivo en puede producir 0, 1 o muchos primitivos fuera.
  • Sombreadores de píxeles: funcionan en datos de píxeles. Un píxel en produce 1 píxel fuera (a menos que el píxel se seleccione fuera de una representación).

La canalización del sombreador de proceso usa un sombreador:

  • Sombreadores de proceso: funciona en cualquier tipo de datos. La salida es independiente del número de subprocesos.

Los sombreadores son funciones locales y siguen las reglas de función de estilo C. Cuando se compila un efecto, cada sombreador se compila y un puntero a cada función de sombreador se almacena internamente. Cuando la compilación se realiza correctamente, se devuelve una interfaz ID3D11Effect. En este punto, el efecto compilado está en un formato intermedio.

Para obtener más información sobre los sombreadores compilados, deberá usar la reflexión del sombreador. Esto es básicamente como pedir al tiempo de ejecución que descompile los sombreadores y devolver información sobre el código del sombreador.

struct VS_OUTPUT
{
    float4 Position   : SV_POSITION; // vertex position 
    float4 Diffuse    : COLOR0;      // vertex diffuse color
    float2 TextureUV  : TEXCOORD0;   // vertex texture coords 
};

VS_OUTPUT RenderSceneVS( float4 vPos : POSITION,
                         float3 vNormal : NORMAL,
                         float2 vTexCoord0 : TEXCOORD,
                         uniform int nNumLights,
                         uniform bool bTexture,
                         uniform bool bAnimate )
{
    VS_OUTPUT Output;
    float3 vNormalWorldSpace;
 
    ....    
    
    return Output;    
}


struct PS_OUTPUT
{
    float4 RGBColor : SV_Target;  // Pixel color
};

PS_OUTPUT RenderScenePS( VS_OUTPUT In,
                         uniform bool bTexture ) 
{ 
    PS_OUTPUT Output;

    if( bTexture )
        Output.RGBColor = g_MeshTexture.Sample(MeshTextureSampler, In.TextureUV) * In.Diffuse;
    ....

    return Output;
}

La sintaxis de los sombreadores de efectos es más detallada en Sintaxis de función de efecto (Direct3D 11).

Grupos, técnicas y pases

Un grupo es una colección de técnicas. Una técnica es una colección de pasos de representación (debe haber al menos un pase). Cada paso de efecto (que es similar en el ámbito a un único paso en un bucle render) define el estado del sombreador y cualquier otro estado de canalización necesario para representar la geometría.

Los grupos son opcionales. Hay un único grupo sin nombre que abarca todas las técnicas globales. Todos los demás grupos deben tener nombre.

Este es un ejemplo de una técnica (que incluye un paso) de BasicHLSL10.fx.

technique10 RenderSceneWithTexture1Light
{
    pass P0
    {
        SetVertexShader( CompileShader( vs_4_0, RenderSceneVS( 1, true, true ) ) );
        SetGeometryShader( NULL );
        SetPixelShader( CompileShader( ps_4_0, RenderScenePS( true ) ) );
    }
}

fxgroup g0
{
    technique11 RunComputeShader
    {
        pass P0
        {
            SetComputeShader( CompileShader( cs_5_0, CS() ) );
        }
    }
}

La sintaxis de los sombreadores de efectos es más detallada en Sintaxis de técnica de efecto (Direct3D 11).

Efectos (Direct3D 11)