Fungsi D3DCompile2 (d3dcompiler.h)
Mengkompilasi kode Microsoft High Level Shader Language (HLSL) ke dalam bytecode untuk target tertentu.
Sintaks
HRESULT D3DCompile2(
[in] LPCVOID pSrcData,
[in] SIZE_T SrcDataSize,
[in, optional] LPCSTR pSourceName,
[in, optional] const D3D_SHADER_MACRO *pDefines,
[in, optional] ID3DInclude *pInclude,
[in] LPCSTR pEntrypoint,
[in] LPCSTR pTarget,
[in] UINT Flags1,
[in] UINT Flags2,
[in] UINT SecondaryDataFlags,
[in, optional] LPCVOID pSecondaryData,
[in] SIZE_T SecondaryDataSize,
[out] ID3DBlob **ppCode,
[out, optional] ID3DBlob **ppErrorMsgs
);
Parameter
[in] pSrcData
Jenis: LPCVOID
Penunjuk ke data shader yang tidak dikompilasi (kode ASCII HLSL).
[in] SrcDataSize
Jenis: SIZE_T
Ukuran, dalam byte, dari blok memori yang dituju pSrcData .
[in, optional] pSourceName
Jenis: LPCSTR
Penunjuk opsional ke string konstanta yang dihentikan null yang berisi nama yang mengidentifikasi data sumber untuk digunakan dalam pesan kesalahan. Jika tidak digunakan, atur ke NULL.
[in, optional] pDefines
Jenis: const D3D_SHADER_MACRO*
Array opsional struktur D3D_SHADER_MACRO yang menentukan makro shader. Setiap definisi makro berisi nama dan definisi yang dihentikan null. Jika tidak digunakan, atur ke NULL. Struktur terakhir dalam array berfungsi sebagai terminator dan harus mengatur semua anggota ke NULL.
[in, optional] pInclude
Jenis: ID3DInclude*
Penunjuk ke antarmuka ID3DInclude yang digunakan pengkompilasi untuk menangani sertakan file. Jika Anda mengatur parameter ini ke NULL dan shader berisi #include, kesalahan kompilasi terjadi. Anda dapat meneruskan makro D3D_COMPILE_STANDARD_FILE_INCLUDE , yang merupakan penunjuk ke penangan sertakan default. Default ini termasuk handler mencakup file yang relatif terhadap direktori dan file saat ini yang relatif terhadap direktori file sumber awal. Saat menggunakan D3D_COMPILE_STANDARD_FILE_INCLUDE, Anda harus menentukan nama file sumber dalam parameter pSourceName ; pengkompilasi akan memperoleh direktori relatif awal dari pSourceName.
#define D3D_COMPILE_STANDARD_FILE_INCLUDE ((ID3DInclude*)(UINT_PTR)1)
[in] pEntrypoint
Jenis: LPCSTR
Penunjuk ke string konstanta yang dihentikan null yang berisi nama fungsi titik entri shader tempat eksekusi shader dimulai. Saat Anda mengkompilasi efek, D3DCompile2 mengabaikan pEntrypoint; kami menyarankan agar Anda mengatur pEntrypoint ke NULL karena ini adalah praktik pemrograman yang baik untuk mengatur parameter penunjuk ke NULL jika fungsi yang dipanggil tidak akan menggunakannya.
[in] pTarget
Jenis: LPCSTR
Penunjuk ke string konstanta yang dihentikan null yang menentukan target shader atau serangkaian fitur shader untuk dikompilasi. Target shader dapat menjadi model shader (misalnya, model shader 2, model shader 3, model shader 4, atau model shader 5). Target juga dapat menjadi jenis efek (misalnya, fx_4_1). Untuk informasi tentang target yang didukung berbagai profil, lihat Menentukan Target Pengkompilasi.
[in] Flags1
Jenis: UINT
Kombinasi konstanta kompilasi D3D shader yang digabungkan dengan menggunakan operasi OR bitwise. Nilai yang dihasilkan menentukan bagaimana pengkompilasi mengkompilasi kode HLSL.
[in] Flags2
Jenis: UINT
Kombinasi efek konstanta efek kompilasi D3D yang digabungkan dengan menggunakan operasi OR bitwise. Nilai yang dihasilkan menentukan bagaimana pengkompilasi mengkompilasi efek. Saat Anda mengkompilasi shader dan bukan file efek, D3DCompile2 mengabaikan Flags2; kami menyarankan agar Anda mengatur Flags2 ke nol karena ini adalah praktik pemrograman yang baik untuk mengatur parameter nonpointer ke nol jika fungsi yang dipanggil tidak akan menggunakannya.
[in] SecondaryDataFlags
Jenis: UINT
Kombinasi bendera berikut yang digabungkan dengan menggunakan operasi OR bitwise. Nilai yang dihasilkan menentukan bagaimana pengkompilasi mengkompilasi kode HLSL.
Bendera | Deskripsi |
---|---|
D3DCOMPILE_SECDATA_MERGE_UAV_SLOTS (0x01) | Gabungkan slot tampilan akses yang tidak diurutkan (UAV) di data sekunder yang dituju parameter pSecondaryData . |
D3DCOMPILE_SECDATA_PRESERVE_TEMPLATE_SLOTS (0x02) | Pertahankan slot templat di data sekunder yang dituju oleh parameter pSecondaryData . |
D3DCOMPILE_SECDATA_REQUIRE_TEMPLATE_MATCH (0x04) | Mengharuskan templat dalam data sekunder yang ditunjukkan parameter pSecondaryData agar cocok saat pengkompilasi mengkompilasi kode HLSL. |
Jika pSecondaryDataADALAH NULL, atur ke nol.
[in, optional] pSecondaryData
Jenis: LPCVOID
Penunjuk ke data sekunder. Jika Anda tidak meneruskan data sekunder, atur ke NULL. Gunakan data sekunder ini untuk menyelaraskan slot UAV dalam dua shader. Misalkan shader A memiliki UAV dan mereka terikat ke beberapa slot. Untuk mengkompilasi shader B sedemikian rupa sehingga UAV dengan nama yang sama dipetakan dalam B ke slot yang sama seperti di A, teruskan kode byte A ke D3DCompile2 sebagai data sekunder.
[in] SecondaryDataSize
Jenis: SIZE_T
Ukuran, dalam byte, dari blok memori yang dituju pSecondaryData . Jika pSecondaryDataADALAH NULL, atur ke nol.
[out] ppCode
Jenis: ID3DBlob**
Penunjuk ke variabel yang menerima penunjuk ke antarmuka ID3DBlob yang dapat Anda gunakan untuk mengakses kode yang dikompilasi.
[out, optional] ppErrorMsgs
Jenis: ID3DBlob**
Penunjuk ke variabel yang menerima penunjuk ke antarmuka ID3DBlob yang dapat Anda gunakan untuk mengakses pesan kesalahan pengkompilasi, atau NULL jika tidak ada kesalahan.
Mengembalikan nilai
Jenis: HRESULT
Mengembalikan salah satu kode pengembalian Direct3D 11.
Keterangan
Perbedaan antara D3DCompile2 dan D3DCompile adalah bahwa D3DCompile2 mengambil beberapa parameter opsional (SecondaryDataFlags, pSecondaryData dan SecondaryDataSize) yang dapat digunakan untuk mengontrol beberapa aspek tentang bagaimana bytecode dihasilkan. Lihat deskripsi parameter ini untuk detail selengkapnya. Tidak ada perbedaan sebaliknya dengan efisiensi bytecode yang dihasilkan antara D3DCompile2 dan D3DCompile.
Mengkompilasi shader untuk UWP
Untuk mengkompilasi shader offline, pendekatan yang disarankan adalah menggunakan alat Pengkompilasi Efek. Jika Anda tidak dapat mengkompilasi semua shader Sebelumnya, pertimbangkan untuk mengkompilasi yang lebih mahal dan yang diperlukan startup dan jalur yang paling sensitif terhadap performa, dan mengkompilasi sisanya saat runtime. Anda dapat menggunakan proses yang mirip dengan yang berikut ini untuk mengkompilasi shader yang dimuat atau dihasilkan dalam aplikasi UWP tanpa memblokir utas antarmuka pengguna Anda.
Menggunakan Visual Studio 2015+ untuk mengembangkan aplikasi UWP, tambahkan item baru "shader.hlsl".
- Dalam tampilan Folder Solusi Visual Studio, pilih item shaders.hlsl , klik kanan untuk Properti.
- Pastikan item Konten diatur ke Ya.
- Pastikan Tipe Item diatur ke Teks.
- Tambahkan tombol ke XAML, beri nama dengan tepat ("TheButton" dalam contoh ini), dan tambahkan penangan Klik .
Sekarang tambahkan ini termasuk ke file .cpp Anda:
#include <ppltasks.h> #include <d3dcompiler.h> #include <Robuffer.h>
Gunakan kode berikut untuk memanggil D3DCompile2. Perhatikan bahwa tidak ada pemeriksaan kesalahan atau penanganan di sini, dan juga bahwa kode ini menunjukkan bahwa Anda dapat melakukan I/O dan kompilasi di latar belakang, yang membuat UI Anda lebih responsif.
void App1::DirectXPage::TheButton_Click(Platform::Object^ sender, Windows::UI::Xaml::RoutedEventArgs^ e)
{
std::shared_ptr<Microsoft::WRL::ComPtr<ID3DBlob>> blobRef = std::make_shared<Microsoft::WRL::ComPtr<ID3DBlob>>();
// Load a file and compile it.
auto fileOp = Windows::ApplicationModel::Package::Current->InstalledLocation->GetFileAsync(L"shader.hlsl");
create_task(fileOp).then([this](Windows::Storage::StorageFile^ file) -> IAsyncOperation<Windows::Storage::Streams::IBuffer^>^
{
// Do file I/O in background thread (use_arbitrary).
return Windows::Storage::FileIO::ReadBufferAsync(file);
}, task_continuation_context::use_arbitrary())
.then([this, blobRef](Windows::Storage::Streams::IBuffer^ buffer)
{
// Do compilation in background thread (use_arbitrary).
// Cast to Object^, then to its underlying IInspectable interface.
Microsoft::WRL::ComPtr<IInspectable> insp(reinterpret_cast<IInspectable*>(buffer));
// Query the IBufferByteAccess interface.
Microsoft::WRL::ComPtr<Windows::Storage::Streams::IBufferByteAccess> bufferByteAccess;
insp.As(&bufferByteAccess);
// Retrieve the buffer data.
byte *pBytes = nullptr;
bufferByteAccess->Buffer(&pBytes);
Microsoft::WRL::ComPtr<ID3DBlob> blob;
Microsoft::WRL::ComPtr<ID3DBlob> errMsgs;
D3DCompile2(pBytes, buffer->Length, "shader.hlsl", nullptr, nullptr, "main", "ps_5_0", 0, 0, 0, nullptr, 0, blob.GetAddressOf(), errMsgs.GetAddressOf());
*blobRef = blob;
}, task_continuation_context::use_arbitrary())
.then([this, blobRef]()
{
// Update UI / use shader on foreground thread.
wchar_t message[40];
swprintf_s(message, L"blob is %u bytes long", (unsigned)(*blobRef)->GetBufferSize());
this->TheButton->Content = ref new Platform::String(message);
}, task_continuation_context::use_current());
}
Persyaratan
Persyaratan | Nilai |
---|---|
Target Platform | Windows |
Header | d3dcompiler.h |
Pustaka | D3DCompiler.lib |
DLL | D3DCompiler_47.dll |