- Pintu masuk ke grafis tidak memiliki satu jawaban mutlak; jalurnya bergantung pada pengetahuan yang sudah dimiliki, cara belajar, dan perangkat keras, dan tim AMD Game Engineering menilai pemula mungkin memerlukan titik awal yang lebih ramah
- Pemrograman grafis adalah struktur yang menggabungkan penulisan kode C++ di sisi CPU dan kode shader di sisi GPU, lalu menghubungkannya melalui API grafis seperti DirectX, Vulkan, dan OpenGL
- Per 2023, pilihan utama terbagi antara API legacy seperti OpenGL, DirectX 11, dan WebGL, serta API eksplisit modern seperti Vulkan, DirectX 12, Metal, dan WebGPU
- API legacy lebih mudah dipelajari, tetapi kompleksitas driver dan runtime telah membesar, sedangkan API modern menuntut lebih banyak kode dan pemahaman GPU sebagai imbalan atas kontrol yang lebih besar
- Pada awalnya, Anda bisa memulai dari lingkungan sederhana seperti OpenGL, WebGL, game engine, atau Shadertoy, dan jika pemahaman C++ serta pipeline GPU sudah cukup, Anda juga bisa langsung masuk ke Vulkan atau DirectX 12
Struktur Dasar Pemrograman Grafis
- Jawaban singkat untuk bahasa yang paling sering digunakan programmer grafis adalah C++
- Pekerjaan nyata dilakukan dengan menulis kode host yang berjalan di CPU dan kode shader yang berjalan di GPU secara bersamaan
- Kode host CPU biasanya ditulis dengan C++
- Kode GPU ditulis dengan bahasa shading tingkat tinggi seperti HLSL atau GLSL
- API grafis adalah titik penghubung yang memungkinkan kode CPU meminta GPU menjalankan pekerjaan menggunakan shader serta data dan metadata yang diperlukan
API Grafis Mana yang Sebaiknya Dipelajari Lebih Dulu
- Per 2023, API yang umum dipakai pada game PC dan aplikasi 3D secara garis besar terbagi menjadi dua kelompok
- API legacy: OpenGL, DirectX 11, WebGL
- API eksplisit modern: Vulkan, DirectX 12, Metal, WebGPU
- OpenGL, DirectX 11, dan WebGL didasarkan pada pendekatan historis dalam memprogram GPU, dan dari sudut pandang programmer lebih sederhana sehingga lebih mudah dipelajari
- Namun, kesederhanaan itu ada biayanya
- Seiring waktu, implementasi internal driver dan runtime menjadi makin kompleks
- Hal ini berujung pada bottleneck di sisi host dan beban driver rumit yang harus ditulis oleh vendor GPU
- Mantle dari AMD muncul di PC pada 2013~2016, dan melalui kolaborasi antara GPU AMD dan EA DICE, API ini menyediakan akses GPU tingkat lebih rendah serta abstraksi yang lebih tipis
- Metal hadir di platform Apple pada 2014, sementara DirectX 12 dan Vulkan hadir pada 2016, membawa pendekatan pemrograman GPU yang lebih rendah tingkatnya dan lebih eksplisit
Trade-off Pembelajaran antara API Mudah dan API Eksplisit
- Vulkan dan DirectX 12 menuntut programmer menjelaskan dengan lebih jelas pekerjaan yang diinginkan ke GPU, sehingga beban awalnya lebih besar
- Sebagai gantinya, Anda mendapatkan kontrol lebih besar dan peluang lebih luas untuk meningkatkan performa dan efisiensi kerja GPU
- Perbedaan antar-API bahkan terlihat dari contoh menggambar segitiga pertama
- Dengan OpenGL atau DirectX 11, segitiga pertama bisa digambar hanya dengan sekitar 10 baris kode
- Dengan Vulkan dan DirectX 12, jumlah kode yang dibutuhkan jauh lebih banyak
- OpenGL dan DirectX 11 menyembunyikan banyak detail sehingga membuat pekerjaan grafis produktif lebih cepat dijangkau, tetapi ini bisa membuat cara kerja GPU terlihat seperti kotak ajaib
- Vulkan dan DirectX 12 menuntut pengetahuan tingkat rendah dan pemahaman GPU sejak awal, tetapi sebagai gantinya setiap baris kode lebih jelas menunjukkan apa yang akan terjadi di GPU
Pilihan Jalur untuk Memulai
- Bahkan di dalam tim AMD Game Engineering sendiri, ada pendapat bahwa memulai dengan DX12 atau Vulkan bagi remaja atau pemula terasa terlalu berat, tetapi ada juga pandangan bahwa hal itu mungkin jika syaratnya cocok
- OpenGL memang telah menurun dari sisi kemutakhiran dan relevansi, tetapi masih dinilai cukup untuk mempelajari dasar-dasarnya
- WebGL bisa menjadi titik awal yang mudah untuk memahami pipeline grafis
- Di web, grafis real-time dapat ditangani dengan JavaScript tanpa C++
- Dengan WebAssembly, grafis juga bisa dijalankan di browser menggunakan C++
- WebGPU menawarkan konsep yang lebih dekat ke API grafis modern sambil mungkin tidak menuntut terlalu banyak detail tingkat rendah
- Saat mulai menulis kode yang kompleks, Anda masih bisa menemui berbagai masalah
- Namun, API ini menjanjikan untuk prototyping serta pembelajaran dan pendidikan
- Memulai lewat game engine juga merupakan pilihan yang memungkinkan
- Unreal Engine memiliki porsi besar di dunia game PC
- Unity juga merupakan alternatif yang umum
- Ada juga engine open source yang lebih kecil dan sederhana seperti Godot
- Ada sekolah yang mengajarkan kelas rendering pertama dengan Unity, tetapi ada risiko siswa tidak memahami mengapa mereka perlu mempelajari pengetahuan tingkat rendah
- Jika ingin memulai dengan API eksplisit, Anda perlu sudah memahami alur besar pipeline grafis modern dan bagaimana perangkat keras GPU mewujudkannya, atau setidaknya punya kemauan untuk mempelajari pemahaman itu sambil berjalan
Materi Belajar yang Direkomendasikan dan Langkah Berikutnya
- LearnOpenGL: situs pemula yang bagus untuk mempelajari pemrograman grafis dengan API nyata di C++
- Scratchapixel: membantu fokus pada cara kerja konsep seperti ray tracing tanpa banyak kode
- Udemy: dapat digunakan untuk mencari kursus bagi pemula
- Rastertek: tutorial OpenGL dan DirectX 11
- Ray Tracing in One Weekend: cocok untuk pendekatan belajar dengan membangun sendiri jika Anda sudah cukup bisa ngoding
- A trip through the graphics pipeline: meski ditulis pada 2011 sebelum era API eksplisit, konsep perangkat keras dan perangkat lunak dari sudut pandang GPU masih tetap relevan
- learn wgpu: situs belajar WebGPU dengan gaya mirip LearnOpenGL dan masih bersifat work in progress
- Your first WebGPU app: dapat dilihat sebagai materi pengantar WebGPU
- Shadertoy: menjadi titik awal yang lebih sederhana karena Anda bisa menulis shader tanpa berurusan langsung dengan API grafis
- Vulkan Tutorial: juga dibahas dalam konteks bahwa saat mempelajari Vulkan atau DirectX 12, penting untuk tidak takut melakukan copy-paste
- Jika Anda masih belum memutuskan bahasa atau ekosistem API, cobalah beberapa pendekatan dan lanjutkan dengan cara yang paling cocok untuk Anda
1 komentar
Opini Hacker News
Pemula sebaiknya mundur selangkah dan bertanya dulu “apa yang ingin saya buat”, alih-alih memulai dari “alat apa yang harus saya gunakan”
Saat baru belajar pun, jangan sampai kehilangan fokus pada hasil akhir. Dalam grafika komputer modern, ada terlalu banyak alat yang mengabstraksikan berbagai tahap menggambar piksel ke layar, sehingga orang bisa saja bersusah payah dengan kode level rendah sejak awal, lalu baru belakangan menyadari bahwa di bidang yang ingin ia masuki ternyata hanya memakai Unity, TouchDesigner, threejs, After Effects, dan hampir tidak memakai C++
Tentu saja mempelajari bagaimana semuanya bekerja dari dasar punya nilai yang sangat besar, tetapi menurut saya menjadikannya langkah pertama adalah pendekatan yang lambat. Proses belajar akan lebih cepat ketika masuk ke industri, lalu memakai alat abstraksi seperti game engine atau pemrograman visual untuk memahami konsep cara kerja internalnya
Ini saya katakan sebagai orang yang menghabiskan bertahun-tahun mempelajari C++ dan OpenGL dengan susah payah, dan lama bergulat dengan sunk cost yang membuat saya sulit menerima pendekatan no-code. Pada akhirnya, kalau jalan ini tidak membantu membuat hal yang ingin dibuat, sebaiknya jangan buang waktu di sana
Saya memang tidak menulis buku teks seperti Mark Kilgard, tetapi saya mendalami banyak lapisan API, mulai dari level driver, pengujian kesesuaian, tuning performa, kode game dan aplikasi, sampai platform desktop dan mobile utama
Lalu itu membawa saya ke mana? Sebenarnya tidak terlalu jauh. Sekarang hampir tidak ada yang peduli pada OpenGL, dan setelah dua vendor OS besar akhirnya meninggalkannya, teknologi ini praktis hampir mati. Coba saja cari OpenGL di “HN Who's Hiring”
Saya bisa saja mempelajari ulang API grafika lain seperti Direct3D, Vulkan, atau Metal, tetapi kode grafika level rendah kini diabstraksikan oleh engine, sehingga tidak banyak tempat yang membutuhkan orang seperti itu. Perusahaan yang membutuhkan tenaga driver grafika level rendah pun paling banyak hanya 5–6 di seluruh dunia, sehingga ini menjadi ceruk yang membatasi karier
Semakin Anda berfokus pada bagian mesin yang lebih kecil, semakin Anda harus menjadi pakar kelas dunia agar bisa menjadikannya seluruh karier. Kalau rencana Anda bukan menjadi John Carmack berikutnya, saya sarankan melebar daripada menggali terlalu dalam
YouTube dipenuhi video pemrograman pemula yang membuat orang mempelajari deretan tech stack, alih-alih berfokus membuat sesuatu yang menarik. Akibatnya, demi mengisi CV, bahkan untuk merender beberapa baris teks di halaman web pun orang membangun mesin Rube Goldberg yang rumit secara cargo-cult
Saat kuliah saya sempat belajar sedikit pemrograman grafika selama satu semester, dan kompleksitasnya cukup tinggi sehingga jawaban yang masuk akal untuk “apa yang ingin saya buat” hanyalah kira-kira “merender segitiga hijau di latar hitam”. Dari sana, naik ke persegi, kubus, bola, bola yang beranimasi, lalu bola yang memantul adalah progres yang alami dan menjaga fokus pada tujuan. Jadi, hindari juga kesalahan menjawab pertanyaan di atas dengan “first-person shooter dengan pencahayaan ray tracing dan subsurface scattering”
Kode versi pertama untuk bola yang memantul pasti akan sangat buruk. Tidak apa-apa. Seiring waktu Anda akan tahu cara mengoptimalkan dan memperbaikinya. Dan tidak banyak hal yang semenarik menemukan design pattern sendiri. Saat membaca buku tentang topik baru, Anda akan merasa, “oh, ini sudah saya lakukan!”
Tentu saja orang bisa masuk lewat peran lain seperti gameplay programmer lalu perlahan berpindah ke grafika, dan itu mungkin lebih mudah. Namun pada akhirnya, peran graphics programmer membutuhkan C++
Yang disebutkan sebelumnya lebih cocok untuk orang yang ingin cepat produktif mengerjakan hal terkait grafika, bukan pemrograman grafika itu sendiri
Alat akan berubah seiring waktu, dan berdasarkan pengalaman, engineer yang hebat sering kali mampu memakai berbagai alat dengan tingkat kemahiran yang berbeda-beda, bukan hanya menggali satu alat secara mendalam
Sekalipun nanti tidak melakukan pekerjaan itu di dunia nyata, orang bisa mendapatkan banyak pengetahuan teori dan latihan algoritma yang kompleks
Grafika juga memberikan banyak pengalaman matematika terapan. Ada sangat banyak bidang yang sangat membutuhkan orang yang bisa matematika. Di pekerjaan saya sebelumnya, yaitu perangkat lunak mesin CNC, kami membutuhkan orang yang bisa memprogram matematika yang diperlukan untuk mengendalikan bor agar menghasilkan bentuk tertentu pada blok logam, dan itu sangat sulit dicari. Sebaliknya, engineer cloud DevOps, meski mahal, relatif lebih mudah ditemukan
Menurut saya, seorang graphics programmer sebaiknya memiliki pemahaman yang menyeluruh dan seimbang tentang bagaimana grafika bekerja. Di luar sekadar pemrograman dan pengetahuan API, graphics programmer yang baik perlu memahami matriks rotasi, view, dan proyeksi, matematika vektor umum, pemrograman shader, primitive prosedural seperti Voronoi, SDF, dan Perlin, compositing gambar, forward rendering dan deferred rendering, berbagai teknik sampling, serta teknik bayangan dan pencahayaan
Selain itu, ia juga perlu memahami bagaimana art pipeline bekerja dan bagaimana mengekstrak data dari aplikasi 3D, cara nyaman memakai profiler dan debugger, kemampuan membaca paper SIGGRAPH, teknik spatial partitioning dan hierarki volume, implementasi ray tracer sederhana, pemahaman primitive seperti sprite, segitiga, dan n-gon, serta pengalaman dengan partikel dan simulasi
Saya tahu alur yang sangat dasar dalam pembuatan model, yaitu modeling → skinning/rigging → animasi → texturing, serta gambaran umum cara menuliskannya ke file. Namun bagian ini terasa sangat sulit mendapatkan pengalaman praktis yang layak tanpa bekerja langsung bersama artist
Saya melakukan pemrograman grafika sebagai hobi dan sudah mempelajari banyak hal yang disebutkan di sini, tetapi karena tidak punya pengalaman kerja, hampir tidak pernah mendapat kesempatan wawancara
Merekomendasikan kursus Graphics From Scratch dari Pikuma. Hal pertama yang dilakukan adalah menulis fungsi
set_pixelmenggunakan SDL, lalu seluruh proses berikutnya diimplementasikan sendiri dalam kodeSemua operasi matriks, semua transformasi vertex, hingga semua rasterisasi segitiga ditulis sendiri, sambil menghitung warna apa yang seharusnya dimiliki setiap piksel
https://pikuma.com/courses/learn-3d-computer-graphics-progra...
https://www.gabrielgambetta.com/computer-graphics-from-scrat...
Setelah itu saya bisa mempelajari WebGPU dalam beberapa hari; rasanya tidak mungkin tanpa pemahaman yang saya dapat dari kursus tersebut
Kalau butuh motivasi, saya pernah membuat demo renderer yang dibuat di akhir kursus dan dikompilasi ke Wasm: https://rmshin.github.io/3d-renderer-wasm
Apakah harus mulai dengan kode SDL bergaya
putpixelseperti era 90-an, atau mulai dengan Shadertoy? Matematika matriks dasar tentu selalu penting. Tapi bagaimana sebaiknya mengajarkan rasterisasi segitiga? Bisakah langsung beralih ke koordinat homogen dan quadtree tanpa melalui scanline?Apakah benar-benar perlu mengajarkan shading Phong, atau bisa langsung masuk ke BRDF? Beberapa bagian mungkin lebih seperti mengajarkan “trik lama” daripada keterampilan yang berguna
Saat ini statistik dan sampling jauh lebih penting. Saya percaya grafis setiap tahun menjadi semakin matematis. Jadi pelajarilah matematika, dan ajarkan matematika
Di antaranya, saya sangat merekomendasikan repositori GitHub ini: https://github.com/ssloy/tinyrenderer/wiki/Lesson-0:-getting...
Jika Anda tipe pembelajar visual, kanal ini juga merupakan gudang harta karun: https://www.youtube.com/watch?v=ih20l3pJoeU
Di Shadertoy, Anda bisa belajar grafis lewat menulis shader. Banyak programmer grafis memulai dari sana
Sedikit promosi diri: saya membuat lebih dari 10 tutorial yang membahas penulisan shader di VS Code, SDF, ray marching, fungsi noise, fractal Brownian motion, dan sebagainya
https://github.com/suboptimaleng/shader-tutorials
Tentu saja ini berdiri di atas bahu para raksasa seperti Inigo Quilez, The Art of Code, SimonDev, dan Acerola
Ada banyak sekali jalan untuk menjadi programmer grafis tanpa memulai dari DX/VK/OGL. Tidak harus memakai C++. Lihat saja grafik 3D menakjubkan yang dibuat 3Blue1Brown dengan Python
Jika ingin menggunakan game engine, pelajarilah DirectX atau Vulkan; jika ingin membuat aplikasi browser, pelajarilah WebGL
Namun API semacam itu berat, dan tidak banyak mengajarkan grafis dengan sendirinya. Jika ingin mempelajari konsep grafis, sebaiknya buat sendiri rasterizer dan ray tracer dalam bahasa apa pun yang Anda suka
Ada banyak pustaka grafis dan lingkungan coding yang jauh lebih menyenangkan daripada susah payah menggali Vulkan atau DirectX. Processing sangat bagus, dan PlotDevice.io berbasis Python atau pendahulunya NodeBox, serta DrawBot, juga layak dilihat. ShaderToy adalah tempat lain untuk belajar banyak tentang penulisan shader atau rendering, dan mudah untuk mulai digunakan. JavaScript juga punya banyak opsi dan pustaka. Hal-hal ini jauh lebih mudah diakses dan memotivasi bagi pemula, sambil tetap memberi kekuatan dan fleksibilitas bagi pembelajar yang penasaran untuk masuk sedalam yang mereka inginkan
Karena tulisan ini naik ke halaman depan, saya coba membagikan materi yang benar-benar dipakai di industri pemrograman grafis. Sebagai catatan, saya salah satu penulisnya: https://raytracing.github.io/
Materi ini juga termasuk dalam bagian “Useful Websites” di tulisan di atas
Grafis sekarang sudah terlalu luas sehingga satu metode belajar yang cocok untuk semua orang tidak lagi ada. Jika ingin belajar grafis, saya sarankan mencari mentor
Saya developer game, tetapi bukan programmer grafis profesional. Dalam pekerjaan saya memakai API grafis modern dan shader GLSL, tetapi baru-baru ini ketika anak 13 tahun ingin beralih dari Scratch atau Python ke C++, saya memutuskan bahwa pilihan terbaik adalah mengeluarkan DLL OpenGL 1.2 lama yang sudah ada di komputer sejak 1999, lalu memulainya dengan kode immediate mode bergaya
glutdanglbegin/glvertex/glendIni jauh lebih menyenangkan daripada harus menahan segala macam konfigurasi yang diperlukan API modern. Anak itu lebih tertarik pada geometri komputasional seperti diagram Voronoi, jadi API grafis hanyalah alat untuk mencapai tujuan, dan shader atau pencahayaan yang mewah belum penting sekarang. Performa C++ dan OpenGL lama kira-kira seribu kali lebih cepat daripada Scratch, jadi sepertinya kami menemukan titik yang pas untuk tahap belajar saat ini
Bahkan dengan API OpenGL 1.2 yang disederhanakan, mencoba memahami C++ dan OpenGL sekaligus adalah beban belajar yang cukup ambisius, sehingga kesederhanaannya membuatnya masih bisa ditangani secara mental. Saat ini berjalan baik; anak itu sudah membuat demo marching squares yang cukup bagus, dan saya membantunya menambahkan menu IMgui agar parameter bisa disesuaikan saat runtime. Cukup menyenangkan
Saya tidak begitu yakin apa sebenarnya yang ditanyakan situs web ini. Apakah ingin melakukan rigging? Texturing? Modeling? Menulis driver? Membuat GUI? Animasi situs web? Alat grafis? Shader? Mesin foto 2D? Game 2D? Game 3D? Skrip prosedural? Optimasi kode grafis?
Di bawah “computer graphics” ada ratusan bidang. Namun situs web ini berfokus pada satu sudut yang sangat kecil di antaranya, yaitu pemrograman SDK grafis
Seorang programmer grafis biasanya diharapkan mampu menangani game, 3D, 2D, tools, shader, dan optimasi secara umum
Saya juga sedang menempuh perjalanan itu. Dua tahun lalu, saya membuat engine 3D pertama saya dengan mengikuti berbagai tutorial dan video YouTube
Sangat sederhana, tetapi saya suka yang sederhana. Sekarang saya sedang membuat game pembangunan kota dengan engine ini. Belajar memanipulasi elemen menggunakan matriks dan perkalian silang benar-benar menyenangkan
https://www.youtube.com/watch?v=cvyrfPUpyp0