Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Sommige effectconstanten hoeven alleen te worden geïnitialiseerd. Zodra de status van het effect is geïnitialiseerd, wordt deze ingesteld op het apparaat voor de volledige renderlus. Andere variabelen moeten worden bijgewerkt telkens wanneer de render-lus wordt aangeroepen. De basiscode voor het instellen van effectvariabelen wordt hieronder weergegeven voor elk van de typen variabelen.
Een effect bevat alle renderstatussen die nodig zijn om een rendering-pass uit te voeren. In termen van de API zijn er drie typen statussen ingekapseld in een effect.
Constante status
Declareer eerst variabelen in een effect met behulp van HLSL-gegevenstypen.
//--------------------------------------------------------------------------------------
// Global variables
//--------------------------------------------------------------------------------------
float4 g_MaterialAmbientColor; // Material's ambient color
float4 g_MaterialDiffuseColor; // Material's diffuse color
int g_nNumLights;
float3 g_LightDir[3]; // Light's direction in world space
float4 g_LightDiffuse[3]; // Light's diffuse color
float4 g_LightAmbient; // Light'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
Ten tweede declareert u variabelen in de toepassing die door de toepassing kunnen worden ingesteld en werkt u vervolgens de effectvariabelen bij.
D3DXMATRIX mWorldViewProjection;
D3DXVECTOR3 vLightDir[MAX_LIGHTS];
D3DXVECTOR4 vLightDiffuse[MAX_LIGHTS];
D3DXMATRIX mWorld;
D3DXMATRIX mView;
D3DXMATRIX mProj;
// Get the projection and view matrix from the camera class
mWorld = g_mCenterMesh * *g_Camera.GetWorldMatrix();
mProj = *g_Camera.GetProjMatrix();
mView = *g_Camera.GetViewMatrix();
OnD3D11CreateDevice()
{
...
g_pLightDir = g_pEffect11->GetVariableByName( "g_LightDir" )->AsVector();
g_pLightDiffuse = g_pEffect11->GetVariableByName( "g_LightDiffuse" )->AsVector();
g_pmWorldViewProjection = g_pEffect11->GetVariableByName(
"g_mWorldViewProjection" )->AsMatrix();
g_pmWorld = g_pEffect11->GetVariableByName( "g_mWorld" )->AsMatrix();
g_pfTime = g_pEffect11->GetVariableByName( "g_fTime" )->AsScalar();
g_pMaterialAmbientColor = g_pEffect11->GetVariableByName("g_MaterialAmbientColor")->AsVector();
g_pMaterialDiffuseColor = g_pEffect11->GetVariableByName(
"g_MaterialDiffuseColor" )->AsVector();
g_pnNumLights = g_pEffect11->GetVariableByName( "g_nNumLights" )->AsScalar();
}
Gebruik ten derde de updatemethoden om de waarde van de variabelen in de toepassing in te stellen in de effectvariabelen.
OnD3D11FrameRender()
{
...
g_pLightDir->SetRawValue( vLightDir, 0, sizeof(D3DXVECTOR3)*MAX_LIGHTS );
g_pLightDiffuse->SetFloatVectorArray( (float*)vLightDiffuse, 0, MAX_LIGHTS );
g_pmWorldViewProjection->SetMatrix( (float*)&mWorldViewProjection );
g_pmWorld->SetMatrix( (float*)&mWorld );
g_pfTime->SetFloat( (float)fTime );
g_pnNumLights->SetInt( g_nNumActiveLights );
}
Twee manieren om de status op te halen in een effectvariabele
Er zijn twee manieren om de status op te halen in een effectvariabele. Gezien een effect dat in het geheugen is geladen.
Een manier is om de samplerstatus op te halen uit een ID3DX11EffectVariable die als voorbeeldinterface is gecast.
D3D11_SAMPLER_DESC sampler_desc;
ID3D11EffectSamplerVariable* l_pD3D11EffectVariable = NULL;
if( g_pEffect11 )
{
l_pD3D11EffectVariable = g_pEffect11->GetVariableByName( "MeshTextureSampler" )->AsSampler();
if( l_pD3D11EffectVariable->IsValid() )
hr = (l_pD3D11EffectVariable->GetBackingStore( 0,
&sampler_desc );
}
De andere manier is om de samplerstatus op te halen uit een ID3D11SamplerState.
ID3D11SamplerState* l_ppSamplerState = NULL;
D3D11_SAMPLER_DESC sampler_desc;
ID3D11EffectSamplerVariable* l_pD3D11EffectVariable = NULL;
if( g_pEffect11 )
{
l_pD3D11EffectVariable = g_pEffect11->GetVariableByName( "MeshTextureSampler" )->AsSampler();
if( l_pD3D11EffectVariable->IsValid )
{
hr = l_pD3D11EffectVariable->GetSampler( 0,
&l_ppSamplerState );
if( l_ppSamplerState )
l_ppSamplerState->GetDesc( &sampler_desc );
}
}
Arceringsstatus
De arceringsstatus wordt gedeclareerd en toegewezen in een effecttechniek, binnen een pass.
VertexShader vsRenderScene = CompileShader( vs_4_0, RenderSceneVS( 1, true, true );
technique10 RenderSceneWithTexture1Light
{
pass P0
{
SetVertexShader( vsRenderScene );
SetGeometryShader( NULL );
SetPixelShader( CompileShader( ps_4_0, RenderScenePS( true ) ) );
}
}
Dit werkt net zoals het zou zijn als u geen effect zou gebruiken. Er zijn drie aanroepen, één voor elk type shader (hoekpunt, geometrie en pixel). De eerste, SetVertexShader, roept ID3D11DeviceContext::VSSetShaderaan. CompileShader is een speciale effectfunctie die het shader-profiel (vs_4_0) en de naam van de vertex shader-functie (RenderVS) gebruikt. Met andere woorden, elk van deze CompileShader-aanroepen compileert de bijbehorende shader-functie en retourneert een aanwijzer naar de gecompileerde shader.
Houd er rekening mee dat niet alle arceringsstatus moet worden ingesteld. Deze pas bevat geen SetHullShader- of SetDomainShader-aanroepen, wat betekent dat de momenteel gebonden romp- en domein-shaders ongewijzigd blijven.
Patroonstatus
De textuurstatus is iets complexer dan het instellen van een variabele, omdat patroongegevens niet alleen als een variabele worden gelezen, maar uit een bitmappatroon worden genomen. Daarom moet u de patroonvariabele definiëren (net als een normale variabele, behalve het gebruik van een patroontype) en moet u de steekproefvoorwaarden definiëren. Hier volgt een voorbeeld van een declaratie van een patroonvariabele en de bijbehorende declaratie van de steekproefstatus.
Texture2D g_MeshTexture; // Color texture for mesh
SamplerState MeshTextureSampler
{
Filter = MIN_MAG_MIP_LINEAR;
AddressU = Wrap;
AddressV = Wrap;
};
Hier volgt een voorbeeld van het instellen van een patroon van een toepassing. In dit voorbeeld wordt het patroon opgeslagen in de mesh-gegevens die zijn geladen toen het effect werd gemaakt.
De eerste stap is het ophalen van een aanwijzer naar het patroon van het effect (van het mesh).
ID3D11EffectShaderResourceVariable* g_ptxDiffuse = NULL;
// Obtain variables
g_ptxDiffuse = g_pEffect11->GetVariableByName( "g_MeshTexture" )->AsShaderResource();
De tweede stap is het opgeven van een weergave voor toegang tot het patroon. De weergave definieert een algemene manier om toegang te krijgen tot de gegevens uit de structuurresource.
OnD3D11FrameRender()
{
ID3D11ShaderResourceView* pDiffuseRV = NULL;
...
pDiffuseRV = g_Mesh11.GetMaterial(pSubset->MaterialID)->pDiffuseRV11;
g_ptxDiffuse->SetResource( pDiffuseRV );
...
}
Vanuit het perspectief van de toepassing worden niet-geordende toegangsweergaven op dezelfde manier verwerkt als arceringsresourceweergaven. In de functies pixel-shader en compute-shader worden niet-geordende toegangsweergavegegevens echter rechtstreeks gelezen van/naar geschreven. U kunt geen voorbeeld nemen uit een niet-geordende toegangsweergave.
Zie Resourcesvoor meer informatie over het weergeven van resources.
Verwante onderwerpen