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.
Vytváření vyrovnávacích pamětí vyžaduje definování dat, která bude vyrovnávací paměť ukládat, poskytování inicializačních dat a nastavení vhodných příznaků použití a vazeb. Chcete-li vytvořit textury, přečtěte si vytváření prostředků textury (Direct3D 10).
- Vytvoření Vertex Bufferu
- Vytvořte indexový buffer
- Vytvořit konstantní vyrovnávací paměť
- související témata
Vytvořte vertex buffer
Postup vytvoření vyrovnávací paměti vrcholů je následující.
- Vytvořte popis vyrovnávací paměti
- Vytvořit inicializační data pro vyrovnávací paměť
- Vytvořte vyrovnávací paměť
Vytvoření popisu vyrovnávací paměti
Při vytváření vyrovnávací paměti vrcholu se použije popis vyrovnávací paměti (viz D3D10_BUFFER_DESC) k definování způsobu uspořádání dat v rámci vyrovnávací paměti, způsobu přístupu k vyrovnávací paměti prostřednictvím pipeline a použití vyrovnávací paměti.
Následující příklad ukazuje, jak vytvořit popis vyrovnávací paměti pro jeden trojúhelník s vrcholy, které obsahují umístění a barevné hodnoty.
struct SimpleVertex
{
D3DXVECTOR3 Position;
D3DXVECTOR3 Color;
};
D3D10_BUFFER_DESC bufferDesc;
bufferDesc.Usage = D3D10_USAGE_DEFAULT;
bufferDesc.ByteWidth = sizeof( SimpleVertex ) * 3;
bufferDesc.BindFlags = D3D10_BIND_VERTEX_BUFFER;
bufferDesc.CPUAccessFlags = 0;
bufferDesc.MiscFlags = 0;
V tomto příkladu je popis vyrovnávací paměti inicializován s téměř všemi výchozími nastaveními pro využití, přístup k procesoru a různé příznaky. Další nastavení jsou pro příznak vázání , který identifikuje prostředek pouze jako vyrovnávací paměť vrcholů, a specifikují velikost vyrovnávací paměti.
Příznaky využití a přístupu k procesoru jsou důležité pro výkon. Tyto dva příznaky společně určují, jak často se k prostředku přistupuje, do jakého typu paměti se prostředek může načíst a do jakého procesoru je potřeba získat přístup k prostředku. Výchozí používání tohoto zdroje se nebude často aktualizovat. Nastavení přístupu k procesoru na 0 znamená, že procesor nebude muset prostředek číst ani zapisovat. V kombinaci to znamená, že runtime může načíst prostředek do paměti s nejvyšším výkonem pro GPU, protože prostředek nevyžaduje přístup k CPU.
Podle očekávání existuje kompromis mezi nejlepším výkonem a dostupností libovolného procesoru. Například výchozí využití bez přístupu k procesoru znamená, že prostředek je možné zpřístupnit výhradně GPU. To může zahrnovat načtení prostředku do paměti, které není přímo přístupné procesorem. Prostředek lze upravit pouze pomocí UpdateSubresource.
Vytvořte inicializační data pro vyrovnávací paměť
Vyrovnávací paměť je pouze kolekce prvků a je rozložena jako 1D pole. Výsledkem je, že rozteč paměti systému a rozteč řezu systémové paměti jsou stejné, což odpovídá velikosti deklarace dat vrcholu. Aplikace může poskytnout inicializační data při vytváření vyrovnávací paměti pomocí podsložkového popisu, který zahrnuje ukazatel na skutečná zdrojová data a informace o velikosti a rozložení dat.
Veškerá vyrovnávací paměť vytvořená pomocí neměnného použití (viz D3D10_USAGE_IMMUTABLE) musí být inicializována při vytváření. Vyrovnávací paměti, které používají jakýkoli jiný příznak použití, je možné aktualizovat po inicializaci pomocí CopyResource, CopySubresourceRegiona UpdateSubresourcenebo přístupem k podkladové paměti pomocí metody Map.
Vytvořte vyrovnávací paměť
Pomocí popisu vyrovnávací paměti a inicializačních dat (což je volitelné) zavolejte funkci CreateBuffer pro vytvoření vyrovnávací paměti pro vrcholy. Následující úryvek kódu ukazuje, jak vytvořit vertex buffer z pole vrcholových dat deklarovaných aplikací.
struct SimpleVertexCombined
{
D3DXVECTOR3 Pos;
D3DXVECTOR3 Col;
};
ID3D10InputLayout* g_pVertexLayout = NULL;
ID3D10Buffer* g_pVertexBuffer[2] = { NULL, NULL };
ID3D10Buffer* g_pIndexBuffer = NULL;
SimpleVertexCombined verticesCombo[] =
{
D3DXVECTOR3( 0.0f, 0.5f, 0.5f ),
D3DXVECTOR3( 0.0f, 0.0f, 0.5f ),
D3DXVECTOR3( 0.5f, -0.5f, 0.5f ),
D3DXVECTOR3( 0.5f, 0.0f, 0.0f ),
D3DXVECTOR3( -0.5f, -0.5f, 0.5f ),
D3DXVECTOR3( 0.0f, 0.5f, 0.0f ),
};
D3D10_BUFFER_DESC bufferDesc;
bufferDesc.Usage = D3D10_USAGE_DEFAULT;
bufferDesc.ByteWidth = sizeof( SimpleVertexCombined ) * 3;
bufferDesc.BindFlags = D3D10_BIND_VERTEX_BUFFER;
bufferDesc.CPUAccessFlags = 0;
bufferDesc.MiscFlags = 0;
D3D10_SUBRESOURCE_DATA InitData;
InitData.pSysMem = verticesCombo;
InitData.SysMemPitch = 0;
InitData.SysMemSlicePitch = 0;
hr = g_pd3dDevice->CreateBuffer( &bufferDesc, &InitData, &g_pVertexBuffer[0] );
Vytvořte indexový buffer
Vytvoření vyrovnávací paměti indexu je velmi podobné vytvoření vyrovnávací paměti vrcholů; se dvěma rozdíly. Vyrovnávací paměť indexu obsahuje pouze 16bitová nebo 32bitová data, na rozdíl od široké škály formátů dostupných pro vrcholovou vyrovnávací paměť. Vyrovnávací paměť indexu také vyžaduje příznak pro připojení indexového bufferu.
Následující příklad ukazuje, jak vytvořit indexový buffer z pole dat indexu.
ID3D10Buffer *g_pIndexBuffer = NULL;
// Create indices
unsigned int indices[] = { 0, 1, 2 };
D3D10_BUFFER_DESC bufferDesc;
bufferDesc.Usage = D3D10_USAGE_DEFAULT;
bufferDesc.ByteWidth = sizeof( unsigned int ) * 3;
bufferDesc.BindFlags = D3D10_BIND_INDEX_BUFFER;
bufferDesc.CPUAccessFlags = 0;
bufferDesc.MiscFlags = 0;
D3D10_SUBRESOURCE_DATA InitData;
InitData.pSysMem = indices;
InitData.SysMemPitch = 0;
InitData.SysMemSlicePitch = 0;
hr = g_pd3dDevice->CreateBuffer( &bufferDesc, &InitData, &g_pIndexBuffer );
if( FAILED( hr ) )
return hr;
g_pd3dDevice->IASetIndexBuffer( g_pIndexBuffer, DXGI_FORMAT_R32_UINT, 0 );
Vytvoření konstantní vyrovnávací paměti
Direct3D 10 zavádí konstantní vyrovnávací paměť. Vyrovnávací paměť konstantní nebo vyrovnávací paměť shaderu je vyrovnávací paměť, která obsahuje konstanty shaderu. Tady je příklad vytvoření konstantní vyrovnávací paměti převzaté z HLSLWithoutFX10 Ukázka.
ID3D10Buffer* g_pConstantBuffer10 = NULL;
struct VS_CONSTANT_BUFFER
{
D3DXMATRIX mWorldViewProj; //mWorldViewProj will probably be global to all shaders in a project.
//It's a good idea not to move it around between shaders.
D3DXVECTOR4 vSomeVectorThatMayBeNeededByASpecificShader;
float fSomeFloatThatMayBeNeededByASpecificShader;
float fTime; //fTime may also be global to all shaders in a project.
float fSomeFloatThatMayBeNeededByASpecificShader2;
float fSomeFloatThatMayBeNeededByASpecificShader3;
};
D3D10_BUFFER_DESC cbDesc;
cbDesc.ByteWidth = sizeof( VS_CONSTANT_BUFFER );
cbDesc.Usage = D3D10_USAGE_DYNAMIC;
cbDesc.BindFlags = D3D10_BIND_CONSTANT_BUFFER;
cbDesc.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE;
cbDesc.MiscFlags = 0;
hr = g_pd3dDevice->CreateBuffer( &cbDesc, NULL, &g_pConstantBuffer10 );
if( FAILED( hr ) )
return hr;
g_pd3dDevice->VSSetConstantBuffers( 0, 1, g_pConstantBuffer10 );
Všimněte si, že při použití ID3D10Effect Interface interface je proces vytváření, přiřazování a commitování konstantní vyrovnávací paměti řízen instancí ID3D10Effect Interface. V takovém případě je nutné získat proměnnou z efektu pomocí jedné z GetVariable metod, jako je GetVariableByName a aktualizovat proměnnou pomocí jedné z SetVariable metod, jako je SetMatrix. Příklad použití ID3D10Effect Rozhraní ke správě konstantní vyrovnávací paměti viz Kurz 7: Mapování textury a konstantní vyrovnávací paměti.
Související témata