Sampler 2889 Visite) DirectX 12
I Sampler sono oggetti che descrivono il modo in cui le texture vengono lette in DirectX.
In HLSL l'accesso ad una texture avviene tramite l'istruzione Sample che richiede come input, oltre alle coordinate texture, anche quest'oggetto.
I Sampler descrivono come una texture si deve comportare ai bordi, che filtro deve avere, etc. In Direct3D12 esistono due modi per gestire i Sampler:
- Staticamente: registrandoli nella pipeline
- Dinamicamente: creandoli nell'heap.
Vediamo il primo esempio:
StaticSamplerDescription sampler = new StaticSamplerDescription()
{
Filter = Filter.MinimumMinMagMipPoint,
AddressU = TextureAddressMode.Border,
AddressV = TextureAddressMode.Border,
AddressW = TextureAddressMode.Border,
MipLODBias = 0,
MaxAnisotropy = 0,
ComparisonFunc = Comparison.Never,
BorderColor = StaticBorderColor.TransparentBlack,
MinLOD = 0.0f,
MaxLOD = float.MaxValue,
ShaderRegister = 0,
RegisterSpace = 0,
ShaderVisibility = ShaderVisibility.Pixel,
};
RootSignatureDescription rootSignatureDesc = new RootSignatureDescription(RootSignatureFlags.AllowInputAssemblerInputLayout, rootParameters, new StaticSamplerDescription[] { sampler });
Come vedete in questo esempio é stato passato nella definizione della root segnature (la definizione dei parametri di input di uno shader) un array di StaticSamplerDescription. In questo modo i Sampler saranno gestiti direttamente dalla pipeline e non dovrete preoccuparvi di assegnarli.
In alternativa potete creare Sampler dinamici che vi permetteranno di cambiarli di volta in volta e di evitare sprechi di memoria (occupano pochissimo comunque).
samplerViewHeap = device.CreateDescriptorHeap(new DescriptorHeapDescription()
{
DescriptorCount = 10,
Type = DescriptorHeapType.Sampler,
Flags = DescriptorHeapFlags.ShaderVisible
});
Quindi aggiungiamo al nostro Heap il sampler
device.CreateSampler(new SamplerStateDescription()
{
Filter = Filter.ComparisonMinMagMipLinear,
AddressU = TextureAddressMode.Wrap,
AddressV = TextureAddressMode.Wrap,
AddressW = TextureAddressMode.Wrap,
MinimumLod = float.MinValue,
MaximumLod = float.MaxValue,
MipLodBias = 0,
MaximumAnisotropy = 0,
ComparisonFunction = Comparison.Never
}, samplerViewHeap.CPUDescriptorHandleForHeapStart);
I parametri da usare sono gli stessi. I principali:
- Filter: Indica il filtro che DirectX userà. Migliore sarà la qualità e maggiore sarà il carico.
- AddressU/V/W: indica cosa accade quando le coordinate texture escono dal range 0-1. Wrap ad esempio replica la texture, Clamp la blocca mettendo il bordo come colore fisso, Mirror replica ma invertendo la texture nei range pari .
- Maximum/MinimumLod: il livello di dettaglio minimo per le texture con più layer
Testate più valori possibili per comprenderne il funzionamento.
Questo conclude il tutorial HelloTexture.