Mengkompilasi shader

Catatan

Topik ini mencakup pengkompilasi yang FXC.EXE digunakan untuk Model Shader 2 hingga 5.1. Untuk Shader Model 6, Anda menggunakan DXC.EXE sebagai gantinya, yang di dokumentasikan dalam Menggunakan dxc.exe dan dxcompiler.dll. Visual Studio akan menggunakan DXC.EXE secara otomatis saat Shader Model 6 dipilih untuk konfigurasi Halaman Properti HLSL.

Microsoft Visual Studio dapat mengkompilasi kode shader dari file *.hlsl dan *.fx yang Anda sertakan dalam proyek C++Anda.

Sebagai bagian dari proses build, Visual Studio menggunakan pengkompilasi kode HLSLfxc.exe atau dxc.exe untuk mengkompilasi file sumber shader HLSL ke dalam file objek shader biner atau ke dalam array byte yang ditentukan dalam file header. Bagaimana pengkompilasi kode HLSL mengkompilasi setiap file sumber shader dalam proyek Anda bergantung pada cara Anda menentukan properti File Ouput untuk file tersebut. Untuk informasi selengkapnya tentang halaman properti HLSL, lihat Halaman Properti HLSL.

Metode kompilasi yang Anda gunakan biasanya tergantung pada ukuran file sumber shader HLSL Anda. Jika Anda menyertakan sejumlah besar kode byte di header, Anda meningkatkan ukuran dan waktu muat awal aplikasi Anda. Anda juga memaksa semua kode byte untuk berada dalam memori bahkan setelah shader dibuat, yang membuang-buang sumber daya. Tetapi ketika Anda menyertakan kode byte di header, Anda dapat mengurangi kompleksitas kode dan menyederhanakan pembuatan shader.

Sekarang mari kita lihat berbagai cara untuk mengkompilasi kode shader dan konvensi untuk ekstensi file untuk kode shader.

Menggunakan ekstensi file kode shader

Agar sesuai dengan konvensi Microsoft, gunakan ekstensi file ini untuk kode shader Anda:

  • File dengan ekstensi .hlsl menyimpan kode sumber High Level Shading Language (HLSL). Ekstensi .fx yang lebih lama juga didukung, tetapi biasanya dikaitkan dengan sistem Efek warisan.
  • File dengan ekstensi .cso menyimpan objek shader yang dikompilasi.
  • File dengan ekstensi .h adalah file header, tetapi dalam konteks kode shader, file header ini menentukan array byte yang menyimpan data shader. Ekstensi umum lainnya untuk header kode shader HLSL termasuk .hlsli dan .fxh.

Mengkompilasi pada waktu build ke file objek

Jika Anda mengkompilasi file .hlsl ke dalam file objek shader biner, aplikasi Anda perlu membaca data dari file objek tersebut (.cso adalah ekstensi default untuk file objek ini), menetapkan data ke array byte, dan membuat objek shader dari array byte tersebut. Misalnya, untuk membuat shader vertex (ID3D11VertexShader**), panggil metode ID3D11Device::CreateVertexShader dengan array byte yang berisi kode byte shader vertex yang dikompilasi. Dalam contoh kode ini, properti File Ouput untuk file SimpleVertexShader.hlsl menentukan untuk mengkompilasi ke dalam file objek SimpleVertexShader.cso.

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

Pembantu ReadData di sini akan melihat direktori kerja saat ini serta direktori yang sama dengan file EXE proses saat ini karena file .cso biasanya ditemukan bersama produk build VS lainnya. Lihat ReadData.h untuk contoh implementasi.

Mengkompilasi pada waktu build ke file header

Jika Anda mengkompilasi file .hlsl ke dalam array byte yang ditentukan dalam file header, Anda perlu menyertakan file header tersebut dalam kode Anda. Dalam contoh kode ini, properti File Ouput untuk file PixelShader.hlsl menentukan untuk mengkompilasi ke dalam array byte g_psshader yang ditentukan dalam file header PixelShader.h.

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

Mengompilasi dengan D3DCompileFromFile

Anda juga dapat menggunakan fungsi D3DCompileFromFile pada durasi untuk mengompilasi kode shader untuk Direct3D 11. Untuk informasi selengkapnya tentang cara melakukannya, lihat Cara: Mengkompilasi Shader.

Catatan

Dukungan aplikasi Windows Store menggunakan D3DCompileFromFile untuk pengembangan tetapi tidak untuk penyebaran.

 

Panduan Pemrograman untuk HLSL

Panduan Pemrograman untuk HLSL