Common-Shader Core

Di Shader Model 4, semua tahap shader menerapkan fungsionalitas dasar yang sama menggunakan core common-shader. Selain itu, masing-masing dari tiga tahap shader (vertex, geometri, dan piksel) menawarkan fungsionalitas yang unik untuk setiap tahap, seperti kemampuan untuk menghasilkan primitif baru dari tahap shader geometri atau untuk membuang piksel tertentu dalam tahap piksel shader. Diagram berikut menunjukkan bagaimana data mengalir melalui tahap shader, dan hubungan inti common-shader dengan sumber daya memori shader.

diagram of data flow in a shader stage

  • Data Input: Shader vertex menerima inputnya dari tahap perakitan input; geometri dan shader piksel menerima input mereka dari tahap shader sebelumnya. Input tambahan termasuk semantik nilai sistem, yang dapat dikonsumsi oleh unit pertama dalam alur yang berlaku.
  • Data Output: Shader menghasilkan hasil output untuk diteruskan ke tahap berikutnya dalam alur. Untuk shader geometri, jumlah output data dari satu pemanggilan dapat bervariasi. Beberapa output ditafsirkan oleh core common-shader (seperti posisi vertex dan indeks render-target-array), yang lain dirancang untuk ditafsirkan oleh aplikasi.
  • Shader Code: Shader dapat membaca dari memori, melakukan operasi aritmatika titik pecahan vektor dan bilangan bulat, atau operasi kontrol aliran. Tidak ada batasan jumlah pernyataan yang dapat diimplementasikan dalam shader.
  • Sampler: Sampler menentukan cara mengambil sampel dan memfilter tekstur. Sebanyak 16 sampel dapat terikat ke shader secara bersamaan.
  • Tekstur: Tekstur dapat difilter menggunakan sampler atau dibaca secara per texel langsung dengan fungsi intrinsik beban .
  • Buffer: Buffer tidak pernah difilter, tetapi dapat dibaca dari memori per elemen secara langsung dengan fungsi intrinsik beban . Sebanyak 128 tekstur dan sumber daya buffer (gabungan) dapat terikat ke shader secara bersamaan.
  • Buffer Konstan: Buffer konstan dioptimalkan untuk variabel konstanta shader. Sebanyak 16 buffer konstan dapat terikat ke tahap shader secara bersamaan. Mereka dirancang untuk pembaruan yang lebih sering dari CPU; oleh karena itu, mereka memiliki ukuran tambahan, tata letak, dan pembatasan akses.

Perbedaan antara Direct3D 9 dan Direct3D 10:

  • Di Direct3D 9, setiap unit shader memiliki satu file register konstanta kecil untuk menyimpan semua variabel shader konstan. Mengakomodasi semua shader dengan ruang konstanta terbatas ini membutuhkan sering daur ulang konstanta oleh CPU.
  • Dalam Direct3D 10, konstanta disimpan dalam buffer yang tidak dapat diubah dalam memori dan dikelola seperti sumber daya lainnya. Tidak ada batasan jumlah buffer konstan yang dapat dibuat aplikasi. Dengan mengatur konstanta menjadi buffer berdasarkan frekuensi pembaruan dan penggunaan, jumlah bandwidth yang diperlukan untuk memperbarui konstanta untuk mengakomodasi semua shader dapat dikurangi secara signifikan.

Dukungan Bilangan Bulat dan Bitwise

Inti shader umum menyediakan set lengkap integer 32-bit yang mematuhi IEEE dan operasi bitwise. Operasi ini memungkinkan kelas algoritma baru dalam contoh perangkat keras grafis termasuk teknik kompresi dan pengemasan, FFT, dan kontrol aliran program bitfield.

Jenis data int dan uint di peta Direct3D 10 HLSL ke bilangan bulat 32-bit dalam perangkat keras.

Perbedaan antara Direct3D 9 dan Direct3D 10:
Dalam input aliran Direct3D 9 yang ditandai sebagai bilangan bulat dalam HLSL ditafsirkan sebagai floating-point. Di Direct3D 10, input aliran yang ditandai sebagai bilangan bulat ditafsirkan sebagai bilangan bulat 32-bit.
Selain itu, nilai boolean sekarang adalah semua bit yang ditetapkan atau semua bit tidak diatur. Data yang dikonversi ke bool akan ditafsirkan sebagai true jika nilainya tidak sama dengan 0,0f (nol positif dan negatif diizinkan untuk false) dan false sebaliknya.

Operator bitwise

Inti shader umum mendukung operator bitwise berikut:

Operator Function
~ Tidak Logis
<< Shift Kiri
>> Shift Kanan
& Logika Dan
| Logika atau
^ Xor Logis
<<= Shift kiri Sama
>>= Shift Kanan Sama
&= Dan Sama Dengan
|= Atau Sama Dengan
^= Xor Sama dengan

Operator bitwise didefinisikan untuk beroperasi hanya pada jenis data int dan uint . Mencoba menggunakan operator bitwise pada jenis data float atau struct akan mengakibatkan kesalahan. Operator bitwise mengikuti prioritas yang sama dengan C sehubungan dengan operator lain.

Pemeran Biner

Transmisi antara bilangan bulat dan jenis floating-point akan mengonversi nilai numerik setelah aturan pemotongan C. Mentransmisikan nilai dari float, ke int, dan kembali ke float adalah konversi yang merugi tergantung pada presisi jenis data target. Berikut adalah beberapa fungsi konversi: asfloat (DirectX HLSL), asint (DirectX HLSL), asuint (DirectX HLSL).

Transmisi biner juga dapat dilakukan menggunakan fungsi intrinsik HLSL. Ini menyebabkan pengkompilasi menginterpretasikan kembali representasi bit dari angka ke dalam jenis data target.

Model Shader 4