Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Ve Direct3D 11 je stav efektu pro určité fáze potrubí uspořádán podle struktur. Tady jsou struktury:
| Stav kanálu | Struktura |
|---|---|
| Rasterizace | D3D11_RASTERIZER_DESC |
| Slučovač výstupu | D3D11_BLEND_DESC a D3D11_DEPTH_STENCIL_DESC |
| Shadery | Viz níže |
Ve fázích shaderu, kde je nutné, aby aplikace více kontrolovala počet změn stavu, je stav rozdělen do stavů konstantní vyrovnávací paměti, vzorkovače, prostředků shaderu a stavu neuspořádaného přístupu (pro pixelové a výpočetní shadery). To umožňuje aplikaci, která je pečlivě navržená tak, aby aktualizovala pouze stav, který se mění, což zvyšuje výkon snížením množství dat, která je potřeba předat gpu.
Jak tedy uspořádáte stav potrubí v efektu?
Odpověď je, že na pořadí nezáleží. Globální proměnné nemusí být umístěné v horní části. Všechny ukázky v sadě SDK se ale řídí stejným pořadím, jak je vhodné uspořádat data stejným způsobem. Toto je stručný popis řazení dat v ukázkách sady DirectX SDK.
Globální proměnné
Stejně jako standardní praxe jazyka C jsou globální proměnné deklarovány jako první v horní části souboru. Nejčastěji se jedná o proměnné, které aplikace inicializuje a následně se použijí v efektu. Někdy se inicializují a nikdy se nemění, jindy se aktualizují každý rámec. Stejně jako pravidla oboru funkce jazyka C jsou proměnné efektu deklarované mimo rozsah funkcí efektu viditelné v celém efektu; jakákoli proměnná deklarovaná uvnitř funkce efektu je viditelná pouze v rámci této funkce.
Tady je příklad proměnných deklarovaných v 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;
};
Syntaxe proměnných efektu je podrobněji popsána v Syntaxe proměnné efektu (Direct3D 11). Syntaxe vzorkovníků textur efektu je podrobněji popsána v Typ vzorkovníku (DirectX HLSL).
Shader
Shadery jsou malé spustitelné programy. Shadery si můžete představit jako zapouzdřující stav shaderu, protože kód HLSL implementuje funkci shaderu. Grafický řetězec zahrnuje až pět různých druhů shaderů.
- Vrcholové shadery – pracují s daty vrcholů. Jeden vstupující vrchol vede na jeden vystupující vrchol.
- Shadery trupu – pracují s daty záplat. Fáze kontrolního bodu: jedno vyvolání poskytuje jeden kontrolní bod; Pro každou fázi větvení a spojení: jeden segment poskytuje určité množství konstantních dat segmentu.
- Doménové shadery operují na primitivních datech. Jeden primitiv může vytvořit 0, 1 nebo mnoho primitivů.
- Geometrické shadery – operace s primitivními daty Jedna primitiva může přinést 0, 1 nebo mnoho primitiv.
- Pixelové shadery – operují s daty pixelů. Jeden pixel odpovídá 1 pixelu, pokud není při renderování vyřazen.
Výpočetní shaderová pipeline používá jeden shader:
- Výpočetní shadery – operace s jakýmkoli druhem dat Výstup je nezávislý na počtu vláken.
Shadery jsou místní funkce a dodržují pravidla funkce stylu jazyka C. Při kompilaci efektu se každý shader zkompiluje a ukazatel na každou funkci shaderu se ukládá interně. Při úspěšné kompilaci se vrátí rozhraní ID3D11Effect. V tomto okamžiku je kompilovaný efekt v přechodném formátu.
Pokud chcete zjistit další informace o zkompilovaných shaderech, budete muset použít reflexi shaderu. To se v podstatě podobá tomu, že modul runtime požádá o dekompilování shaderů a vrátí vám informace o kódu shaderu.
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;
}
Syntaxe shaderů efektu je podrobněji popsána v Syntaxe funkce efektu (Direct3D 11).
Skupiny, techniky a průchody
Skupina je kolekce technik. Technika je soubor průběhů vykreslování (musí existovat alespoň jeden průběh). Každý průchod efektu (který je podobný rozsahu jako jeden průchod ve smyčce vykreslování) definuje stav shaderu a jakýkoli jiný stav kanálu potřebný k vykreslení geometrie.
Skupiny jsou volitelné. Existuje jedna nepojmenovaná skupina, která zahrnuje všechny globální techniky. Všechny ostatní skupiny musí být pojmenované.
Tady je příklad jedné techniky (která zahrnuje jeden průchod) z 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() ) );
}
}
}
Syntaxe efektových shaderů je podrobněji vysvětlena v Techniky efektu (Direct3D 11).
Související témata