3 puan yazan GN⁺ 2023-11-24 | 1 yorum | WhatsApp'ta paylaş
  • Grafiklere girişte tek bir doğru yanıttan çok mevcut bilgi·öğrenme biçimi·donanım belirleyicidir; AMD Game Engineering ekibi, yeni başlayanlar için daha dostça bir başlangıç noktasına ihtiyaç olabileceğini düşünüyor
  • Grafik programlama, CPU tarafında C++ kodu ve GPU tarafında shader kodu yazıp bunları DirectX·Vulkan·OpenGL gibi grafik API’leriyle birbirine bağlayan bir yapıdır
  • 2023 itibarıyla başlıca seçenekler OpenGL·DirectX 11·WebGL gibi eski API’ler ile Vulkan·DirectX 12·Metal·WebGPU gibi modern açık API’ler arasında ayrılır
  • Eski API’leri öğrenmek daha kolaydır, ancak sürücü ve runtime karmaşıklığı artmıştır; modern API’ler ise daha fazla kod ve GPU anlayışı gerektirir, buna karşılık daha fazla kontrol sağlar
  • Başta OpenGL·WebGL·oyun motorları·Shadertoy gibi basit ortamlarda başlanabilir; C++ ve GPU pipeline anlayışı yeterliyse doğrudan Vulkan·DirectX 12’ye de girilebilir

Grafik programlamanın temel yapısı

  • Grafik programcılarının ağırlıklı olarak kullandığı dil için kısa yanıt C++’tır
  • Gerçek iş, CPU’da çalışan host kodu ile GPU’da çalışan shader kodunu birlikte yazma biçimindedir
    • Host CPU kodu genellikle C++ ile yazılır
    • GPU kodu HLSL veya GLSL gibi yüksek seviyeli shading dilleriyle yazılır
  • Grafik API’si, CPU kodunun shader’ları ve gerekli veri·metadata’yı kullanarak GPU’dan iş yapmasını istemesini sağlayan bağlantı noktasıdır

Hangi grafik API’siyle başlamalı?

  • 2023 itibarıyla PC oyunlarında ve 3D uygulamalarda yaygın kullanılan API’ler genel olarak iki gruba ayrılır
    • Eski API’ler: OpenGL, DirectX 11, WebGL
    • Modern açık API’ler: Vulkan, DirectX 12, Metal, WebGPU
  • OpenGL, DirectX 11 ve WebGL, GPU’yu programlamaya yönelik tarihsel yaklaşıma dayanır ve programcı açısından daha basit oldukları için öğrenmeleri daha kolaydır
  • Basitliğin bir bedeli vardır
    • Zamanla sürücülerin ve runtime’ın iç uygulaması karmaşıklaşmıştır
    • Bu, host taraflı darboğazlara ve GPU üreticilerinin yazmak zorunda olduğu karmaşık sürücü yüküne yol açmıştır
  • AMD’nin Mantle’ı 2013–2016 arasında PC’de ortaya çıktı ve AMD GPU’lar ile EA DICE iş birliği sayesinde GPU’ya daha düşük seviyeli erişim ve ince bir soyutlama sundu
  • Metal 2014’te Apple platformlarında ortaya çıktı; DirectX 12 ve Vulkan ise 2016’da ortaya çıkarak GPU programlamayı daha düşük seviyeli ve açık bir biçimde ele aldı

Kolay API’ler ile açık API’lerin öğrenme tavizleri

  • Vulkan ve DirectX 12, programcının GPU’dan istediği işi daha net biçimde belirtmesini gerektirdiğinden başlangıç yükü fazladır
  • Buna karşılık daha fazla kontrol elde edilir ve GPU işlerinin performansını ve verimliliğini artırma fırsatı da büyür
  • Sadece ilk üçgeni çizme örneğine bakıldığında bile API’ler arasındaki fark ortaya çıkar
    • OpenGL veya DirectX 11 ile ilk üçgen yaklaşık 10 satır kodla çizilebilir
    • Vulkan ve DirectX 12 bunun çok daha fazlasını gerektirir
  • OpenGL ve DirectX 11 birçok ayrıntıyı gizleyerek üretken grafik işlerine hızlıca geçmeyi sağlar, ancak GPU’nun işleyişi bir sihirli kutu gibi görünebilir
  • Vulkan ve DirectX 12, en baştan düşük seviyeli bilgi ve GPU anlayışı gerektirir; buna karşılık her kod satırı GPU’da ne olacağını daha açık biçimde ortaya koyar

Başlangıç yolları için seçenekler

  • AMD Game Engineering ekibi içinde de gençlerin veya yeni başlayanların DX12 ya da Vulkan ile başlamasının sert olacağı görüşüyle, koşullar uygunsa bunun mümkün olduğu görüşü birlikte bulunuyor
  • OpenGL güncellik ve ilgi açısından gerilemiş olsa da temel becerileri öğrenmek için hâlâ yeterli görülüyor
  • WebGL, grafik pipeline’ını anlamak için kolay bir başlangıç noktası olabilir
    • Web’de C++ olmadan JavaScript ile gerçek zamanlı grafiklerle çalışılabilir
    • WebAssembly kullanılırsa tarayıcıda C++ ile grafik çalıştırmak da mümkündür
  • WebGPU, modern grafik API’lerine daha yakın kavramlar sunarken düşük seviye ayrıntıları daha az gerektirebilir
    • Karmaşık kod yazmaya başladığınızda hâlâ çeşitli sorunlarla karşılaşabilirsiniz
    • Prototipleme ve öğrenme·eğitim amaçlı bir API olarak umut vericidir
  • Önce bir oyun motoruyla başlamak da mümkündür
    • Unreal Engine PC oyunlarında büyük bir paya sahiptir
    • Unity de yaygın bir alternatiftir
    • Godot gibi daha küçük ve basit açık kaynak motorlar da vardır
  • İlk rendering dersini Unity ile yürüten okullar da var, ancak öğrencilerin neden düşük seviyeli bilgiyi öğrenmeleri gerektiğini anlamama riski bulunuyor
  • Açık API’lerle başlamak için modern grafik pipeline’ını ve GPU donanımının bunu nasıl uyguladığına dair büyük resmi iyi bilmek ya da bu anlayışı eşzamanlı edinmeye istekli olmak gerekir

Önerilen öğrenme kaynakları ve sonraki adımlar

  • LearnOpenGL: C++ içinde gerçek API ile grafik programlamayı öğrenmek için iyi bir başlangıç sitesi
  • Scratchapixel: Çok fazla kod olmadan ray tracing gibi kavramların nasıl çalıştığına odaklanmayı sağlar
  • Udemy: Yeni başlayanlara yönelik kurslar bulmak için kullanılabilir
  • Rastertek: OpenGL·DirectX 11 eğitimleri
  • Ray Tracing in One Weekend: Bir miktar kod yazabiliyorsanız, doğrudan yaparak öğrenme yaklaşımı için uygundur
  • A trip through the graphics pipeline: 2011 tarihli olduğu için açık API’ler öncesine ait bir kaynak olsa da GPU bakış açısından donanım·yazılım kavramları hâlâ geçerlidir
  • learn wgpu: LearnOpenGL’e benzer tarzda bir WebGPU öğrenme sitesidir ve hâlâ çalışma aşamasında bir niteliğe sahiptir
  • Your first WebGPU app: WebGPU’ya giriş kaynağı olarak görülebilir
  • Shadertoy: Grafik API’sini doğrudan ele almadan shader yazmaya olanak tanıdığı için daha basit bir başlangıç noktasıdır
  • Vulkan Tutorial: Vulkan veya DirectX 12 öğrenirken kopyala-yapıştırdan korkmamanın da önemli olduğu bağlamında birlikte ele alınır
  • Henüz dil veya API ekosistemine karar vermediyseniz, farklı yaklaşımları deneyip size uyan yöntemi kullanmaya devam edebilirsiniz

1 yorum

 
GN⁺ 2023-11-24
Hacker News yorumları
  • Yeni başlayanların “hangi araçları kullanmalıyım?” diye başlamak yerine bir adım geri çekilip önce “ne yapmak istiyorum?” diye sorması iyi olur.
    Öğrenmeye başlarken bile nihai çıktıyı gözden kaçırmamak gerekir. Günümüzde bilgisayar grafiklerinde ekrana piksel çizmenin birçok aşamasını soyutlayan o kadar çok araç var ki, en baştan düşük seviyeli kodla uğraşıp sonradan gitmek istediğiniz alanda Unity, TouchDesigner, threejs, After Effects kullanıldığını ve C++’ın neredeyse hiç kullanılmadığını fark edebilirsiniz.
    Elbette işlerin temelde nasıl döndüğünü öğrenmek çok değerli, ama bunu en başta yapmanın yavaş bir yaklaşım olduğunu düşünüyorum. Sektöre girip oyun motorları ya da görsel programlama gibi soyutlama araçlarıyla iç işleyişin kavramlarını oturttuğunuzda öğrenme daha hızlı oluyor.
    Bunu C++ ve OpenGL’i zor yoldan öğrenmeye yıllar harcamış, kodsuz yaklaşımları kabullenmemi engelleyen batık maliyetle uzun süre boğuşmuş biri olarak söylüyorum. Sonuçta yapmak istediğiniz şeyi yapmanıza yardımcı olmuyorsa bu yolda zaman harcamamak daha iyi.

    • Bu tavsiyeyi dinlemek iyi olur. Kariyerimin başında OpenGL uzmanı olmaya karar vermiştim ve bir ölçüde de olduğumu düşünüyorum.
      Mark Kilgard gibi ders kitabı yazmadım ama sürücü seviyesinden uygunluk testlerine, performans ayarına, oyun ve uygulama koduna, büyük masaüstü ve mobil platformlara kadar API’nin birçok katmanıyla derinlemesine uğraştım.
      Peki bu nereye vardı? Aslında çok da uzağa gitmedi. Artık OpenGL’i önemseyen yer neredeyse yok; iki büyük işletim sistemi üreticisinin sonunda onu bırakmasıyla fiilen ölü bir teknolojiye yakın. “HN Who's Hiring” içinde OpenGL araması yaparsanız görürsünüz.
      Direct3D, Vulkan, Metal gibi başka grafik API’lerini yeniden öğrenebilirdim, ama düşük seviyeli grafik kodu artık motorlar tarafından soyutlandığı için bu tür insanlara ihtiyaç duyan çok yer yok. Düşük seviyeli grafik sürücüsü insanına ihtiyaç duyan şirketler de dünyada en fazla 5-6 tane olduğundan bu, kariyeri sınırlayan bir niş hâline geliyor.
      Makinenin daha küçük bir parçasına ne kadar odaklanırsanız, bunu tüm kariyeriniz yapmak için o alanda dünya çapında uzman olmanız gerekir. Planınız bir sonraki John Carmack olmak değilse derine kazmak yerine geniş gitmenizi öneririm.
    • Yeni geliştiricilerin sürekli düştüğü klasik tuzak bu. Sadece grafik programlamaya özgü de değil.
      YouTube, ilginç bir şey yapmaya odaklanmak yerine yeni başlayanlara teknoloji yığınlarını peş peşe öğreten programlama videolarıyla dolu. Sonuçta insanlar özgeçmişlerini doldurmak için, bir web sayfasında birkaç satır metin render etmekte bile kargo kültü tarzı karmaşık Rube Goldberg düzenekleri kuruyor.
      Üniversitede bir dönem biraz grafik programlama yapmıştım; yeterince karmaşıktı ki “ne yapmak istiyorum?” sorusuna makul cevap ancak “siyah arka plan üzerinde yeşil bir üçgen render etmek” gibi bir şeydi. Oradan dikdörtgene, küpe, küreye, animasyonlu küreye, zıplayan topa gitmek doğal bir ilerleme ve hedefe odaklı kalmanızı sağlıyor. Bu yüzden yukarıdaki soruya “ışın izlemeli aydınlatma ve subsurface scattering içeren bir birinci şahıs nişancı” diye cevap verme hatasına da düşmemek gerekir.
      Zıplayan topun ilk sürümünün kodu gerçekten berbat olacak. Bu sorun değil. Zamanla nasıl optimize edip iyileştireceğinizi öğrenirsiniz. Ayrıca tasarım örüntülerini kendiniz keşfetmek kadar heyecan verici çok az şey var. Yeni bir konuda kitap okurken “aa, ben bunu zaten yapıyorum!” diye hissedersiniz.
    • Bu alana girmeye çalışan biri olarak buna katılmak biraz zor. Grafik programlama ilanlarının önemli bir kısmı, hatta belki hepsi, önceden C++ bilgisi istiyor.
      Elbette gameplay programcısı gibi başka bir rolle girip yavaş yavaş grafik tarafına geçebilirsiniz; bu daha kolay da olabilir. Ama sonunda grafik programcısı rolü için C++ gerekiyor.
      Yukarıda söylenenler daha çok grafikle ilgili işlerde hızlıca üretken olmak isteyen kişilere yakın; grafik programlamanın kendisi değil.
    • İyi tavsiye. “Hangi dili öğrenmeliyim / hangi dil en iyisi?” gibi sorularda da sık görülen bir tuzak; çünkü “ne yapmak istiyorum?” sorusu atlanıyor.
      Araçlar zamanla değişir ve deneyimime göre iyi mühendisler tek bir şeye derinlemesine saplanmaktansa birden çok aracı farklı yetkinlik seviyelerinde kullanabilen kişiler oluyor.
    • Sıralama algoritmaları gibi bu tür düşük seviyeli programlamanın üniversitede öğretilmesinin hâlâ değerli olduğunu düşünüyorum.
      Gerçek iş hayatında o işi yapmasanız bile çok fazla teorik bilgi ve karmaşık algoritma pratiği kazanabilirsiniz.
      Grafikler ayrıca bol miktarda uygulamalı matematik deneyimi de kazandırır. Matematik yapabilen insanı çaresizce arayan gerçekten çok alan var. Önceki işim olan CNC makine yazılımında da metal blokta belirli bir şekil oluşturmak için matkabı kontrol etmeye gereken matematiği programlayacak birine ihtiyaç vardı; bulmak gerçekten zordu. Buna karşılık bulut DevOps mühendisleri pahalı olsalar da nispeten kolay bulunabiliyordu.
  • Bir grafik programcısının, grafiklerin nasıl çalıştığına dair genel olarak dengeli bir anlayışa sahip olması gerektiğini düşünüyorum. Sıradan programlama ve API bilgisinin ötesinde, iyi bir grafik programcısı döndürme·görünüm·projeksiyon matrislerini, genel vektör matematiğini, shader programlamayı, Voronoi·SDF·Perlin gibi prosedürel temel öğeleri, görüntü birleştirmeyi, forward rendering ve deferred rendering’i, çeşitli örnekleme tekniklerini, gölge ve aydınlatma tekniklerini bilmelidir.
    Ayrıca sanat pipeline’ının nasıl işlediğini ve 3D uygulamalardan verinin nasıl çıkarıldığını, profiler ve debugger’ları rahat kullanmayı, SIGGRAPH makalelerini okuyabilmeyi, uzamsal bölümleme ve hacim hiyerarşisi tekniklerini, basit bir ray tracer uygulamayı, sprite·üçgen·n-gen gibi temel öğeleri anlamayı, parçacıklar ve simülasyon konusunda deneyim sahibi olmayı da gerektirir.

    • “Sanat pipeline’ının nasıl işlediği ve 3D uygulamalardan verinin nasıl çıkarıldığı” kısmını biraz daha açıp açamayacağınızı merak ediyorum.
      Bir modelin oluşturulmasının çok temel akışını, yani modelleme → skin/rigging → animasyon → texture oluşturma gibi süreci ve bunun dosyaya kabaca nasıl yazıldığını biliyorum. Ama bu kısım, sanatçılarla birlikte çalışmadan düzgün pratik deneyim edinmenin özellikle zor olduğu bir alan.
    • Bu listedekilerin çoğunu biliyorsanız grafik geliştiricisi olarak nasıl iş bulunabileceğini merak ediyorum.
      Hobi olarak grafik programlama yapıyorum ve burada söylenenlerin çoğunu öğrendim, ama iş deneyimim olmadığı için neredeyse hiç mülakat fırsatı gelmiyor.
    • Bunlar nereden öğrenilebilir?
  • Pikuma’nın Graphics From Scratch dersini öneriyorum. İlk yapılan iş, SDL kullanarak set_pixel fonksiyonunu yazmak; sonraki süreçte ise her şey doğrudan kodla uygulanıyor.
    Tüm matris işlemleri, tüm tepe noktası dönüşümleri ve tüm üçgen rasterleştirme elle yazılıyor; her pikselin hangi renkte olması gerektiği hesaplanıyor.
    https://pikuma.com/courses/learn-3d-computer-graphics-progra...

    • Benim web sitem/kitabım/dersim de aynı yaklaşımı ele alıyor ve ücretsiz.
      https://www.gabrielgambetta.com/computer-graphics-from-scrat...
    • Bu öneriye bir oy daha. Birkaç ay önce grafik programlama hakkında neredeyse hiçbir şey bilmezken bu dersi aldım; sadece birkaç yıllık genel yazılım mühendisi deneyimim vardı, buna rağmen 3B şekillerin ekrana çizilme sürecini oldukça iyi anlar hâle geldim.
      Sonrasında WebGPU’yu birkaç günde öğrenebildim; dersten edindiğim anlayış olmasaydı bunun mümkün olmayacağını düşünüyorum.
      Motivasyona ihtiyacınız varsa, dersin sonunda yapılan renderer’ı Wasm’a derleyerek bir demo hazırladım: https://rmshin.github.io/3d-renderer-wasm
    • İlginç bir nokta. Grafiklere giriş dersini kendim tasarlasam nasıl yapardım diye bir süredir düşünüyorum.
      90’lardaki gibi putpixel tarzı SDL koduyla mı başlamalı, yoksa Shadertoy ile mi? Temel matris matematiği elbette her zaman önemli. Peki üçgen rasterleştirme nasıl öğretilmeli? Scanline’dan geçmeden homojen koordinatlara ve quadtree’ye geçilebilir mi?
      Gerçekten Phong gölgelendirmeyi öğretmek gerekir mi, yoksa doğrudan BRDF’ye geçilebilir mi? Bazı kısımlar faydalı tekniklerden çok “eski usul hileleri” öğretmek olabilir.
      Günümüzde istatistik ve örnekleme çok daha önemli. Grafiklerin her yıl daha matematiksel hâle geldiğine inanıyorum. O yüzden matematik öğrenmek ve matematik öğretmek gerekiyor.
    • 3B render etmeyi sıfırdan uygulamak için birkaç iyi kaynak var.
      Bunların içinde şu GitHub deposunu gerçekten şiddetle öneririm: https://github.com/ssloy/tinyrenderer/wiki/Lesson-0:-getting...
      Görsel öğrenmeye yatkınsanız bu kanal da tam bir hazine: https://www.youtube.com/watch?v=ih20l3pJoeU
    • “GPU yok, OpenGL yok, DirectX yok!” grafik programlamayı öğrenmek isteyen birinin beklediği yönün tam tersi.
  • Shadertoy’da shader yazarak grafikler öğrenilebilir. Birçok grafik programcısı oradan başlıyor.
    Biraz öz tanıtım yapmam gerekirse, VS Code’da shader yazma, SDF, ray marching, gürültü fonksiyonları, fraktal Brown hareketi vb. konuları ele alan 10’dan fazla eğitim hazırladım.
    https://github.com/suboptimaleng/shader-tutorials
    Elbette Inigo Quilez, The Art of Code, SimonDev ve Acerola gibi devlerin omuzları üzerinde yükseliyor.

  • DX/VK/OGL ile başlamadan da grafik programcısı olmanın gerçekten birçok yolu var. C++ kullanmak şart da değil. 3Blue1Brown’ın Python ile yaptığı şaşırtıcı 3B grafiklere bakmak yeterli.
    Oyun motoru kullanmak istiyorsanız DirectX veya Vulkan öğrenin; tarayıcı uygulamaları yapmak istiyorsanız WebGL öğrenin.
    Ancak bu API’ler ağırdır ve tek başlarına grafikler hakkında çok şey öğretmezler. Grafik kavramlarını öğrenmek istiyorsanız, istediğiniz dilde hem kendi rasterleştiricinizi hem de kendi ray tracer’ınızı yapmanız iyi olur.
    Vulkan veya DirectX’i zorlayarak öğrenmeye çalışmaktan çok daha eğlenceli grafik kütüphaneleri ve kodlama ortamları da var. Processing harika; Python tabanlı PlotDevice.io veya onun öncülleri NodeBox ve DrawBot da görülmeye değer. ShaderToy, shader yazımı ve render etme konusunda çok şey öğrenebileceğiniz başka bir yer ve başlaması da kolay. JavaScript tarafında da pek çok seçenek ve kütüphane var. Bunlar yeni başlayanlar için çok daha erişilebilir ve motive edici; aynı zamanda meraklı bir öğrenenin istediği kadar derine inmesine imkân veren güç ve esnekliği de sunuyor.

  • Bu yazı ilk sayfaya çıktığına göre, grafik programlama sektöründe gerçekten kullanılan bir kaynağı paylaşayım. Not olarak, yazarlarından biriyim: https://raytracing.github.io/
    Yukarıdaki yazının “Useful Websites” bölümünde de yer alıyor.
    Grafikler artık o kadar geniş bir alan ki herkese uyan tek bir öğrenme yöntemi artık yok. Grafik öğrenmek istiyorsanız bir mentor bulmanızı öneririm.

    • Güzel bir kaynak. Özellikle API’den önce ray tracing üzerinden matematiği öğretme yaklaşımına kesinlikle katılıyorum.
  • Oyun geliştiricisiyim ama profesyonel bir grafik programcısı değilim. İşte modern grafik API’leri ve GLSL shader’ları kullanıyorum; ancak son zamanlarda 13 yaşındaki bir çocuk Scratch veya Python’dan C++ öğrenmek istemeye başlayınca, 1999’dan beri bilgisayarımda duran eski bir OpenGL 1.2 DLL’ini çıkarıp glut ve glbegin/glvertex/glend tarzı immediate mode koduyla başlatmanın en iyi yol olduğuna karar verdim.
    Modern API’lerin gerektirdiği onca ayara katlanmaktan çok daha eğlenceli. Çocuk Voronoi diyagramları gibi hesaplamalı geometri konularına daha çok ilgi duyuyor; bu yüzden grafik API’si sadece amaca giden bir araç ve gösterişli shader’lar ya da ışıklandırma şu an önemli değil. C++ ve eski OpenGL’in performansı Scratch’ten kabaca bin kat hızlı olduğu için mevcut öğrenme aşamasına uygun iyi bir nokta bulduğumuzu düşünüyorum.
    Basitleştirilmiş OpenGL 1.2 API’sini kullanırken bile C++ ve OpenGL’i aynı anda anlamaya çalışmak epey iddialı bir öğrenme yükü; sadelik bunu zihinsel olarak yönetilebilir kılıyor. Şimdilik iyi gidiyor; çocuk fena olmayan bir marching squares demosu yaptı ve ben de çalışma zamanında parametreleri ayarlayabileceğim bir IMgui menüsü eklemesine yardım ettim. Oldukça keyifliydi.

  • Bu web sitesinin tam olarak ne sorduğundan emin değilim. Rigging mi yapmak istiyor? Texture hazırlama mı? Modelleme mi? Sürücü yazma mı? GUI yapımı mı? Web sitesi animasyonu mu? Grafik araçları mı? Shader’lar mı? 2D fotoğraf motoru mu? 2D oyun mu? 3D oyun mu? Prosedürel script’ler mi? Grafik kodu optimizasyonu mu?
    “Bilgisayar grafikleri” altında yüzlerce alan var. Ama bu web sitesi bunların içindeki çok küçük bir köşeye, grafik SDK programlamasına odaklanıyor

    • Grafik programcısı oldukça iyi tanımlanmış bir programcı kategorisidir. Rigging, texture hazırlama, modelleme gibi yukarıda sayılanların önemli bir kısmı grafik programlama değildir
      Bir grafik programcısından oyun, 3D, 2D, araçlar, shader’lar ve optimizasyonun geneliyle ilgilenebilmesi beklenir
    • Kafa karıştırıcı olabilir, ama genelde “grafik programcısı” gerçek zamanlı ya da offline rendering olsun, grafik rendering motoru üzerinde çalışan kişiyi ifade eder
  • Ben de o yolculuğun üzerindeyim. 2 yıl önce çeşitli eğitimleri ve YouTube videolarını izleyerek ilk 3D motorumu yaptım
    Çok basit, ama basit şeyleri seviyorum. Şimdi bu motorla bir şehir kurma oyunu yapıyorum. Matrisler ve çapraz çarpım kullanarak öğeleri nasıl manipüle edeceğimi öğrenmek gerçekten eğlenceli
    https://www.youtube.com/watch?v=cvyrfPUpyp0