Condividi tramite


Compilazione di shader

Nota

Questo argomento illustra il FXC.EXE compilatore usato per i modelli shader da 2 a 5.1. Per Shader Model 6, invece, si usa DXC.EXE , che è documentato in Uso di dxc.exe e dxcompiler.dll. Visual Studio userà DXC.EXE automaticamente quando shader Model 6 viene selezionato per la configurazione della pagina delle proprietà HLSL.

Microsoft Visual Studio può compilare il codice shader da file *.hlsl e *.fx inclusi nel progetto C++.

Nell'ambito del processo di compilazione, Visual Studio usa il compilatore di codicefxc.exe o dxc.exe HLSL per compilare i file di origine dello shader HLSL in file di oggetti shader binari o in matrici di byte definite nei file di intestazione. In che modo il compilatore di codice HLSL compila ogni file di origine shader nel progetto dipende dal modo in cui si specifica la proprietà Ouput Files per tale file. Per altre informazioni sulle pagine delle proprietà HLSL, vedere Pagine delle proprietà HLSL.

Il metodo di compilazione usato in genere dipende dalle dimensioni del file di origine dello shader HLSL. Se si include una grande quantità di codice byte in un'intestazione, aumentare le dimensioni e il tempo di caricamento iniziale dell'app. È anche necessario forzare che tutto il codice di byte si trovi nella memoria anche dopo la creazione dello shader, che rifiuti le risorse. Tuttavia, quando si include codice byte in un'intestazione, è possibile ridurre la complessità del codice e semplificare la creazione dello shader.

Ora esaminiamo vari modi per compilare il codice e le convenzioni shader per le estensioni di file per il codice shader.

Uso delle estensioni del file di codice shader

Per conformarsi alla convenzione Microsoft, usare queste estensioni di file per il codice shader:

  • Un file con l'estensione .hlsl contiene codice sorgente HLSL (High Level Shading Language). L'estensione .fx precedente è supportata anche, ma in genere è associata al sistema di effetti legacy.
  • Un file con estensione cso contiene un oggetto shader compilato.
  • Un file con estensione h è un file di intestazione, ma in un contesto di codice shader questo file di intestazione definisce una matrice di byte che contiene dati shader. Altre estensioni comuni per le intestazioni di codice shader HLSL includono .hlsli e .fxh.

Compilazione in fase di compilazione per i file di oggetti

Se si compilano i file con estensione hlsl in file di oggetti shader binari, l'app deve leggere i dati da tali file di oggetti (con estensione cso è l'estensione predefinita per questi file di oggetti), assegnare i dati alle matrici di byte e creare oggetti shader da tali matrici di byte. Ad esempio, per creare un vertex shader (ID3D11VertexShader**), chiamare il metodo ID3D11Device::CreateVertexShader con una matrice di byte contenente il codice di byte vertex compilato. In questo codice di esempio la proprietà Ouput Files per il file SimpleVertexShader.hlsl specifica la compilazione nel file dell'oggetto SimpleVertexShader.cso.

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

L'helper ReadData qui esaminerà la directory di lavoro corrente e la stessa directory del file EXE del processo corrente come i file con estensione cso vengono in genere trovati insieme ad altri prodotti di compilazione VS. Per un'implementazione di esempio, vedere ReadData.h .

Compilazione in fase di compilazione per i file di intestazione

Se si compilano i file con estensione hlsl in matrici di byte definite nei file di intestazione, è necessario includere tali file di intestazione nel codice. In questo codice di esempio la proprietà Ouput Files per il file PixelShader.hlsl specifica la compilazione nella matrice di byte g_psshader definita nel file di intestazione PixelShader.h.

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

Compilazione con D3DCompileFromFile

È anche possibile usare la funzione D3DCompileFromFile in fase di esecuzione per compilare il codice shader per Direct3D 11. Per altre informazioni su come eseguire questa operazione, vedere Procedura: Compilare uno shader.

Nota

Le app di Windows Store supportano l'uso di D3DCompileFromFile per lo sviluppo, ma non per la distribuzione.

 

Guida alla programmazione per HLSL

Guida alla programmazione per HLSL