Supportare le mappe delle ombreggiature in un'ampia gamma di hardwareSupport shadow maps on a range of hardware

Rendering di ombreggiature con maggiore fedeltà nei dispositivi più veloci e di ombreggiature più veloci nei dispositivi meno potenti.Render higher-fidelity shadows on faster devices and faster shadows on less powerful devices. Parte 4 della Procedura dettagliata: Implementare volumi d’ombra tramite buffer di intensità in Direct3D 11.Part 4 of Walkthrough: Implement shadow volumes using depth buffers in Direct3D 11.

Tipi di filtri di confrontoComparison filter types

Usa i filtri lineari solo se il dispositivo può sopportare il calo di prestazioni.Only use linear filtering if the device can afford the performance penalty. In genere, _ i dispositivi con livello di funzionalità di Direct3D 9 1 non hanno una potenza sufficiente per l'applicazione di filtri lineari sulle ombre.Generally, Direct3D feature level 9_1 devices don't have enough power to spare for linear filtering on shadows. In questi dispositivi usa invece i filtri a punti.Use point filtering instead on these devices. Quando usi il filtro lineare, regola il pixel shader in modo che sfumi i bordi delle ombreggiature.When you use linear filtering, adjust the pixel shader so that it blends the shadow edges.

Crea il campionatore di confronto per il filtro a punti:Create the comparison sampler for point filtering:

D3D11_SAMPLER_DESC comparisonSamplerDesc;
ZeroMemory(&comparisonSamplerDesc, sizeof(D3D11_SAMPLER_DESC));
comparisonSamplerDesc.AddressU = D3D11_TEXTURE_ADDRESS_BORDER;
comparisonSamplerDesc.AddressV = D3D11_TEXTURE_ADDRESS_BORDER;
comparisonSamplerDesc.AddressW = D3D11_TEXTURE_ADDRESS_BORDER;
comparisonSamplerDesc.BorderColor[0] = 1.0f;
comparisonSamplerDesc.BorderColor[1] = 1.0f;
comparisonSamplerDesc.BorderColor[2] = 1.0f;
comparisonSamplerDesc.BorderColor[3] = 1.0f;
comparisonSamplerDesc.MinLOD = 0.f;
comparisonSamplerDesc.MaxLOD = D3D11_FLOAT32_MAX;
comparisonSamplerDesc.MipLODBias = 0.f;
comparisonSamplerDesc.MaxAnisotropy = 0;
comparisonSamplerDesc.ComparisonFunc = D3D11_COMPARISON_LESS_EQUAL;
comparisonSamplerDesc.Filter = D3D11_FILTER_COMPARISON_MIN_MAG_MIP_POINT;

// Point filtered shadows can be faster, and may be a good choice when
// rendering on hardware with lower feature levels. This sample has a
// UI option to enable/disable filtering so you can see the difference
// in quality and speed.

DX::ThrowIfFailed(
    pD3DDevice->CreateSamplerState(
        &comparisonSamplerDesc,
        &m_comparisonSampler_point
        )
    );

Crea quindi un campionatore per il filtro lineare:Then create a sampler for linear filtering:

comparisonSamplerDesc.Filter = D3D11_FILTER_COMPARISON_MIN_MAG_MIP_LINEAR;
DX::ThrowIfFailed(
    pD3DDevice->CreateSamplerState(
        &comparisonSamplerDesc,
        &m_comparisonSampler_linear
        )
    );

Scegli un campionatore:Choose a sampler:

ID3D11PixelShader* pixelShader;
ID3D11SamplerState** comparisonSampler;
if (m_useLinear)
{
    pixelShader = m_shadowPixelShader_linear.Get();
    comparisonSampler = m_comparisonSampler_linear.GetAddressOf();
}
else
{
    pixelShader = m_shadowPixelShader_point.Get();
    comparisonSampler = m_comparisonSampler_point.GetAddressOf();
}

// Attach our pixel shader.
context->PSSetShader(
    pixelShader,
    nullptr,
    0
    );

context->PSSetSamplers(0, 1, comparisonSampler);
context->PSSetShaderResources(0, 1, m_shadowResourceView.GetAddressOf());

Sfuma i bordi dell'ombreggiatura con il filtro lineare:Blend shadow edges with linear filtering:

// Blends the shadow area into the lit area.
float3 light = lighting * (ambient + DplusS(N, L, NdotL, input.view));
float3 shadow = (1.0f - lighting) * ambient;
return float4(input.color * (light + shadow), 1.f);

Dimensioni del buffer ombreggiaturaShadow buffer size

Le mappe delle ombreggiature più grandi non avranno un aspetto così frastagliato, ma occuperanno maggiore spazio nella memoria grafica.Larger shadow maps won't look as blocky but they take up more space in graphics memory. Sperimenta diverse dimensioni per la mappa delle ombreggiature nel gioco e osserva i risultati in tipi di dispositivi e con dimensioni dello schermo diversi.Experiment with different shadow map sizes in your game and observe the results in different types of devices and different display sizes. Prendi in considerazione un'ottimizzazione come le mappe delle ombreggiature a cascata per ottenere risultati migliori con minore memoria grafica.Consider an optimization like cascaded shadow maps to get better results with less graphics memory. Vedi Tecniche comuni per migliorare le mappe di intensità delle ombreggiature.See Common Techniques to Improve Shadow Depth Maps.

Intensità del buffer ombreggiaturaShadow buffer depth

Una maggiore precisione nel buffer ombreggiatura offrirà risultati dei test di intensità più accurati, contribuendo così a evitare problemi come le contese per il buffer z.Greater precision in the shadow buffer will give more accurate depth test results, which helps avoid issues like z-buffer fighting. Come per le mappe delle ombreggiature più grandi, per una maggiore precisione è richiesta più memoria.But like larger shadow maps, greater precision takes up more memory. Provare con diversi tipi di precisione della profondità nel formato Game-DXGI _ _ R24G8 senza _ tipo _ e formato DXGI R16 senza _ _ tipo e osservare la velocità e la qualità dei diversi livelli di funzionalità.Experiment with different depth precision types in your game - DXGI_FORMAT_R24G8_TYPELESS versus DXGI_FORMAT_R16_TYPELESS - and observe the speed and quality on different feature levels.

Ottimizzazione degli shader precompilatiOptimizing precompiled shaders

Le app UWP (Universal Windows Store) possono usare la compilazione di shader dinamici, ma è più veloce usare il collegamento di shader dinamici.Universal Windows Platform (UWP) apps can use dynamic shader compilation, but it's faster to use dynamic shader linking. Puoi anche usare direttive del compilatore e blocchi #ifdef per creare versioni di shader diverse.You can also use compiler directives and #ifdef blocks to create different versions of shaders. Per ottenere questo risultato è sufficiente aprire il file di progetto di Visual Studio in un editor di testo e aggiungere più voci <FxcCompiler> per il codice HLSL, ognuna con le definizioni del preprocessore appropriate.This is done by opening the Visual Studio project file in a text editor and adding multiple <FxcCompiler> entries for the HLSL (each with the appropriate preprocessor definitions). Si noti che questa operazione richiede nomi file diversi. in questo caso, Visual Studio aggiunge _ il punto e _ lineare alle diverse versioni dello shader.Note that this necessitates different filenames; in this case, Visual Studio appends _point and _linear to the different versions of the shader.

La voce del file di progetto per la versione con filtro lineare dello shader definisce LINEAR:The project file entry for the linear filtered version of the shader defines LINEAR:

<FxCompile Include="Content\ShadowPixelShader.hlsl">
  <ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">Pixel</ShaderType>
  <ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">Pixel</ShaderType>
  <ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Pixel</ShaderType>
  <ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Pixel</ShaderType>
  <ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Pixel</ShaderType>
  <ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Pixel</ShaderType>
  <DisableOptimizations Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">false</DisableOptimizations>
  <EnableDebuggingInformation Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">true</EnableDebuggingInformation>
  <DisableOptimizations Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</DisableOptimizations>
  <DisableOptimizations Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</DisableOptimizations>
  <ObjectFileOutput Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">$(OutDir)%(Filename)_linear.cso</ObjectFileOutput>
  <ObjectFileOutput Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">$(OutDir)%(Filename)_linear.cso</ObjectFileOutput>
  <ObjectFileOutput Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(OutDir)%(Filename)_linear.cso</ObjectFileOutput>
  <ObjectFileOutput Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(OutDir)%(Filename)_linear.cso</ObjectFileOutput>
  <ObjectFileOutput Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(OutDir)%(Filename)_linear.cso</ObjectFileOutput>
  <ObjectFileOutput Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(OutDir)%(Filename)_linear.cso</ObjectFileOutput>
  <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">LINEAR</PreprocessorDefinitions>
  <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">LINEAR</PreprocessorDefinitions>
  <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">LINEAR</PreprocessorDefinitions>
  <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">LINEAR</PreprocessorDefinitions>
  <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">LINEAR</PreprocessorDefinitions>
  <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">LINEAR</PreprocessorDefinitions>
</FxCompile>

La voce del file di progetto per la versione con filtro lineare dello shader non include le definizioni del preprocessore:The project file entry for the linear filtered version of the shader does not include preprocessor definitions:

<FxCompile Include="Content\ShadowPixelShader.hlsl">
  <ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">Pixel</ShaderType>
  <ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">Pixel</ShaderType>
  <ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Pixel</ShaderType>
  <ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Pixel</ShaderType>
  <ShaderType Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Pixel</ShaderType>
  <ShaderType Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Pixel</ShaderType>
  <DisableOptimizations Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">false</DisableOptimizations>
  <EnableDebuggingInformation Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">true</EnableDebuggingInformation>
  <DisableOptimizations Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</DisableOptimizations>
  <DisableOptimizations Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</DisableOptimizations>
  <ObjectFileOutput Condition="'$(Configuration)|$(Platform)'=='Debug|ARM'">$(OutDir)%(Filename)_point.cso</ObjectFileOutput>
  <ObjectFileOutput Condition="'$(Configuration)|$(Platform)'=='Release|ARM'">$(OutDir)%(Filename)_point.cso</ObjectFileOutput>
  <ObjectFileOutput Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(OutDir)%(Filename)_point.cso</ObjectFileOutput>
  <ObjectFileOutput Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(OutDir)%(Filename)_point.cso</ObjectFileOutput>
  <ObjectFileOutput Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">$(OutDir)%(Filename)_point.cso</ObjectFileOutput>
  <ObjectFileOutput Condition="'$(Configuration)|$(Platform)'=='Release|x64'">$(OutDir)%(Filename)_point.cso</ObjectFileOutput>
</FxCompile>