Common-Shader Core

Di Shader Model 4, semua tahap shader mengimplementasikan fungsionalitas dasar yang sama menggunakan inti 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 shader piksel. 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 inputnya 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 puncak dan indeks render-target-array), yang lain dirancang untuk ditafsirkan oleh aplikasi.
  • Kode Shader: Shader dapat membaca dari memori, melakukan operasi aritmatika titik float 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 per texel secara 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 batasan ukuran, tata letak, dan akses tambahan.

Perbedaan antara Direct3D 9 dan Direct3D 10:

  • Di Direct3D 9, setiap unit shader memiliki satu file register konstan kecil untuk menyimpan semua variabel shader konstan. Mengakomodasi semua shader dengan ruang konstanta terbatas ini membutuhkan daur ulang konstanta yang sering 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 satu set lengkap operasi bilangan bulat 32-bit dan bitwise yang mematuhi IEEE. Operasi ini memungkinkan kelas algoritma baru dalam contoh perangkat keras grafis termasuk teknik pemadatan dan pengemasan, FFT, dan kontrol aliran program bitfield.

Jenis data int dan uint di Direct3D 10 HLSL memetakan 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 di 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 semua bit diatur 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 Fungsi
~ 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 lossy 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 untuk meninterpretasikan kembali representasi bit dari angka ke dalam jenis data target.

Model Shader 4