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 10 ordnas effekttillståndet för vissa pipelinesteg av följande strukturer:
| Pipeline-tillstånd | Struktur |
|---|---|
| Inmatningskomponent | D3D10_INPUT_ELEMENT_DESC |
| Rastrering | D3D10_RASTERIZER_DESC |
| Sammanfogning av utdata | D3D10_BLEND_DESC och D3D10_DEPTH_STENCIL_DESC |
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 och skuggningsresurstillstånd. 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 10). Syntaxen för effektextursamlare beskrivs i detalj i Sampler Type (DirectX HLSL).
Shaders
Skuggningar är små körbara program. Du kan betrakta skuggning som inkapslande skuggningstillstånd eftersom HLSL-koden implementerar skuggningsfunktionen. Pipelinen använder tre olika typer av skuggningar.
- Hörnskuggor – Arbeta med hörndata. Ett hörn som går in ger ett hörn som går 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).
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 ID3D10Effect-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 shader-programmen och returnera information till dig om shader-koden.
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 10).
Tekniker och pass
En teknik är en samling av renderingspass (det måste finnas minst ett renderingspass). 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.
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 ) ) );
}
}
Syntaxen för effektskuggor är mer detaljerad i Syntax för effektteknik (Direct3D 10).
Relaterade ämnen