Jurnal Pengembangan] Rendering D3D11 Berhasil Menggambar Segitiga!

121.91.***.***
8

- Karena urusan perusahaan, saya hampir tidak bisa bekerja.. Hari ini saya mengambil cuti untuk pekerjaan rumah dan membuat renderer yang sangat dasar.

- Saya menggunakan dua objek IPrimitiveBuffer dan ISurfaceMaterial untuk menyimpan informasi tentang material permukaan, nilai status rendering, dan data buffer informasi primitif (bentuk). Kemudian saya menulis kode untuk mengatur sudut pandang kamera dan meneruskan ke DrawCommand.

- Untuk merender satu bentuk, saya membuat DrawCommand dan memasukkannya ke antrian render pada frame saat ini.



- Meskipun belum ada pemisahan antara transparan dan tidak transparan, saya telah membuat fungsi untuk menyortir berdasarkan nilai Command.

- Objek yang tidak transparan harus digambar dari depan ke belakang.. sedangkan objek transparan (seperti efek) harus digambar dari belakang ke depan. Fungsi pengurutan tersebut telah dimasukkan sebagai dasar. (Pengaturan nilai kedalaman)

- Dalam beberapa kasus, biaya panggilan API untuk mengubah nilai status dapat cukup mahal. (Perubahan status blending, perubahan shader, perubahan tekstur, dll.)

- Pada perangkat keras terbaru, umumnya perubahan shader paling mahal, diikuti oleh perubahan tekstur, dan terakhir adalah perubahan nilai status rendering.

- Saya memasukkan nilai ke dalam nilai unsigned int 64-bit dengan memecah bit. Dalam hal ini, jika kita menggunakan (1 << 60) untuk langsung memasukkan nilai bit, maka operasi tersebut dapat dilakukan tanpa memperhatikan endian. Namun, kode yang direncanakan akan menggunakan penugasan langsung.

- LINK_NODE ada karena kami berencana untuk mengalokasikan COMMAND dari Object Pool sebelumnya. Karena penggunaan STL list atau deque akan seringkali menyebabkan alokasi Node internal, kami menggunakan linked_list khusus yang ditulis dalam C untuk mengelola Node.

- RenderQueue menggunakan TArray, pustaka templat buatan sendiri.

- ID nilai tekstur, shader, dan status rendering tidak dibuat sebelumnya, tetapi disimpan sesuai urutan penggambaran. Kami menggunakan StackPool allocator berbasis Marker untuk mencegah alokasi dinamis sepenuhnya.


- Dalam kode D3D11RenderCommandExecutor, DrawCommand yang dikumpulkan akhirnya dirender. Saat ini, hanya eksekusi perintah rendering dasar berbasis Forward yang diimplementasikan dengan panjang yang disengaja.

- Selanjutnya, pemisahan antara transparan dan tidak transparan, penyederhanaan kode, dan fungsi umum akan ditambahkan secara bertahap selama pengembangan fitur.

- Setelah pengembangan fitur rendering karakter, efek (partikel), dan UI selesai, kami berencana untuk menambahkan renderer Deffered. Ini memungkinkan kami untuk menambahkan pencahayaan yang tidak terbatas dan berbagai teknik rendering tingkat lanjut.


- Jujur saja, setelah menulis semua kode, segitiga sama sekali tidak dirender.

- Awalnya, ada kesalahan dalam perhitungan matriks viewport dan proyeksi. Masalah lainnya adalah pengaturan nilai status rendering.

- Akhirnya, saya salah mengatur SampleMask menjadi 0, sehingga tahap piksel shader tidak dijalankan sama sekali.

- Saya dapat menyelesaikan semua masalah ini menggunakan fitur debug GPU yang disertakan dengan Visual Studio.

- Inilah mengapa saya menganggap Visual Studio dari Microsoft sebagai alat pengembangan terbaik. Debug GPU yang detail memungkinkan saya untuk men-debug dengan mudah.

- Kebutuhan untuk mengatur RenderDoc atau Pix telah berkurang.

- Anda bahkan dapat menyetel breakpoint di shader dan melakukan debug baris demi baris.


Kesimpulan

- Singkatnya, saya mengalami kesulitan karena kesalahan bodoh dengan menetapkan SampleMask menjadi 0. Akhirnya saya berhasil merender segitiga.

- Sekarang setelah saya berhasil merender segitiga, saya akan meninjau seluruh kode dan melakukan refactoring serta pembersihan kode.

- Saya juga perlu melakukan optimasi di beberapa bagian. Tujuan saya adalah untuk menghilangkan alokasi dinamis selama loop game.


Terima kasih

로그인한 회원만 댓글 등록이 가능합니다.

개발한당

KR | ID | EN
  • IDR
  • KOR
8.34 -0.01

2026.07.10 KEB 하나은행 고시회차 1251회

다가오는 한인 행사일정

  • 등록 된 일정이 없어요!