git clone https://github.com/ssloy/tinyrenderer.git &&
cd tinyrenderer &&
mkdir build &&
cd build &&
cmake .. &&
cmake --build . -j &&
./tinyrenderer ../obj/diablo3_pose/diablo3_pose.obj ../obj/floor.obj
Gambar yang dirender disimpan ke framebuffer.tga
.
Anda dapat membuka proyek di Gitpod, lingkungan pengembang online gratis untuk GitHub:
Saat terbuka, editor akan mengkompilasi & menjalankan program serta membuka gambar yang dihasilkan di pratinjau editor. Ubah saja kode di editor dan jalankan kembali skrip (gunakan riwayat terminal) untuk melihat gambar yang diperbarui.
Kode sumber saya tidak relevan. Baca wiki dan terapkan penyaji Anda sendiri. Hanya ketika Anda memahami semua detail kecilnya, Anda akan mengetahui apa yang sedang terjadi.
Dalam rangkaian artikel ini, saya ingin menunjukkan cara kerja OpenGL dengan menulis tiruannya (yang lebih disederhanakan). Cukup mengejutkan, saya sering bertemu orang-orang yang tidak bisa mengatasi rintangan awal dalam mempelajari OpenGL/DirectX. Oleh karena itu, saya telah menyiapkan serangkaian kuliah singkat, setelah itu siswa saya menunjukkan penyaji yang cukup baik.
Jadi, tugasnya dirumuskan sebagai berikut: tanpa menggunakan perpustakaan pihak ketiga (terutama yang grafis), dapatkan gambar seperti ini:
Peringatan: ini adalah materi pelatihan yang secara longgar akan mengulangi struktur perpustakaan OpenGL. Ini akan menjadi penyaji perangkat lunak. Saya tidak ingin menunjukkan cara menulis aplikasi untuk OpenGL. Saya ingin menunjukkan cara kerja OpenGL. Saya sangat yakin bahwa tidak mungkin menulis aplikasi yang efisien menggunakan perpustakaan 3D tanpa memahami hal ini.
Saya akan mencoba membuat kode akhir sekitar 500 baris. Siswa saya memerlukan 10 hingga 20 jam pemrograman untuk mulai membuat penyaji tersebut. Sebagai masukan, kami mendapatkan file uji dengan kawat poligonal + gambar dengan tekstur. Pada output, kita akan mendapatkan antarmuka grafis tanpa model yang dirender, dan program hanya menghasilkan gambar.
Karena tujuannya adalah untuk meminimalkan ketergantungan eksternal, saya memberikan siswa saya hanya satu kelas yang memungkinkan bekerja dengan file TGA. Ini adalah salah satu format paling sederhana yang mendukung gambar dalam format RGB/RGBA/hitam putih. Jadi, sebagai titik awal, kita akan mendapatkan cara sederhana untuk bekerja dengan gambar. Perlu Anda perhatikan bahwa satu-satunya fungsi yang tersedia di awal (selain memuat dan menyimpan gambar) adalah kemampuan untuk mengatur warna satu piksel.
Tidak ada fungsi untuk menggambar ruas garis dan segitiga. Kita harus melakukan semua ini dengan tangan. Saya memberikan kode sumber yang saya tulis secara paralel dengan siswa. Tapi saya tidak akan merekomendasikan menggunakannya, karena ini tidak masuk akal. Seluruh kode tersedia di GitHub, dan di sini Anda akan menemukan kode sumber yang saya berikan kepada siswa saya.
# include " tgaimage.h "
const TGAColor white = TGAColor( 255 , 255 , 255 , 255 );
const TGAColor red = TGAColor( 255 , 0 , 0 , 255 );
int main ( int argc, char ** argv) {
TGAImage image ( 100 , 100 , TGAImage::RGB);
image. set ( 52 , 41 , red);
image. write_tga_file ( " output.tga " );`
return 0 ;
}
output.tga akan terlihat seperti ini: