Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Med Direct3D 11 ordnas effekttillståndet för vissa pipelinesteg efter strukturer. Här är strukturerna:
| Pipeline-tillstånd | Struktur |
|---|---|
| Rastrering | D3D11_RASTERIZER_DESC |
| Sammanslagning av utdata | D3D11_BLEND_DESC och D3D11_DEPTH_STENCIL_DESC |
| Shaders | Se nedan |
För skuggningsstegen, där antalet tillståndsändringar måste kontrolleras mer av ett program, har tillståndet delats upp i konstant bufferttillstånd, exempeltillstånd, skuggningsresurstillstånd och osorterat åtkomstvytillstånd (för pixel- och beräkningsskuggor). Detta gör att ett program som är noggrant utformat för att endast uppdatera tillståndet som ändras, vilket förbättrar prestandan genom att minska mängden data som behöver skickas till GPU:n.
Så hur organiserar du pipelinetillståndet i praktiken?
Svaret är att ordern inte spelar någon roll. Globala variabler behöver inte finnas överst. Alla exempel i SDK följer dock samma ordning, eftersom det är bra att ordna data på samma sätt. Det här är en kort beskrivning av dataordningen i DirectX SDK-exemplen.
Globala variabler
Precis som standard-C-praxis deklareras globala variabler först överst i filen. Oftast är det variabler som initieras av ett program och sedan används i en effekt. Ibland initieras de och ändras aldrig, andra gånger uppdateras de varje bildruta. Precis som C-funktionsomfångsregler visas effektvariabler som deklareras utanför effektfunktionernas omfattning under hela effekten. en variabel som deklareras inuti en effektfunktion visas endast i den funktionen.
Här är ett exempel på variablerna som deklarerats i 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;
};
Syntaxen för effektvariabler är mer detaljerad i Effect Variable Syntax (Direct3D 11). Syntaxen för effekttextursamlare beskrivs mer fullständigt i Sampler Type (DirectX HLSL).
Shaders
Skuggningar är små körbara program. Du kan betrakta shaders som inkapslande shadertillstånd eftersom HLSL-koden implementerar shaderfunktionaliteten. Grafikpipelinen består av upp till fem olika typer av shaders.
- Hörnskuggor – Arbeta med hörndata. En nod in ger en nod ut.
- Hull shaders – Arbetar med patchdata. Kontrollpunktsfas: ett anrop ger en kontrollpunkt; För varje förgrenings- och kopplingsfas: en patch ger en viss mängd av patchkonstantdata.
- Domänskuggor – Arbeta med primitiva data. En primitiv kan ge 0, 1 eller många primitiver ut.
- Geometriska skuggningar – Arbeta med primitiva data. En primitiv i kan ge 0, 1 eller många primitiver ut.
- Pixelskuggare – Arbeta med pixeldata. En bildpunkt i ger 1 bildpunkt ut (om inte pixeln gallras ut från en rendering).
Pipelinen för beräkningsskuggning använder en skuggning:
- Beräkningsskuggor – Arbeta på alla typer av data. Utdata är oberoende av antalet trådar.
Skuggningar är lokala funktioner och följer funktionsregler i C-format. När en effekt kompileras kompileras varje skuggning och en pekare till varje skuggningsfunktion lagras internt. Ett ID3D11Effect-gränssnitt returneras när kompileringen lyckas. Nu är den kompilerade effekten i ett mellanliggande format.
Om du vill veta mer om de kompilerade skuggarna måste du använda skuggningsreflektion. Detta är i princip som att be körmiljön att dekompilera shaderprogrammen och återlämna information till dig om skuggningskoden.
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;
}
Syntaxen för effektskuggor är mer detaljerad i Effect Function Syntax (Direct3D 11).
Grupper, tekniker och pass
En grupp är en samling tekniker. En teknik är en samling renderingspass (det måste finnas minst ett pass). Varje effektpass (som liknar ett enda pass i en återgivningsloop) definierar skuggningstillståndet och alla andra pipelinetillstånd som krävs för att återge geometrin.
Grupper är valfria. Det finns en enda, namnlös grupp som omfattar alla globala tekniker. Alla andra grupper måste namnges.
Här är ett exempel på en teknik (som innehåller ett pass) från 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() ) );
}
}
}
Syntaxen för effektskuggningar är mer detaljerad i Effect Technique Syntax (Direct3D 11).
Relaterade ämnen