Memulai Tahap Input-Assembler

Ada beberapa langkah yang diperlukan untuk menginisialisasi tahap perakitan input (IA). Misalnya, Anda perlu membuat sumber daya buffer dengan data puncak yang dibutuhkan alur, memberi tahu tahap IA di mana buffer berada dan jenis data apa yang dikandungnya, dan menentukan jenis primitif yang akan dirakit dari data.

Langkah-langkah dasar yang terlibat dalam menyiapkan tahap IA, yang diperlihatkan dalam tabel berikut, dibahas dalam topik ini.

Langkah Deskripsi
Membuat Buffer Input Membuat dan menginisialisasi buffer input dengan data vertex input.
Membuat Objek Input-Tata Letak Tentukan bagaimana data buffer vertex akan dialirkan ke tahap IA dengan menggunakan objek input-layout.
Mengikat Objek ke Tahap Input-Assembler Ikat objek yang dibuat (buffer input dan objek input-layout) ke tahap IA.
Tentukan Jenis Primitif Identifikasi bagaimana simpul akan dirakit menjadi primitif.
Metode Gambar Panggilan Kirim data yang terikat ke tahap IA melalui alur.

 

Setelah Anda memahami langkah-langkah ini, lanjutkan ke Menggunakan Nilai yang Dihasilkan Sistem.

Membuat Buffer Input

Ada dua jenis buffer input: buffer vertex dan buffer indeks. Buffer vertex menyediakan data vertex ke tahap IA. Buffer indeks bersifat opsional; mereka memberikan indeks ke simpul dari buffer vertex. Anda dapat membuat satu atau beberapa buffer vertex dan, secara opsional, buffer indeks.

Setelah membuat sumber daya buffer, Anda perlu membuat objek tata letak input untuk menjelaskan tata letak data ke tahap IA, lalu Anda perlu mengikat sumber daya buffer ke tahap IA. Membuat dan mengikat buffer tidak diperlukan jika shader Anda tidak menggunakan buffer. Untuk contoh vertex sederhana dan shader piksel yang menggambar satu segitiga, lihat Menggunakan Tahap Input-Assembler tanpa Buffer.

Untuk bantuan dalam membuat buffer vertex, lihat Cara: Membuat buffer vertex. Untuk bantuan dalam membuat buffer indeks, lihat Cara: Membuat buffer indeks.

Membuat Objek Input-Tata Letak

Objek input-layout merangkum status input tahap IA. Ini termasuk deskripsi data input yang terikat ke tahap IA. Data dialirkan ke tahap IA dari memori, dari satu atau beberapa buffer vertex. Deskripsi mengidentifikasi data input yang terikat dari satu atau beberapa buffer vertex dan memberi runtime kemampuan untuk memeriksa jenis data input terhadap jenis parameter input shader. Pemeriksaan jenis ini tidak hanya memverifikasi bahwa jenisnya kompatibel, tetapi juga bahwa setiap elemen yang diperlukan shader tersedia di sumber daya buffer.

Objek input-layout dibuat dari array deskripsi elemen input dan penunjuk ke shader yang dikompilasi (lihat ID3D11Device::CreateInputLayout). Array berisi satu atau beberapa elemen input; setiap elemen input menjelaskan satu elemen vertex-data dari satu buffer vertex. Seluruh set deskripsi elemen input menjelaskan semua elemen vertex-data dari semua buffer vertex yang akan terikat ke tahap IA.

Deskripsi tata letak berikut menjelaskan buffer vertex tunggal yang berisi tiga elemen vertex-data:

D3D11_INPUT_ELEMENT_DESC layout[] =
{
    { L"POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, 
          D3D11_INPUT_PER_VERTEX_DATA, 0 },
    { L"TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 12, 
          D3D11_INPUT_PER_VERTEX_DATA, 0 },
    { L"NORMAL", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 20, 
          D3D11_INPUT_PER_VERTEX_DATA, 0 },
};

Deskripsi elemen input menjelaskan setiap elemen yang dimuat oleh satu puncak dalam buffer vertex, termasuk ukuran, jenis, lokasi, dan tujuan. Setiap baris mengidentifikasi jenis data dengan menggunakan semantik, indeks semantik, dan format data. Semantik adalah string teks yang mengidentifikasi bagaimana data akan digunakan. Dalam contoh ini, baris pertama mengidentifikasi data posisi 3 komponen (xyz, misalnya); baris kedua mengidentifikasi data tekstur 2 komponen (UV, misalnya); dan baris ketiga mengidentifikasi data normal.

Dalam contoh deskripsi elemen input ini, indeks semantik (yang merupakan parameter kedua) diatur ke nol untuk ketiga baris. Indeks semantik membantu membedakan antara dua baris yang menggunakan semantik yang sama. Karena tidak ada semantik serupa dalam contoh ini, indeks semantik dapat diatur ke nilai defaultnya, nol.

Parameter ketiga adalah formatnya. Format (lihat DXGI_FORMAT) menentukan jumlah komponen per elemen, dan jenis data, yang menentukan ukuran data untuk setiap elemen. Format dapat sepenuhnya di ketik pada saat pembuatan sumber daya, atau Anda dapat membuat sumber daya dengan menggunakan DXGI_FORMAT, yang mengidentifikasi jumlah komponen dalam elemen, tetapi membiarkan jenis data tidak terdefinisi.

Slot Input

Data memasuki tahap IA melalui input yang disebut slot input, seperti yang ditunjukkan dalam ilustrasi berikut. Tahap IA memiliki slot input n , yang dirancang untuk mengakomodasi hingga buffer vertex n yang menyediakan data input. Setiap buffer vertex harus ditetapkan ke slot yang berbeda; informasi ini disimpan dalam deklarasi tata letak input saat objek tata letak input dibuat. Anda juga dapat menentukan offset dari awal setiap buffer ke elemen pertama dalam buffer yang akan dibaca.

illustration of the input slots for the ia stage

Dua parameter berikutnya adalah slot input dan offset input. Saat Anda menggunakan beberapa buffer, Anda dapat mengikatnya ke satu atau beberapa slot input. Offset input adalah jumlah byte antara awal buffer dan awal data.

Gunakan Kembali Objek Input-Tata Letak

Setiap objek tata letak input dibuat berdasarkan tanda tangan shader; ini memungkinkan API untuk memvalidasi elemen input-layout-object terhadap tanda tangan shader-input untuk memastikan bahwa ada kecocokan jenis dan semantik yang tepat. Anda dapat membuat objek tata letak input tunggal untuk banyak shader, selama semua tanda tangan input shader sama persis.

Mengikat Objek ke Tahap Input-Assembler

Setelah Anda membuat sumber daya buffer vertex dan objek tata letak input, Anda dapat mengikatnya ke tahap IA dengan memanggil ID3D11DeviceContext::IASetVertexBuffers dan ID3D11DeviceContext::IASetInputLayout. Contoh berikut menunjukkan pengikatan buffer vertex tunggal dan objek input-layout ke tahap IA:

UINT stride = sizeof( SimpleVertex );
UINT offset = 0;
g_pd3dDevice->IASetVertexBuffers( 
    0,                // the first input slot for binding
    1,                // the number of buffers in the array
    &g_pVertexBuffer, // the array of vertex buffers
    &stride,          // array of stride values, one for each buffer
    &offset );        // array of offset values, one for each buffer

// Set the input layout
g_pd3dDevice->IASetInputLayout( g_pVertexLayout );

Mengikat objek input-layout hanya memerlukan penunjuk ke objek.

Dalam contoh sebelumnya, buffer vertex tunggal terikat; namun, beberapa buffer vertex dapat diikat oleh satu panggilan ke ID3D11DeviceContext::IASetVertexBuffers, dan kode berikut menunjukkan panggilan seperti itu untuk mengikat tiga buffer vertex:

UINT strides[3];
strides[0] = sizeof(SimpleVertex1);
strides[1] = sizeof(SimpleVertex2);
strides[2] = sizeof(SimpleVertex3);
UINT offsets[3] = { 0, 0, 0 };
g_pd3dDevice->IASetVertexBuffers( 
    0,                 //first input slot for binding
    3,                 //number of buffers in the array
    &g_pVertexBuffers, //array of three vertex buffers
    &strides,          //array of stride values, one for each buffer
    &offsets );        //array of offset values, one for each buffer

Buffer indeks terikat ke tahap IA dengan memanggil ID3D11DeviceContext::IASetIndexBuffer.

Tentukan Jenis Primitif

Setelah buffer input terikat, tahap IA harus diberi tahu cara merakit simpul menjadi primitif. Ini dilakukan dengan menentukan jenis primitif dengan memanggil ID3D11DeviceContext::IASetPrimitiveTopology; kode berikut memanggil fungsi ini untuk menentukan data sebagai daftar segitiga tanpa kedekatan:

g_pd3dDevice->IASetPrimitiveTopology( D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST );

Jenis primitif lainnya tercantum dalam D3D_PRIMITIVE_TOPOLOGY.

Metode Gambar Panggilan

Setelah sumber daya input terikat ke alur, aplikasi memanggil metode gambar untuk merender primitif. Ada beberapa metode gambar, yang diperlihatkan dalam tabel berikut; beberapa menggunakan buffer indeks, beberapa menggunakan data instans, dan beberapa menggunakan kembali data dari tahap streaming-output sebagai input ke tahap perakitan input.

Metode Gambar Deskripsi
ID3D11DeviceContext::D raw Gambar primitif non-terindeks dan non-instans.
ID3D11DeviceContext::D rawInstanced Gambar primitif instans yang tidak diindeks.
ID3D11DeviceContext::D rawIndexed Gambar primitif terindeks dan tidak instans.
ID3D11DeviceContext::D rawIndexedInstanced Gambar primitif terindeks dan instans.
ID3D11DeviceContext::D rawAuto Gambar primitif non-terindeks dan non-instans dari data input yang berasal dari tahap streaming-output.

 

Setiap metode gambar merender satu jenis topologi. Selama penyajian, primitif yang tidak lengkap (yang tanpa simpul yang cukup, indeks yang kurang, primitif parsial, dan sebagainya) dibuang secara diam-diam.

Tahap Input-Assembler