Bagikan melalui


Memulai Tahap Rasterizer

Bagian ini menjelaskan pengaturan viewport, persegi panjang gunting, status rasterizer, dan multi-pengambilan sampel.

Mengatur Viewport

Viewport memetakan posisi puncak (dalam ruang klip) ke posisi target render. Langkah ini menskalakan posisi 3D menjadi ruang 2D. Target render berorientasi pada sumbu Y yang menunjuk ke bawah; ini mengharuskan koordinat Y dibalik selama skala viewport. Selain itu, tingkat x dan y (rentang nilai x dan y) diskalakan agar sesuai dengan ukuran viewport sesuai dengan rumus berikut:

X = (X + 1) * Viewport.Width * 0.5 + Viewport.TopLeftX
Y = (1 - Y) * Viewport.Height * 0.5 + Viewport.TopLeftY
Z = Viewport.MinDepth + Z * (Viewport.MaxDepth - Viewport.MinDepth) 

Tutorial 1 membuat viewport 640 × 480 menggunakan D3D11_VIEWPORT dan dengan memanggil ID3D11DeviceContext::RSSetViewports.

    D3D11_VIEWPORT vp[1];
    vp[0].Width = 640.0f;
    vp[0].Height = 480.0f;
    vp[0].MinDepth = 0;
    vp[0].MaxDepth = 1;
    vp[0].TopLeftX = 0;
    vp[0].TopLeftY = 0;
    g_pd3dContext->RSSetViewports( 1, vp );

Deskripsi viewport menentukan ukuran viewport, rentang untuk memetakan kedalaman ke (menggunakan MinDepth dan MaxDepth), dan penempatan kiri atas viewport. MinDepth harus kurang dari atau sama dengan MaxDepth; rentang untuk MinDepth dan MaxDepth adalah antara 0,0 dan 1,0, inklusif. Adalah umum bagi viewport untuk memetakan ke target render tetapi tidak perlu; selain itu, viewport tidak harus memiliki ukuran atau posisi yang sama dengan target render.

Anda dapat membuat array viewport, tetapi hanya satu yang dapat diterapkan ke output primitif dari shader geometri. Hanya satu viewport yang dapat diatur aktif pada satu waktu. Alur menggunakan viewport default (dan persegi panjang gunting, yang dibahas di bagian berikutnya) selama rasterisasi. Defaultnya selalu viewport pertama (atau persegi panjang gunting) dalam array. Untuk melakukan pemilihan per primitif viewport di shader geometri, tentukan semantik ViewportArrayIndex pada komponen output GS yang sesuai dalam deklarasi tanda tangan output GS.

Jumlah maksimum viewport (dan persegi panjang gunting) yang dapat terikat ke tahap rasterizer kapan saja adalah 16 (ditentukan oleh D3D11_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE).

Mengatur Scissor Rectangle

Persegi panjang gunting memberi Anda kesempatan lain untuk mengurangi jumlah piksel yang akan dikirim ke tahap penggabungan output. Piksel di luar persegi panjang gunting dibuang. Ukuran persegi panjang gunting ditentukan dalam bilangan bulat. Hanya satu persegi panjang gunting (berdasarkan ViewportArrayIndex dalam semantik nilai sistem) yang dapat diterapkan ke segitiga selama rasterisasi.

Untuk mengaktifkan persegi panjang gunting, gunakan anggota ScissorEnable (dalam D3D11_RASTERIZER_DESC1). Persegi panjang gunting default adalah persegi panjang kosong; artinya, semua nilai rect adalah 0. Dengan kata lain, jika Anda tidak menyiapkan persegi panjang gunting dan gunting diaktifkan, Anda tidak akan mengirim piksel apa pun ke tahap output-merger. Penyiapan yang paling umum adalah menginisialisasi persegi panjang gunting ke ukuran viewport.

Untuk mengatur array persegi panjang gunting ke perangkat, panggil ID3D11DeviceContext::RSSetScissorRects dengan D3D11_RECT.

  D3D11_RECT rects[1];
  rects[0].left = 0;
  rects[0].right = 640;
  rects[0].top = 0;
  rects[0].bottom = 480;

  g_pd3dContext->RSSetScissorRects( 1, rects );

Metode ini mengambil dua parameter: (1) jumlah persegi panjang dalam array dan (2) array persegi panjang.

Alur menggunakan indeks persegi panjang gunting default selama rasterisasi (defaultnya adalah persegi panjang ukuran nol dengan kliping dinonaktifkan). Untuk mengambil alih ini, tentukan semantik SV_ViewportArrayIndex ke komponen output GS dalam deklarasi tanda tangan output GS. Ini akan menyebabkan tahap GS menandai komponen output GS ini sebagai komponen yang dihasilkan sistem dengan semantik ini. Tahap rasterizer mengenali semantik ini dan akan menggunakan parameter yang dilampirkan sebagai indeks persegi panjang gunting untuk mengakses array persegi panjang gunting. Jangan lupa untuk memberi tahu tahap rasterizer untuk menggunakan persegi panjang gunting yang Anda tentukan dengan mengaktifkan nilai ScissorEnable dalam deskripsi rasterizer sebelum membuat objek rasterizer.

Mengatur Status Rasterizer

Dimulai dengan Direct3D 10, status rasterizer dienkapsulasi dalam objek status rasterizer. Anda dapat membuat hingga 4096 objek status rasterizer yang kemudian dapat diatur ke perangkat dengan meneruskan handel ke objek status.

Gunakan ID3D11Device1::CreateRasterizerState1 untuk membuat objek status rasterizer dari deskripsi rasterizer (lihat D3D11_RASTERIZER_DESC1).

    ID3D11RasterizerState1 * g_pRasterState;

    D3D11_RASTERIZER_DESC1 rasterizerState;
    rasterizerState.FillMode = D3D11_FILL_SOLID;
    rasterizerState.CullMode = D3D11_CULL_FRONT;
    rasterizerState.FrontCounterClockwise = true;
    rasterizerState.DepthBias = false;
    rasterizerState.DepthBiasClamp = 0;
    rasterizerState.SlopeScaledDepthBias = 0;
    rasterizerState.DepthClipEnable = true;
    rasterizerState.ScissorEnable = true;
    rasterizerState.MultisampleEnable = false;
    rasterizerState.AntialiasedLineEnable = false;
    rasterizerState.ForcedSampleCount = 0;
    g_pd3dDevice->CreateRasterizerState1( &rasterizerState, &g_pRasterState );

Contoh set status ini mencapai mungkin pengaturan rasterizer yang paling dasar:

  • Mode isian solid
  • Keluarkan atau lepaskan wajah belakang; asumsikan urutan berliku berlawanan arah jajaran jam untuk primitif
  • Matikan bias kedalaman tetapi aktifkan buffering kedalaman dan aktifkan persegi panjang gunting
  • Menonaktifkan multisampling dan anti-aliasing baris

Selain itu, operasi rasterizer dasar, selalu menyertakan yang berikut: kliping (ke frustum tampilan), pembagian perspektif, dan skala viewport. Setelah berhasil membuat objek status rasterizer, atur ke perangkat seperti ini:

    g_pd3dContext->RSSetState(g_pRasterState);

Multisampling

Sampel multisampling beberapa atau semua komponen gambar pada resolusi yang lebih tinggi (diikuti dengan downsampling ke resolusi asli) untuk mengurangi bentuk alias yang paling terlihat yang disebabkan oleh menggambar tepi poligon. Meskipun multisampling memerlukan sampel sub-piksel, GPU modern menerapkan multisampling sehingga shader piksel berjalan sekali per piksel. Ini memberikan tradeoff yang dapat diterima antara performa (terutama dalam aplikasi terikat GPU) dan anti-aliasing gambar akhir.

Untuk menggunakan multisampling, atur bidang aktifkan dalam deskripsi rasterisasi, buat target render multisampel, dan baca target render dengan shader untuk menyelesaikan sampel menjadi satu warna piksel atau panggil ID3D11DeviceContext::ResolveSubresource untuk menyelesaikan sampel menggunakan kartu video. Skenario yang paling umum adalah menggambar ke satu atau beberapa target render multisampled.

Multisampling tidak bergantung pada apakah masker sampel digunakan atau tidak, alfa-ke-cakupan diaktifkan, atau operasi stensil (yang selalu dilakukan per sampel).

Pengujian kedalaman dipengaruhi oleh multisampling:

  • Saat multisampling diaktifkan, kedalaman diinterpolasi per sampel dan pengujian kedalaman/stensil dilakukan per sampel; warna output shader piksel diduplikasi untuk semua sampel yang lewat. Jika shader piksel menghasilkan kedalaman, nilai kedalaman diduplikasi untuk semua sampel (meskipun skenario ini kehilangan manfaat multisampling).
  • Saat multisampling dinonaktifkan, pengujian kedalaman/stensil masih dilakukan per sampel, tetapi kedalamannya tidak diinterpolasi per sampel.

Tidak ada batasan untuk mencampur penyajian multisampel dan non-multisampel dalam satu target render. Jika Anda mengaktifkan multisampling dan menggambar ke target render non-multisampel, Anda menghasilkan hasil yang sama seolah-olah multisampling tidak diaktifkan; pengambilan sampel dilakukan dengan satu sampel per piksel.

Tahap Rasterizer