Megosztás a következőn keresztül:


Árnyékolók összeállítása

Jegyzet

Ez a témakör a Shader Models 2–5.1-hez használt FXC.EXE fordítót ismerteti. A Shader Model 6 esetében ehelyett DXC.EXE kell használnia, amely dxc.exe és dxcompiler.dllhasználata című témakörben található. A Visual Studio automatikusan DXC.EXE fog használni, ha a 6. árnyékolómodell van kiválasztva a HLSL tulajdonságlap konfigurációjában.

A Microsoft Visual Studio, a C++ projektbe belefoglalt *.hlsl és *.fx fájlokból, árnyékoló kódot tud fordítani.

A buildelési folyamat részeként a Visual Studio a fxc.exe vagy dxc.exe HLSL-kódfordítóval lefordítja a HLSL shader forrásfájljait bináris shader objektumfájlokká vagy a fejlécfájlokban definiált bájttömbökbe. Az, hogy a HLSL-kódfordító hogyan fordítja le a projektben lévő árnyékoló forrásfájljait, attól függ, hogyan adja meg az adott fájlhoz tartozó Ouput Files tulajdonságot. További információ a HLSL tulajdonságlapjairól: HLSL tulajdonságlapok.

A használt fordítási módszer általában a HLSL shader forrásfájl méretétől függ. Ha nagy mennyiségű bájtkódot tartalmaz egy fejlécben, növeli az alkalmazás méretét és kezdeti betöltési idejét. Az összes bájtkódot arra is kényszerítheti, hogy az árnyékoló létrehozása után is a memóriában legyen, ami erőforrásokat pazarol. Ha azonban bájtkódot is belefoglal egy fejlécbe, csökkentheti a kód összetettségét, és egyszerűbbé teheti a shader létrehozását.

Nézzük meg most a shader-kód fordításának különböző módjait és a shader-kód fájlkiterjesztéseinek konvencióit.

Shader-kód kiterjesztéseinek használata

A Microsoft konvenciójának való megfeleléshez használja az alábbi fájlkiterjesztéseket a shader-kódhoz:

  • A .hlsl kiterjesztésű fájlok magas szintű árnyékolási nyelvet (HLSL) forráskódot tárolnak. A régebbi .fx kiterjesztés is támogatott, de általában az örökölt Effectek rendszeréheztársul.
  • A .cso kiterjesztésű fájl egy lefordított árnyékoló objektumot tárol.
  • A .h kiterjesztésű fájl fejlécfájl, de árnyékolókód-környezetben ez a fejlécfájl egy bájttömböt határoz meg, amely árnyékolóadatokat tartalmaz. A HLSL shader-kódfejlécek további gyakori bővítményei közé tartozik a .hlsli és a .fxh.

Fordítás a létrehozáskor az objektumfájlokhoz

Ha bináris árnyékoló objektumfájlokká állítja össze a .hlsl-fájlokat, az alkalmazásnak be kell olvasnia az adatokat ezekből az objektumfájlokból (ezekhez az objektumfájlokhoz a .cso az alapértelmezett bővítmény), ki kell osztania az adatokat bájttömbökhöz, és árnyékoló objektumokat kell létrehoznia ezekből a bájttömbökből. Csúcsárnyékoló (ID3D11VertexShader**) létrehozásához például hívja meg az ID3D11Device::CreateVertexShader metódust egy lefordított csúcspont-árnyékoló bájtkódot tartalmazó bájttömbdel. Ebben a példakódban a SimpleVertexShader.hlsl fájl Ouput Files tulajdonsága a SimpleVertexShader.cso objektumfájlba való fordítást határozza meg.

        auto vertexShaderBytecode = ReadData("SimpleVertexShader.cso");
        ComPtr<ID3D11VertexShader> vertexShader;
        DX::ThrowIfFailed(
            m_d3dDevice->CreateVertexShader(
                vertexShaderBytecode->Data,
                vertexShaderBytecode->Length,
                nullptr,
                &vertexShader
                )

Az itt található ReadData-segéd az aktuális munkakönyvtárban, valamint az aktuális folyamat EXE-fájljának könyvtárában keresi a .cso fájlokat, mivel ezek jellemzően más VS build termékek mellett találhatók. Példamegvalósításért lásd ReadData.h.

Létrehozás közbeni fordítás a fejlécfájlokhoz

Ha a .hlsl-fájlokat fejlécfájlokban definiált bájttömbökre fordítja, ezeket a fejlécfájlokat is bele kell foglalnia a kódba. Ebben a példakódban a PixelShader.hlsl fájl Ouput Files tulajdonsága a PixelShader.h fejlécfájlban definiált g_psshader bájttömbbe való fordítást határozza meg.

namespace
{
       include "PixelShader.h"
}
...
        ComPtr<ID3D11PixelShader> m_pPixelShader;
        hr = pDevice->CreatePixelShader(g_psshader, sizeof(g_psshader), nullptr, &m_pPixelShader);

Fordítás a D3DCompileFromFile használatával

A D3DCompileFromFile függvényt futtatáskor is használhatja a Direct3D 11 árnyékolókódjának fordításához. Ennek módjáról további információt a How To: Compile a Shadercímű témakörben talál.

Jegyzet

A Windows Áruházbeli alkalmazások támogatják a D3DCompileFromFile használatát a fejlesztéshez, üzembe helyezéshez azonban nem.

 

HLSL- programozási útmutatója

HLSL- programozási útmutatója