Perbedaan Antara Efek 10 dan Efek 11

Topik ini menunjukkan perbedaan antara Efek 10 dan Efek 11.

Konteks Perangkat, Utas, dan Kloning

Antarmuka ID3D10Device telah dibagi menjadi dua antarmuka di Direct3D 11: ID3D11Device dan ID3D11DeviceContext. Anda dapat membuat beberapa ID3D11DeviceContexts untuk memfasilitasi eksekusi bersamaan pada beberapa utas. Efek 11 memperluas konsep ini ke kerangka kerja Efek.

Runtime Effects 11 berutas tunggal. Untuk alasan ini, Anda tidak boleh menggunakan satu instans ID3DX11Effect dengan beberapa utas secara bersamaan.

Untuk menggunakan runtime Effects 11 pada beberapa instans, Anda harus membuat instans ID3DX11Effect terpisah. Karena ID3D11DeviceContext juga berutas tunggal, Anda harus meneruskan instans ID3D11DeviceContext yang berbeda ke setiap instans efek pada Terapkan. Anda dapat menggunakan konteks perangkat terpisah ini untuk membuat daftar perintah sehingga utas penyajian dapat menerapkannya pada konteks perangkat langsung.

Cara termampu untuk membuat beberapa efek yang merangkum fungsionalitas yang sama, untuk digunakan pada beberapa utas, adalah dengan membuat satu efek dan kemudian membuat salinan kloning. Kloning memiliki keuntungan berikut daripada membuat beberapa salinan dari awal:

  1. Rutinitas kloning lebih cepat daripada rutinitas pembuatan.
  2. Efek kloning berbagi shader yang dibuat, blok status, dan instans kelas (sehingga tidak perlu dibuat ulang).
  3. Efek kloning dapat berbagi buffer konstanta.
  4. Efek kloning dimulai dengan status yang cocok dengan efek saat ini (nilai variabel, apakah telah dioptimalkan atau belum).

Lihat Mengkloning Efek untuk informasi selengkapnya.

Kumpulan Efek dan Grup

Sejauh ini penggunaan kumpulan efek yang paling umum di Direct3D 10 adalah untuk mengelompokkan bahan. Kumpulan Efek telah dihapus dari Efek 11 dan grup telah ditambahkan, yang merupakan metode pengelompokan bahan yang lebih efisien.

Grup efek hanyalah satu set teknik. Lihat Sintaks Grup Efek (Direct3D 11) untuk informasi selengkapnya.

Pertimbangkan hierarki efek berikut dengan empat efek anak dan satu kumpulan efek:

// Effect Pool
cbufer A { ... }
PixelShader pPSGrass;
PixelShader pPSWater;

// Effect Child 1
#include "EffectPool.fx"
technique10 GrassMaterialLowSpec { ... }

// Effect Child 2
#include "EffectPool.fx"
technique10 GrassMaterialHighSpec { ... }

// Effect Child 3
#include "EffectPool.fx"
technique10 WaterMaterialLowSpec { ... }

// Effect Child 4
#include "EffectPool.fx"
technique10 WaterMaterialHighSpec { ... }

Anda dapat mencapai fungsionalitas yang sama di Efek 11 dengan menggunakan grup:

cbufer A { ... }
PixelShader pPSGrass;
PixelShader pPSWater;

fxgroup GrassMaterial
{
    technique10 LowSpec { ... }
    technique10 HighSpec { ... }
}

fxgroup WaterMaterial
{
    technique10 LowSpec { ... }
    technique10 HighSpec { ... }
}

TahapAn Shader Baru

Ada tiga tahap shader baru di Direct3D 11: shader lambung, shader domain, dan shader komputasi. Efek 11 menangani ini dengan cara yang sama dengan shader vertex, shader geometri, dan shader piksel.

Tiga jenis variabel baru telah ditambahkan ke Efek 11:

  • HullShader
  • DomainShader
  • ComputeShader

Jika Anda menggunakan shader ini dalam teknik, Anda harus memberi label teknik itu "technique11", dan bukan "technique10". Shader komputasi tidak dapat diatur dalam pass yang sama dengan status grafis lainnya (shader lain, blok status, atau target render).

Jenis Tekstur Baru

Direct3D 11 mendukung jenis tekstur berikut:

Tampilan Akses Tidak Berurut

Efek 11 mendukung mendapatkan dan mengatur jenis tampilan akses baru yang tidak diurutkan. Ini bekerja dengan cara yang sama seperti tekstur.

Pertimbangkan contoh Efek HLSL ini:

  
RWTexture1D<float> myUAV;

Anda dapat mengatur variabel ini di C++ sebagai berikut:

  
ID3D11UnorderedAccessView* pUAVTexture1D = NULL;
ID3DX11EffectUnorderedAccessViewVariable* pUAVVar;
pUAVVar = pEffect->GetVariableByName("myUAV")->AsUnorderedAccessView();
pUAVVar->SetUnorderedAccessView( pUAVTexture1D );

Direct3D 11 mendukung jenis tampilan akses tidak berurut berikut ini:

  • RWBuffer
  • RWByteAddressBuffer
  • RWStructuredBuffer
  • RWTexture1D
  • RWTexture1DArray
  • RWTexture2D
  • RWTexture2DArray
  • RWTexture3D

Antarmuka dan Instans Kelas

Untuk antarmuka dan sintaks kelas, lihat Antarmuka dan Kelas.

Untuk menggunakan antarmuka dan kelas dalam efek, lihat Antarmuka dan Kelas dalam Efek.

Aliran Keluar yang Dapat Diatasi

Di Direct3D 10, shader geometri dapat menghasilkan satu aliran data ke unit output aliran dan unit rasterizer. Di Direct3D11, shader geometri dapat menghasilkan hingga empat aliran data ke unit output aliran, dan paling banyak salah satu aliran tersebut ke unit rasterizer. Intrinsik ConstructGSWithSO telah diperbarui untuk mencerminkan fungsionalitas baru ini.

Lihat Sintaks Stream Out untuk informasi selengkapnya.

Mengatur dan Membatalkan Pengaturan Status Perangkat

Dalam Efek 10, Anda dapat membuat buffer konstan dan buffer tekstur yang dikelola pengguna dengan menggunakan fungsi ID3D10EffectConstantBuffer::SetConstantBuffer dan SetTextureBuffer . Setelah Anda memanggil fungsi-fungsi ini, runtime Effects 10 tidak lagi mengelola buffer konstan atau buffer tekstur dan pengguna harus mengisi data dengan menggunakan antarmuka ID3D10Device.

Di Efek 11, Anda juga dapat membuat blok status (status campuran, status rasterizer, status stensil kedalaman, dan status sampler) yang dikelola pengguna dengan menggunakan panggilan berikut:

Setelah Anda memanggil fungsi-fungsi ini, runtime Effects 11 tidak lagi mengelola variabel blok status, dan ada nilai yang tidak akan berubah. Perhatikan bahwa karena blok status tidak dapat diubah, pengguna harus mengatur blok status baru untuk mengubah nilai.

Anda juga dapat mengembalikan buffer konstanta, buffer tekstur, dan blok status ke status yang dikelola non-pengguna. Jika Anda membatalkan pengaturan variabel ini, runtime Effects 11 akan terus memperbaruinya jika diperlukan. Anda dapat menggunakan panggilan berikut untuk membatalkan pengaturan variabel terkelola pengguna:

Efek Komputer Virtual

Efek komputer virtual, yang mengevaluasi ekspresi kompleks di luar fungsi, telah dihapus.

Contoh ekspresi kompleks berikut ini tidak didukung:

  1. SetPixelShader( myPSArray( i * 3 + j ) );
  2. SetPixelShader( myPSArray( (float)i );
  3. FILTER = i + 2;

Contoh ekspresi non-kompleks berikut didukung:

  1. SetPixelShader( myPS );
  2. SetPixelShader( myPS[i] );
  3. SetPixelShader( myPS[ uIndex ] ); uIndex adalah variabel uint
  4. FILTER = i;
  5. FILTER = ANISOTROPIC;

Ekspresi ini dapat muncul dalam ekspresi blok status (seperti FILTER) dan ekspresi pass (seperti SetPixelShader).

Ketersediaan dan Lokasi Sumber

Efek 10 didistribusikan dalam D3D10.dll. Efek 11 didistribusikan sebagai sumber, dengan solusi Visual Studio yang sesuai untuk mengkompilasinya. Saat Anda membuat aplikasi jenis efek, kami sarankan Anda menyertakan sumber Efek 11 langsung dalam aplikasi tersebut.

Anda bisa mendapatkan Efek 11 dari Efek untuk Direct3D 11 Update.

Efek (Direct3D 11)