Condividi tramite


Compilazione di shader

Nota

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

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

Come parte del processo di compilazione, Visual Studio usa il fxc.exe o dxc.exe compilatore di codice HLSL per compilare i file di origine dello shader HLSL in file oggetto shader binari o in matrici di byte definite nei file di intestazione. Il modo in cui 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 ulteriori informazioni sulle pagine delle proprietà HLSL, vedere HLSL Property Pages.

Il metodo di compilazione usato in genere dipende dalle dimensioni del file di origine dello shader HLSL. Se includi una grande quantità di codice di byte in un'intestazione, aumenta le dimensioni e il tempo di caricamento iniziale dell'app. Si forza inoltre tutto il bytecode a risiedere in memoria anche dopo la creazione dello shader, causando uno spreco di risorse. Tuttavia, quando si include codice di byte in un'intestazione, è possibile ridurre la complessità del codice e semplificare la creazione dello shader.

Esaminiamo ora diversi modi per compilare il codice shader e le convenzioni per le estensioni dei file shader.

Uso delle estensioni di file di codice shader

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

  • Un file con estensione hlsl contiene il codice sorgente High Level Shading Language (HLSL). È supportata anche l'estensione .fx precedente, 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 i dati dello shader. Altre estensioni comuni per le intestazioni di codice dello shader HLSL includono .hlsli e .fxh.

Compilazione in fase di costruzione in file oggetti

Se compili i tuoi file .hlsl in file oggetto shader binari, l'app deve leggere i dati da questi file oggetto (.cso è l'estensione predefinita per questi file), assegnare i dati a matrici di byte e creare oggetti shader a partire 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 del vertex shader compilato. In questo codice di esempio, la proprietà Output Files per il file SimpleVertexShader.hlsl specifica di compilare nel file 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, in questo contesto, cercherà sia nella directory di lavoro corrente che nella stessa directory del file eseguibile del processo corrente, poiché i file con estensione .cso si trovano tipicamente accanto ad altri prodotti di compilazione di Visual Studio. Vedere ReadData.h per un'implementazione di esempio.

Compilazione durante il processo di build nei file header

Se si compilano i file con estensione hlsl in matrici di byte definiti 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 di compilare 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 HLSL