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

Lihat juga