2 poin oleh GN⁺ 2025-01-05 | 1 komentar | Bagikan ke WhatsApp
  • Di Unity, cara umum untuk menggambar outline di sekitar objek mencakup efek rim, ekspansi vertex, blur buffer, algoritme Jump Flood, dan deteksi edge; masing-masing berbeda dalam kualitas, performa, dan biaya konfigurasi
  • Efek rim memperkirakan Fresnel dengan dot product antara normal dan arah pandang untuk menonjolkan bagian dalam tepi, tetapi hasilnya sangat berbeda antara model yang membulat dan model yang tajam
  • Ekspansi vertex membuat outline dengan memperbesar mesh duplikat dari belakang; jika diproses di clip space, lebar di layar bisa dibuat lebih konsisten
  • Blur buffer dan algoritme Jump Flood adalah pendekatan yang menggambar siluet ke buffer lalu memperluasnya; masing-masing unggul untuk garis lembut atau outline yang sangat lebar
  • Deteksi edge membuat garis dengan mencari diskontinuitas pada buffer depth, normal, dan warna di seluruh layar, tetapi perlu penyesuaian threshold dan modulasi secara cermat untuk mengurangi garis yang tidak diinginkan

Alasan menggunakan rendering outline

  • Outline digunakan di game untuk menciptakan gaya visual atau sebagai bantuan gameplay seperti menyorot atau memilih objek
    • Sable menggunakan outline untuk gaya seperti komik
    • The Last of Us menggunakan outline untuk menyorot musuh saat pemain masuk ke mode stealth
  • Kelima teknik ini memiliki kompromi yang berbeda antara performa, kualitas visual, dan jumlah konfigurasi manual

Efek rim: menonjolkan tepi bagian dalam dengan perkiraan Fresnel

  • Efek rim memperkirakan efek Fresnel untuk merender garis pada rim/tepi objek
  • Perhitungannya didasarkan pada dot product antara vektor normal ternormalisasi N dan arah pandang ternormalisasi V
    • Nilai 1.0 - saturate(dot(N, V)) dipangkatkan dengan eksponen P untuk menghasilkan intensitas efek
    • Ini lebih dekat ke pendekatan untuk outline daripada Fresnel yang akurat secara fisik
  • Dalam implementasi Unity, shader kustom mengontrol lebar, power, kelembutan, dan warna outline
    • Contoh implementasinya menggunakan smoothstep, lerp, _OutlineWidth, _OutlineSoftness, _OutlinePower, _OutlineColor
  • Cara ini selalu muncul sebagai garis internal dan tidak terlihat pada kontur luar objek
  • Cocok untuk objek yang membulat dan halus, tetapi pada kubus atau model kompleks lebar garis bisa tidak merata atau tidak terlihat seperti outline

Ekspansi vertex: memperbesar mesh duplikat untuk membuat garis luar

  • Ekspansi vertex merender ulang duplikat dari objek atau mesh asli, memperluas vertex di belakang objek asli untuk membuat bentuk yang lebih besar, lalu merendernya dengan warna solid
  • Memilih arah ekspansi

    • Kualitas outline sangat dipengaruhi oleh arah pergerakan vertex
    • Jika dipindahkan mengikuti arah posisi vertex, mesh akan tampak mengembang
    • Di local space, posisi vertex dapat digunakan seperti vektor dari pusat objek ke vertex
    • Jika tidak dinormalisasi, vertex yang lebih jauh dari pusat akan bergerak lebih banyak
    • Menggunakan normalize(positionOS) * width memungkinkan pergerakan yang lebih merata di object space
    • Jika dipindahkan mengikuti arah vektor normal, hasilnya bagus pada objek dengan tepi halus seperti bola atau kapsul
    • Pada objek dengan tepi tajam seperti kubus, celah bisa muncul pada outline
    • Vertex color juga dapat digunakan sebagai arah ekspansi
    • Caranya adalah membuat normal kustom dan menyimpannya di channel vertex color mesh
    • Jika normal halus berbentuk bola di-bake ke vertex color pada kubus, outline yang lebih baik dapat diperoleh
    • Kekurangannya adalah konfigurasi manual karena normal kustom harus dibuat untuk setiap mesh, meski bisa diotomatisasi dengan script
  • Memilih space ekspansi

    • Pada tahap vertex shader, koordinat vertex dimulai di object space lalu diubah ke clip space melalui matriks MVP
    • Alurnya adalah object/model/local space → world space → camera/view space → clip space → screen space → viewport/window space
    • Jika diekspansi di object space, outline dapat terdistorsi karena transformasi MVP belum diterapkan
    • Saat matriks model diterapkan, masalah scaling bisa muncul
    • Saat clip space menuju screen space, terjadi pengecilan perspektif akibat perspective division
    • Sebagian pergerakan di ruang 3D bergerak ke arah kamera sehingga tidak berkontribusi pada lebar outline di layar
    • Jika diekspansi di clip space, outline yang rapi dengan lebar yang mendekati sama di layar dapat dibuat
    • Posisi vertex dan normal diubah ke clip space, lalu hanya koordinat x dan y yang dimodifikasi
    • Aspect ratio dikoreksi dengan membagi berdasarkan lebar dan tinggi layar
    • w dari clip space dikalikan agar perspective division setelahnya tidak memberi efek bersih pada lebar outline
    • width * 2 dikalikan agar satu unit lebar sesuai dengan 1 piksel di layar
    • Cara clip space juga bergantung pada normal mesh
    • Jika tidak menggunakan normal kustom, celah bisa muncul pada tepi tajam
    • Jika normal salah diatur dan mengarah ke arah berlawanan, vertex outline juga bergerak ke arah berlawanan sehingga muncul celah
    • Penjelasan terkait dapat dilihat lebih lanjut di creating an outline in clip space
  • Masking

    • Pada mesh duplikat, hanya bagian outline yang menonjol yang seharusnya terlihat
    • Cara umum adalah melakukan culling pada front-facing geometry dari mesh duplikat dan membuat outline dari backface
    • Depth test menggunakan less than or equal to agar backface hanya terlihat di posisi outline
    • Cara lain adalah menggunakan stencil mask agar mesh duplikat tidak terlihat di depan objek asli
    • Dalam kasus ini, culling tidak diperlukan
    • Tidak ada garis internal pada objek sama sekali
    • Jika dua objek saling tumpang tindih, outline hanya terlihat di sekitar kedua objek tersebut

Blur buffer: memperluas siluet dengan blur

  • Metode blur buffer merender siluet objek ke buffer, lalu memperluasnya dengan blur dan menggunakan hasilnya untuk rendering outline
  • Buffer siluet

    • Tahap pertama adalah membuat buffer siluet
    • Setiap objek dirender ke texture dengan shader output warna solid
    • Jika semua siluet dirender putih, warna outline yang diinginkan dapat dikalikan di akhir untuk membuat satu warna
    • Jika outline dengan warna berbeda diperlukan untuk tiap objek, setiap siluet dapat dirender dengan warna tertentu
  • Pass blur

    • Pass blur digunakan untuk memperluas buffer siluet
    • Biasanya menggunakan box blur atau Gaussian blur
    • Untuk meningkatkan performa, buffer siluet dapat diperkecil sebelum blur
    • Pass blur mahal karena menghitung rata-rata atau rata-rata berbobot dari beberapa piksel di sekitar tiap piksel
    • Blur sebaiknya dilakukan dalam 2 pass
    • Pada filter separable seperti box blur dan Gaussian blur, kompleksitas algoritme dapat diturunkan dari O(N²) menjadi O(2N)
    • Pertama lakukan blur secara vertikal, lalu blur hasilnya secara horizontal untuk menghasilkan hasil akhir
    • Lebar outline dikontrol dengan parameter _KernelSize pada shader blur
  • Pass outline dan masking

    • Setelah pass blur, siluet yang sudah diburamkan dikompositkan dengan scene asli untuk membuat outline
    • Blur buffer cocok untuk outline lembut atau bercahaya
    • Dengan menerapkan step pada hasil blur, outline keras juga dapat dirender
    • Seperti metode ekspansi vertex, stencil mask dapat digunakan agar outline hanya dirender di belakang geometry
    • Dampak performanya bisa lebih besar daripada metode lain

Algoritme Jump Flood: menangani outline yang sangat lebar

  • Metode keempat merender outline dengan algoritme Jump Flood
  • Kelebihannya adalah outline yang sangat lebar dapat dirender dengan biaya performa yang wajar
  • Penjelasan detail berlanjut ke The Quest for Very Wide Outlines oleh Ben Golus

Deteksi edge: mencari diskontinuitas di seluruh layar

  • Metode deteksi edge menggambar garis dengan mencari diskontinuitas pada scene dalam pass layar penuh
  • Diskontinuitas dapat dideteksi dari nilai depth buffer, vektor normal, warna albedo, atau data lain yang tersedia dalam proses rendering
  • Roberts cross

    • Roberts cross operator adalah operator diferensial yang menghitung jumlah kuadrat dari perbedaan piksel diagonal
    • Dalam implementasi nyata, edge dideteksi dengan mengonvolusi kernel pada gambar asli
    • Menggunakan 2 kernel untuk arah x dan arah y
    • Ukuran kernelnya 2 x 2
    • Hanya membutuhkan 4 sampel di sekitar satu piksel
    • Operator ini sederhana tetapi dapat menghasilkan hasil yang baik
  • Sobel operator

    • Sobel operator juga menggunakan 2 kernel untuk arah x dan arah y
    • Ukuran kernel Sobel adalah 3 x 3, dan menggunakan 9 sampel di sekitar satu piksel
    • Cara kerja filter Sobel dapat dilihat lebih lanjut di blog post on Sobel filters
  • Sumber diskontinuitas

    • Cara umum adalah mencari diskontinuitas dari depth texture, normal texture, dan color texture yang dibuat render pipeline untuk scene
    • Pass deteksi edge mengambil sampel texture ini dan mendeteksi diskontinuitas dengan operator yang disebutkan di atas
    • Edge yang dibuat dengan cara ini dapat digambar karena adanya diskontinuitas yang ditemukan di salah satu dari tiga buffer tersebut
    • Karena metode ini menerapkan outline pada semua objek yang menulis ke buffer tersebut, kontrol per objeknya rendah
    • Mengizinkan beberapa sumber diskontinuitas dapat membuat sistem outline yang lebih tangguh
    • Beberapa edge terdeteksi di ketiga sumber sekaligus
    • Banyak edge terdeteksi hanya dari kontribusi satu sumber tertentu
    • Bobot dan threshold berbeda dapat diberikan untuk tiap sumber agar hasil visual outline dapat dikontrol
  • Modulasi deteksi edge

    • Jika operator deteksi edge saja diterapkan ke buffer diskontinuitas, hasil yang bebas artefak bisa sulit diperoleh
    • Depth buffer di banyak render pipeline diimplementasikan secara nonlinier
    • Perbedaan depth saat dua objek yang dekat dengan kamera berjarak 1 m lebih besar daripada saat dua objek yang jauh berjarak 1 m
    • Untuk mengoreksinya, threshold deteksi diskontinuitas depth dapat dimodulasi dengan depth buffer itu sendiri
    • Geometry yang dekat membutuhkan diskontinuitas nilai depth yang lebih besar sebelum terdeteksi sebagai edge
    • Edge yang tidak diinginkan juga dapat muncul pada grazing angle kecil
    • Ini dapat dimodulasi menggunakan mask Fresnel yang dibuat dari dot product antara vektor normal N dan arah pandang V
    • Mask ini adalah jenis yang sama dengan yang digunakan pada metode efek rim
    • Teknik modulasi lain juga dapat digunakan, tetapi pilihannya bergantung pada efek visual yang dituju
  • Sumber diskontinuitas kustom

    • Sumber diskontinuitas kustom juga dapat diberikan ke shader outline
    • Ini adalah render texture yang dibuat langsung dalam proses rendering dan berisi data kustom untuk digunakan dalam pembuatan outline
    • Karena Anda dapat mengontrol langsung objek mana yang menulis ke buffer kustom, Anda juga dapat mengontrol objek mana yang menerima outline
    • Contohnya, vertex color mesh dapat dirender ke texture untuk membuat sumber diskontinuitas
    • Cara lain termasuk mewarnai permukaan berdasarkan posisi world, atau membuat buffer kustom yang menggabungkan informasi depth buffer dan normal buffer
    • Informasi tambahan dapat dilihat di Linework section map

1 komentar

 
GN⁺ 2025-01-05
Komentar Hacker News
  • Artikel Jump Flood Algorithm yang ditautkan sangat bagus: https://bgolus.medium.com/the-quest-for-very-wide-outlines-b...
    Menarik untuk memikirkan berbagai pendekatan yang bisa dipakai di tingkat piksel/teksel, dan di sini juga signed distance field (SDF) digunakan dengan cara cerdas untuk menangani banyak hal
    Hasil bahwa garis luar dengan lebar yang diinginkan bisa dibuat dalam waktu linear sangat mengesankan dibanding pendekatan brute force untuk lebar besar
    Baik berbasis vektor, berbasis fungsi seperti karya Inigo Quilez, maupun pendekatan raster berbasis teksel/voxel seperti di artikel, SDF sangat direkomendasikan
    Houdini juga mendukung raster SDF dengan baik dan punya toolset SDF yang matang, jadi layak dicoba bahkan dengan versi gratisnya

  • Suatu hari saya ingin mendalami grafis 3D bergaya sebagai proyek riset dan pengembangan.
    Belakangan ini sudah ada cukup banyak kemajuan, tetapi masih terlihat banyak low-hanging fruit yang tersisa.
    Saya penasaran bagaimana mengurangi detail model 3D toon rendering saat kamera menjauh, dan bagaimana beralih secara alami antara tampilan yang lebih bergaya dan yang kurang bergaya.
    Juga masih menjadi pertanyaan apakah latar cat air dari animasi 2D gambar tangan bisa dirender secara meyakinkan sebagai adegan 3D, dan bagaimana menganimasikan sapuan kuas serta tekstur kertas dengan halus di screen space.
    Masih terbuka juga bagaimana sebaiknya merepresentasikan elemen seperti asap, api, pepohonan, rumput, lumpur, hujan, bulu, dan air dalam game 3D bergaya.
    Saya juga penasaran apakah mungkin mengotomatisasi sedikit deformasi model agar terlihat lebih bagus dari sudut kamera saat ini, seperti pada animasi gambar tangan, di game dengan kamera bebas.
    Pertanyaan besar lainnya adalah seperti apa editor mesh dan editor latar yang ideal untuk renderer bergaya, dan apakah permukaan 3D yang akurat secara fisik serta rig memang perlu, atau bisa didefinisikan dengan cara yang lebih abstrak.
    Menarik juga apakah mungkin membuat game 2D prosedural dengan merender pixel art retro dari model 3D sederhana, dan sepertinya stylization juga bisa dipakai untuk membuat persilangan dua mesh yang kebetulan berpotongan jadi kurang mencolok.
    Hanya dari pertanyaannya saja sudah bisa mengisi karier sepuluh orang, tapi justru itu terdengar bagus.

    • Untuk latar cat air ada beberapa teknik, dan secara pribadi yang paling menonjol menurut saya adalah pekerjaan di sisi Blender yang memakai Blender Geometry Nodes: https://www.youtube.com/watch?v=ljjUoup2uTw
      Filter Kuwahara juga sudah cukup meyakinkan bagi kebanyakan orang.
      Untuk alat editing renderer bergaya, Blender + Rigify + shape key + sedikit keajaiban driver sudah cukup untuk kebutuhan saya.
      Texturing di Blender memang merepotkan, tetapi untuk level hobi masih bisa ditoleransi, dan kalau butuh kontrol non-photorealistic rendering yang lebih besar, fork dari DillonGoo Studio mungkin lebih baik: https://www.dillongoostudios.com/gooengine
      Saya pernah mencoba membuat pixel art dari model 3D dengan merender animasi/model pada resolusi rendah, dan hasilnya lumayan, meski perlu trial and error.
      Saya juga ingat pernah ada contoh yang membuat post-processing lebih canggih untuk menghilangkan hal-hal seperti pixel flicker.
    • Bukan 3D, tetapi studio visualisasi data dan kartografi bernama Stamen membuat renderer peta cat air yang indah: https://maps.stamen.com/watercolor/#14/52.3718/4.8958
    • Sulit menyebutnya tepat sebagai pixel art retro, tetapi sejak Commandos 2, karakter, kendaraan, dan sebagainya dibuat sebagai model 3D, lalu dirender menjadi sprite 2D saat runtime, kemudian dicampurkan dengan sprite dan latar 2D yang sudah dirender sebelumnya.
    • Saat membuat game pixel art 3D, saya harus mengubah ukuran piksel ketika kamera melakukan zoom out.
      Resolusi rendah: https://x.com/Navy_Green/status/1525564342975995904
      Stabilisasi: https://x.com/Navy_Green/status/1693820282245431540
    • Sebagai contoh membuat pixel art dari model 3D, lihat Dead Cells: https://www.gamedeveloper.com/production/art-design-deep-div...
  • Saya memulai karier dengan aplikasi VR, lalu segera pindah ke pengembangan web karena pasarnya lebih baik.
    Tulisan seperti ini membuat saya rindu pada bidang itu.
    Bekerja dengan grafis 3D, collision, shader punya nuansa magis yang sulit ditemukan di bidang lain.
    Pada dasarnya kita membangun dunia dan mereproduksi fisika, dan matematikanya juga jauh lebih praktis serta lebih sering muncul dibanding bidang pemrograman lain.

    • Saya justru pindah dari pengembangan web ke game, dan memang seseru dan semenarik yang terdengar.
      Kepuasan kerja jauh lebih tinggi, dan kedalaman serta batas atas topiknya juga lebih tinggi.
      Sudah 4 tahun saya menjalaninya, dan saya belum pernah menabrak tembok kebosanan seperti saat masih di pengembangan web.
      Tidak ada yang menandingi datang kerja pada hari Senin, membuka editor engine, melihat dunia kecil yang sedang dikerjakan dirender, sambil memikirkan fitur keren apa yang ingin ditambahkan berikutnya.
    • Di pengembangan web, kalau orang-orang menyedot semua kode lalu memberikannya ke jaringan saraf, mungkin bagian yang membosankan dan merepotkan akan berkurang dan yang tersisa adalah hal-hal menarik.
      Sebaliknya, di bidang technical art, kalau yang disedot adalah hasil akhirnya lalu diberikan ke jaringan saraf, bagian yang menarik dan memuaskan justru hilang, dan untuk pekerjaan profesional yang tersisa hanya pekerjaan lama yang membosankan, atau malah lebih banyak lagi.
      Nilai seluruh set keterampilan juga turun, sementara orang-orang di industri teknologi bersikap seolah mereka lebih paham pekerjaan itu daripada para pelakunya sendiri, lalu menuduh orang tidak senang karena perusahaan Silicon Valley merusak pasar dengan mengeluarkan hasil C- dengan harga F tanpa membayar kompensasi kepada orang-orang yang membuat data aslinya.
      Kalau menimbang plus minusnya, saya rasa keputusan pindah ke pengembangan web memang tepat.
  • Di game saya, Astral Divide, saya membuat teknik yang tidak ada di tulisan ini.
    Mirip dengan Blurred Buffer, tetapi tanpa pass blur, melainkan memanfaatkan garis batas yang dibuat oleh anti-aliasing.
    Saya menggambar objek sebagai putih opak di atas latar belakang hitam transparan, lalu di fragment shader hanya memfilter piksel yang kanal alfanya tidak sepenuhnya opak atau sepenuhnya transparan dengan ambang yang di-hardcode.
    Hasilnya cukup bagus, biaya performanya murah, dan implementasinya juga sangat sederhana.

    • Trik seperti itu memang sangat memuaskan.
      Dulu saat mengimplementasikan alat potong di perangkat lunak penyunting video, saya perlu mengaburkan sementara area di luar bagian yang dipotong selama proses edit.
      Saya juga tidak ingin menambahkan pass blur yang mahal, jadi saya hanya mengubah mipmap bias agar tekstur beresolusi lebih rendah yang dirender, dan texture filtering melakukan semua pekerjaan itu secara gratis.
      Saat dibandingkan dengan efek blur crop serupa di PowerPoint, hasilnya nyaris sama, malah PowerPoint punya sedikit color banding sedangkan implementasi saya tidak.
      Dengan cara serupa, pada situasi tanpa anti-aliasing resolusi penuh, sebagian besar canvas berisi persegi panjang 2D yang bisa diputar sehingga jaggies terlihat di tepinya.
      Alih-alih menyalakan anti-aliasing layar penuh, saya sedikit memperbesar semua persegi panjang dan mengecilkan koordinat UV secara proporsional, sehingga tepi yang terlihat berada di bagian dalam persegi panjang 3D yang sebenarnya, dan sekali lagi texture filtering menyelesaikannya secara gratis.
    • Kalau piksel-piksel itu diatur menjadi warna polos, bukankah akan muncul efek bergerigi?
      Atau apakah alfanya dipertahankan dan hanya warnanya yang diatur, sehingga garis luarnya tampak samar tetapi tidak bergerigi?
  • Catatannya luar biasa.
    Belakangan saya mencari pendekatan deteksi tepi dan menemukan metode bagus buatan pengembang Mars First Logistics: https://www.reddit.com/r/Unity3D/comments/taq2ou/improving_e...

  • Tulisannya juga bagus dan hasilnya enak sekali dilihat: https://ameye.dev/notes/rendering-outlines/edge-detection/co...
    Terlihat seperti satu panel dari komik Belanda Franka.

    • Itu adalah reproduksi satu panel dari Tintin The Black Island.
  • Ini tulisan yang benar-benar luar biasa, dan pengalaman membacanya juga sangat baik.
    Konsep-konsep yang sulit dijelaskan dengan kata-kata yang bisa dipahami siapa saja, diagram dan contohnya bagus, dan keterbacaannya juga kelas atas berkat jarak serta tipografinya.
    Saya penasaran apa yang memicu pembuatan tema saat ini, dan apakah pernah terpikir untuk membuat platform penerbitan yang berfokus pada engineer.

  • Technical art sejauh ini adalah cinta pertama saya dalam perangkat lunak.
    Saya berharap pipeline compute shader untuk efek post-processing di Godot bisa dibuat lebih mudah.
    Konfigurasi plugin compositor saat ini masih punya cukup banyak boilerplate.
    Repositori ini adalah contoh bagus untuk post-processing di Godot: https://github.com/sphynx-owner/JFA_driven_motion_blur_demo

  • Saya rasa pertama kali melihat efek ini adalah di Wacky Races untuk Dreamcast.
    Waktu itu banyak promosi yang menyiratkan bahwa game tersebut adalah yang pertama memperkenalkan efek ini dan para pengembang pada dasarnya yang menemukannya.
    Saya tidak tahu apakah itu benar atau sekadar promosi berlebihan, tetapi sebagai gamer, memang saat itulah pertama kali saya mengalaminya.

    • Sepertinya banyak orang menemukan efek itu sendiri-sendiri pada periode yang hampir bersamaan.
      Sejujurnya, Dreamcast adalah hardware pertama yang bisa memproses efek ini secara real-time dengan kualitas tinggi.
      Saya mengembangkan efek cel shading untuk game Dreamcast Looney Tunes: Space Race, dan saya membuatnya langsung pada minggu pertama setelah menerima dev kit Dreamcast.
      Infogrames Sheffield, yang membuat Wacky Racers, melihat versi awal implementasi kami dan menambahkan efek serupa ke game mereka.
      Tampaknya bagus, tetapi karena masuk di tahap akhir produksi, hasilnya tidak dioptimalkan untuk efek tersebut seperti game kami.
      Tim Jet Grind Radio juga membuat efek yang sama secara independen dan merilisnya lebih dulu dari kami.
      Algoritmenya persis sama, tetapi cara pemanfaatannya berbeda; mereka menerima outline yang tidak rata, lebar, dan bergerigi, sedangkan Sheffield dan kami berusaha melawan karakteristik itu demi gaya seni yang lebih seragam dan tradisional.
      Sekitar setahun kemudian, di Dragons Lair 3D untuk Xbox, tampaknya seseorang menemukan cara menjalankan cel shading berbasis deteksi tepi secara real-time.
      Saya sempat membuat implementasi uji untuk pendekatan itu di Dreamcast, tetapi performanya sama sekali tidak cukup untuk menerapkannya pada beberapa karakter sekaligus sambil menjalankan game.
      Saya tidak tahu apakah itu karena Xbox lebih kuat atau algoritmenya lebih cerdas, tetapi hasilnya tidak bisa dibantah.
      Jika ingin membuat game yang benar-benar terlihat seperti kartun gambar tangan, menurut saya pribadi itu masih merupakan metode dengan kualitas terbaik.
      Saya ingin menemukan alasan untuk mengimplementasikannya lagi suatu hari nanti, dan sekarang sepertinya performa tidak lagi menjadi masalah.
    • Kelihatannya dirilis pada waktu yang sama dengan Jet Set Radio, dan itu juga untuk Dreamcast serta punya efek yang mirip.
      Kebetulan yang cukup luar biasa.
  • Saya benar-benar harus mulai belajar pemrograman shader dan rendering 3D.
    Tulisan seperti ini benar-benar bagus, dan akan menyenangkan kalau saya benar-benar bisa memakai shader.

    • Saya belajar dengan Shadron sekitar 8 tahun lalu.