ग्राफिक्स प्रोग्रामर कैसे बनें
(gpuopen.com)- ग्राफिक्स की शुरुआत का कोई एक तय जवाब नहीं है; यह आपकी मौजूदा जानकारी, सीखने के तरीके और hardware पर निर्भर करता है, और AMD Game Engineering टीम का मानना है कि शुरुआती लोगों को अधिक अनुकूल शुरुआती बिंदु की आवश्यकता हो सकती है
- ग्राफिक्स प्रोग्रामिंग में CPU पक्ष का C++ code और GPU पक्ष का shader code साथ में लिखा जाता है, और इन्हें DirectX, Vulkan, OpenGL जैसे graphics API के जरिए जोड़ा जाता है
- 2023 के मानदंड पर मुख्य विकल्प दो हिस्सों में बंटते हैं: OpenGL, DirectX 11, WebGL जैसे legacy API और Vulkan, DirectX 12, Metal, WebGPU जैसे modern explicit API
- legacy API सीखने में आसान हैं, लेकिन driver और runtime की जटिलता बढ़ चुकी है; modern API अधिक code और GPU की समझ मांगते हैं, लेकिन बदले में अधिक नियंत्रण देते हैं
- शुरुआत में OpenGL, WebGL, game engine, या Shadertoy जैसे सरल माहौल से शुरू किया जा सकता है, और अगर C++ तथा GPU pipeline की समझ पर्याप्त हो तो सीधे Vulkan या DirectX 12 से भी शुरुआत की जा सकती है
ग्राफिक्स प्रोग्रामिंग की बुनियादी संरचना
- ग्राफिक्स प्रोग्रामर सबसे ज़्यादा जिस भाषा का उपयोग करते हैं, उसका छोटा सा जवाब है C++
- वास्तविक काम CPU पर चलने वाले host code और GPU पर चलने वाले shader code को साथ लिखने का होता है
- host CPU code आमतौर पर C++ में लिखा जाता है
- GPU code HLSL या GLSL जैसी high-level shading language में लिखा जाता है
- graphics API वह जुड़ाव बिंदु है जो CPU code को shader और आवश्यक data तथा metadata का उपयोग करके GPU से काम करवाने देता है
किस graphics API से शुरुआत करें
- 2023 के अनुसार PC game और 3D application में आमतौर पर उपयोग होने वाले API मोटे तौर पर दो श्रेणियों में बंटते हैं
- legacy API: OpenGL, DirectX 11, WebGL
- modern explicit API: Vulkan, DirectX 12, Metal, WebGPU
- OpenGL, DirectX 11, और WebGL, GPU को प्रोग्राम करने के ऐतिहासिक तरीके पर आधारित हैं, और programmer के नज़रिए से अधिक सरल होने के कारण इन्हें सीखना आसान है
- लेकिन इस सरलता की एक कीमत है
- समय के साथ driver और runtime के अंदरूनी implementation जटिल होते गए हैं
- इससे host-side bottleneck और GPU vendor पर जटिल driver लिखने का बोझ बढ़ता है
- AMD का Mantle 2013 से 2016 के बीच PC पर सामने आया, और AMD GPU तथा EA DICE के साथ सहयोग के जरिए इसने GPU तक अधिक low-level access और पतली abstraction दी
- Metal 2014 में Apple platform पर आया, जबकि DirectX 12 और Vulkan 2016 में आए और इन्होंने GPU programming को अधिक low-level और explicit तरीके से संभाला
आसान API और explicit API के बीच learning trade-off
- Vulkan और DirectX 12 में programmer को GPU से करवाए जाने वाले काम को अधिक स्पष्ट रूप से बताना पड़ता है, इसलिए शुरुआत में इनका बोझ ज़्यादा होता है
- लेकिन इसके बदले में अधिक नियंत्रण मिलता है, और GPU काम के performance और efficiency को बेहतर करने के अवसर भी बढ़ते हैं
- सिर्फ पहला triangle draw करने वाले उदाहरण से भी API के बीच अंतर साफ दिखता है
- OpenGL या DirectX 11 में लगभग 10 lines में पहला triangle draw किया जा सकता है
- Vulkan और DirectX 12 में इसके मुकाबले काफी अधिक code चाहिए होता है
- OpenGL और DirectX 11 बहुत सी बारीकियों को छिपा देते हैं, जिससे productive graphics work तक जल्दी पहुँचना आसान होता है, लेकिन GPU का व्यवहार magic box जैसा लग सकता है
- Vulkan और DirectX 12 शुरुआत से ही low-level knowledge और GPU की समझ मांगते हैं, लेकिन बदले में code की हर पंक्ति GPU पर होने वाली प्रक्रिया को अधिक स्पष्ट दिखाती है
शुरुआत के रास्तों के विकल्प
- AMD Game Engineering टीम के भीतर भी यह राय मौजूद है कि DX12 या Vulkan से किशोरों या बिल्कुल शुरुआती लोगों के लिए शुरुआत करना कठिन हो सकता है, जबकि कुछ का मानना है कि सही परिस्थितियों में यह संभव है
- OpenGL की आधुनिकता और प्रासंगिकता कम हुई है, लेकिन बुनियादी समझ बनाने के लिए इसे अब भी पर्याप्त माना जाता है
- WebGL ग्राफिक्स pipeline को समझने के लिए एक आसान शुरुआती बिंदु हो सकता है
- वेब पर C++ के बिना JavaScript से real-time graphics संभाले जा सकते हैं
- WebAssembly का उपयोग करके browser में C++ से graphics चलाना भी संभव है
- WebGPU modern graphics API के अधिक करीब की अवधारणाएँ देता है, जबकि low-level details की मांग कुछ कम हो सकती है
- जटिल code लिखना शुरू करते ही अभी भी कई समस्याएँ सामने आ सकती हैं
- फिर भी prototyping, learning और education के लिए यह एक promising API है
- पहले game engine से शुरुआत करने का रास्ता भी संभव है
- Unreal Engine का PC game में बड़ा हिस्सा है
- Unity भी एक सामान्य विकल्प है
- Godot जैसे छोटे और सरल open source engine भी मौजूद हैं
- कुछ स्कूल Unity से पहला rendering course कराते हैं, लेकिन इसमें यह जोखिम है कि छात्र यह न समझ पाएँ कि low-level knowledge क्यों ज़रूरी है
- अगर explicit API से शुरुआत करनी है, तो modern graphics pipeline और उसे लागू करने वाले GPU hardware की बड़ी तस्वीर की अच्छी समझ होनी चाहिए, या फिर उसे साथ-साथ सीखने की इच्छा होनी चाहिए
सुझाए गए learning resources और अगले कदम
- LearnOpenGL: C++ में वास्तविक API के साथ graphics programming सीखने के लिए अच्छा beginner-friendly site
- Scratchapixel: बहुत अधिक code के बिना ray tracing जैसी अवधारणाएँ कैसे काम करती हैं, इस पर ध्यान केंद्रित करने में मदद करता है
- Udemy: शुरुआती लोगों के लिए course खोजने की जगह के रूप में उपयोगी
- Rastertek: OpenGL और DirectX 11 tutorial
- Ray Tracing in One Weekend: अगर आपको कुछ coding आती है, तो खुद बनाते हुए सीखने के लिए उपयुक्त तरीका
- A trip through the graphics pipeline: 2011 का लेख है, इसलिए explicit API से पहले का material है, लेकिन GPU दृष्टिकोण से hardware और software की अवधारणाएँ अब भी लागू होती हैं
- learn wgpu: LearnOpenGL जैसी शैली का WebGPU learning site, जो अभी भी work in progress है
- Your first WebGPU app: WebGPU की शुरुआत के लिए उपयोगी सामग्री
- Shadertoy: graphics API को सीधे संभाले बिना shader लिखे जा सकते हैं, इसलिए यह एक और सरल शुरुआती बिंदु बनता है
- Vulkan Tutorial: Vulkan या DirectX 12 सीखते समय copy-paste से डरना नहीं चाहिए, इस संदर्भ में भी उल्लेखित
- अगर आपने अभी तक भाषा या API ecosystem तय नहीं किया है, तो अलग-अलग तरीके आज़माकर जो तरीका आपके लिए सबसे उपयुक्त लगे, उसी पर आगे बढ़ सकते हैं
1 टिप्पणियां
Hacker News की राय
शुरुआती लोगों के लिए बेहतर है कि वे “कौन-सा tool इस्तेमाल करूं” से शुरू करने के बजाय एक कदम पीछे हटकर पहले पूछें, “मैं बनाना क्या चाहता/चाहती हूं”
सीखने की शुरुआत में भी अंतिम output को नज़रअंदाज़ नहीं करना चाहिए। आजकल computer graphics में स्क्रीन पर pixels बनाने के कई steps को abstract करने वाले tools बहुत ज़्यादा हैं, इसलिए हो सकता है कि आप शुरुआत से low-level code में जूझते रहें और बाद में समझ आए कि जिस field में आप जाना चाहते हैं, वहां Unity, TouchDesigner, threejs, After Effects ही इस्तेमाल होते हैं और C++ लगभग नहीं होता
बेशक नीचे से चीज़ें कैसे काम करती हैं, यह सीखना बेहद valuable है, लेकिन मुझे लगता है कि इसे सबसे पहले करना धीमा approach है। industry में आने के बाद, game engine या visual programming जैसे abstraction tools के जरिए अंदरूनी कामकाज की समझ बनाते समय learning तेज़ होती है
यह बात मैं इस नज़रिए से कह रहा/रही हूं कि मैंने C++ और OpenGL को मुश्किल तरीके से सीखने में कई साल लगाए, और no-code approach स्वीकार न कर पाने वाले sunk cost से लंबे समय तक जूझता/जूझती रहा/रही। आखिरकार अगर यह रास्ता वह चीज़ बनाने में मदद नहीं करता जिसे आप बनाना चाहते हैं, तो इस पर समय बर्बाद न करना बेहतर है
Mark Kilgard की तरह textbook तो नहीं लिखी, लेकिन driver level से लेकर conformance testing, performance tuning, game और application code, बड़े desktop और mobile platforms तक API की कई layers को गहराई से संभाला
लेकिन यह मुझे कहां ले गया? सच कहें तो बहुत दूर नहीं। अब OpenGL की परवाह करने वाली जगहें बहुत कम हैं, और दो बड़े OS vendors ने आखिरकार इसे छोड़ दिया, जिससे यह लगभग dead technology बन गई है। “HN Who's Hiring” में OpenGL search करके देख सकते हैं
Direct3D, Vulkan, Metal जैसी दूसरी graphics APIs फिर से सीखी जा सकती थीं, लेकिन low-level graphics code अब engines abstract कर देते हैं, इसलिए ऐसे लोगों की ज़रूरत बहुत जगहों पर नहीं है। low-level graphics driver talent की ज़रूरत वाली कंपनियां भी दुनिया भर में ज़्यादा से ज़्यादा 5–6 होंगी, इसलिए यह career को सीमित करने वाला niche बन जाता है
आप machine के जितने छोटे हिस्से पर focus करेंगे, उसे पूरा career बनाने के लिए आपको world-class expert होना पड़ेगा। अगर आपका plan अगला John Carmack बनने का नहीं है, तो बहुत गहराई में जाने के बजाय breadth चुनने की सलाह दूंगा/दूंगी
YouTube पर beginner programming videos की भरमार है जो कुछ interesting बनाने पर focus कराने के बजाय आपको technology stack की लंबी list सिखाते रहते हैं। नतीजा यह होता है कि resume भरने के लिए एक webpage पर text की कुछ lines render करने तक के लिए लोग cargo-cult तरीके से जटिल Rube Goldberg मशीन बना देते हैं
college में एक semester तक मैंने graphics programming थोड़ी-बहुत की थी, और वह इतनी complex थी कि “मैं क्या बनाना चाहता/चाहती हूं” का reasonable जवाब बस “काली background पर हरा triangle render करना” जैसा था। वहां से rectangle, cube, sphere, animated sphere, bouncing ball तक जाना natural progression है और आपको goal पर focused रखता है। इसलिए ऊपर वाले सवाल का जवाब “ray-traced lighting और subsurface scattering वाला first-person shooter” देने की गलती भी नहीं करनी चाहिए
bouncing ball के पहले version का code वाकई भयानक होगा। फिर भी ठीक है। समय के साथ आप optimize और improve करना सीख जाएंगे। और design patterns को खुद discover करने जितना रोमांचक कुछ नहीं। किसी नए topic की किताब पढ़ते हुए आपको लगेगा, “अरे, यह तो मैं पहले से कर रहा/रही हूं!”
बेशक gameplay programmer जैसे किसी दूसरे role से entry लेकर धीरे-धीरे graphics में shift किया जा सकता है, और यह शायद आसान भी हो। लेकिन अंततः graphics programmer role के लिए C++ ज़रूरी है
ऊपर कही गई बात उन लोगों के लिए ज़्यादा सही है जो graphics-related काम में जल्दी productive होना चाहते हैं, न कि graphics programming itself के लिए
tools समय के साथ बदलते हैं, और मेरे experience में बेहतरीन engineers अक्सर सिर्फ एक tool में बहुत गहराई तक जाने के बजाय कई tools को अलग-अलग proficiency levels पर इस्तेमाल करना जानते हैं
भले ही असली job में आपको वह काम न करना पड़े, इससे बहुत सारी theoretical knowledge और complex algorithms की training मिलती है
graphics applied math का भी काफी experience देता है। ऐसे बहुत से fields हैं जिन्हें math कर सकने वाले लोगों की सख्त तलाश रहती है। मेरी पिछली job CNC machine software में थी, वहां metal block पर खास shape बनाने के लिए drill control करने में ज़रूरी math को program करने वाला व्यक्ति चाहिए था, और उसे ढूंढना सच में बहुत मुश्किल था। वहीं cloud DevOps engineer महंगे ज़रूर थे, लेकिन comparatively आसानी से मिल जाते थे
मुझे लगता है कि graphics programmer के पास graphics कैसे काम करता है, इसकी कुल मिलाकर balanced understanding होनी चाहिए। सिर्फ programming और API knowledge से आगे, अच्छे graphics programmer को rotation, view और projection matrices, general vector math, shader programming, Voronoi, SDF, Perlin जैसे procedural primitives, image compositing, forward rendering और deferred rendering, अलग-अलग sampling techniques, shadows और lighting techniques जाननी चाहिए
साथ ही यह भी ज़रूरी है कि art pipeline कैसे काम करती है और 3D apps से data कैसे निकाला जाता है, profilers और debuggers को आराम से इस्तेमाल करना, SIGGRAPH papers पढ़ने की क्षमता, spatial partitioning और volume hierarchy techniques, simple ray tracer implement करना, sprites, triangles, n-gons जैसे primitives की समझ, और particles व simulation का experience भी हो
मुझे model बनने का बेहद basic flow पता है, यानी modeling → skin/rigging → animation → texturing, और इसे file में लिखने का मोटा-मोटा तरीका भी। लेकिन यह हिस्सा ऐसा है जहां artists के साथ काम किए बिना proper hands-on experience पाना खास तौर पर मुश्किल है
मैं hobby के तौर पर graphics programming करता/करती हूं और यहां बताई गई कई चीज़ें सीख चुका/चुकी हूं, लेकिन job experience नहीं होने की वजह से interview chances बहुत कम आते हैं
Pikuma के Graphics From Scratch कोर्स की सिफारिश की गई है। इसमें पहला काम SDL का इस्तेमाल करके
set_pixelफ़ंक्शन लिखना है, और उसके बाद पूरी प्रक्रिया खुद कोड से लागू की जाती हैसभी matrix operations, हर vertex transformation, और हर triangle rasterization तक खुद लिखते हैं और यह calculate करते हैं कि हर pixel का रंग क्या होना चाहिए
https://pikuma.com/courses/learn-3d-computer-graphics-progra...
https://www.gabrielgambetta.com/computer-graphics-from-scrat...
इसके बाद मैं कुछ ही दिनों में WebGPU सीख सका; कोर्स से मिली समझ के बिना यह शायद असंभव होता
अगर motivation चाहिए, तो कोर्स के अंत में बनने वाले renderer को Wasm में compile करके मैंने एक demo बनाया है: https://rmshin.github.io/3d-renderer-wasm
क्या 90s की तरह
putpixelstyle वाले SDL code से शुरू करना चाहिए, या Shadertoy से? बुनियादी matrix math तो बेशक हमेशा जरूरी है। लेकिन triangle rasterization कैसे सिखाएँ? क्या scanline से गुजरे बिना homogeneous coordinates और quadtree पर जा सकते हैं?क्या सच में Phong shading सिखानी चाहिए, या सीधे BRDF पर जा सकते हैं? कुछ हिस्से useful techniques से ज्यादा “पुरानी tricks” सिखाने जैसे हो सकते हैं
आजकल statistics और sampling कहीं ज्यादा महत्वपूर्ण हैं। मेरा मानना है कि graphics हर साल और ज्यादा mathematical होता जा रहा है। इसलिए math सीखनी चाहिए, और math सिखानी चाहिए
उनमें यह GitHub repository मैं बहुत strongly recommend करता हूँ: https://github.com/ssloy/tinyrenderer/wiki/Lesson-0:-getting...
अगर आप visual तरीके से सीखते हैं, तो यह channel भी एक खजाना है: https://www.youtube.com/watch?v=ih20l3pJoeU
Shadertoy पर shader writing के जरिए graphics सीखी जा सकती है। कई graphics programmers वहीं से शुरू करते हैं
थोड़ा self-promotion करूँ तो, मैंने VS Code में shader writing, SDF, ray marching, noise functions, fractal Brownian motion आदि पर 10 से ज्यादा tutorials बनाए हैं
https://github.com/suboptimaleng/shader-tutorials
बेशक, यह Inigo Quilez, The Art of Code, SimonDev, Acerola जैसे दिग्गजों के कंधों पर खड़े होकर किया गया है
DX/VK/OGL से शुरू किए बिना भी graphics programmer बनने के सच में कई रास्ते हैं। C++ का इस्तेमाल जरूरी नहीं है। 3Blue1Brown को Python में कमाल की 3D graphics करते हुए देख लीजिए
अगर game engine इस्तेमाल करना है तो DirectX या Vulkan सीखें, और browser applications बनानी हैं तो WebGL सीखें
लेकिन ऐसे APIs भारी होते हैं, और अपने-आप में graphics के बारे में बहुत कुछ नहीं सिखाते। अगर graphics concepts सीखना चाहते हैं, तो अपनी पसंद की language में खुद rasterizer और ray tracer दोनों बनाना अच्छा रहेगा
Vulkan या DirectX को मुश्किल से खोदने की तुलना में कहीं ज्यादा मजेदार graphics libraries और coding environments भी हैं। Processing शानदार है, और Python-based PlotDevice.io या उसके पूर्ववर्ती NodeBox, DrawBot भी देखने लायक हैं। ShaderToy shader writing या rendering के बारे में बहुत कुछ सीखने की एक और जगह है और शुरू करना भी आसान है। JavaScript में भी बहुत सारे विकल्प और libraries हैं। ये चीजें beginners के लिए कहीं ज्यादा approachable और motivating हैं, फिर भी curious learners को जितनी गहराई में जाना हो, उतनी power और flexibility देती हैं
चूँकि यह पोस्ट front page पर आ गई है, मैं graphics programming industry में सच में इस्तेमाल होने वाला resource साझा कर रहा हूँ। संदर्भ के लिए, मैं इसके authors में से एक हूँ: https://raytracing.github.io/
यह ऊपर वाले लेख के “Useful Websites” में भी शामिल है
graphics अब इतना व्यापक हो चुका है कि सबके लिए एक ही learning method अब मौजूद नहीं है। अगर आप graphics सीखना चाहते हैं, तो मैं mentor खोजने की सलाह दूँगा
मैं game developer हूँ, लेकिन professional graphics programmer नहीं। काम में modern graphics APIs और GLSL shaders इस्तेमाल करता हूँ, लेकिन हाल ही में जब 13 साल का बच्चा Scratch या Python से C++ सीखना चाहता था, तो मुझे लगा कि 1999 से मेरे computer में पड़ा पुराना OpenGL 1.2 DLL निकालकर
glutऔरglbegin/glvertex/glendवाले immediate mode code से शुरू करवाना सबसे अच्छा रहेगाmodern APIs के लिए जरूरी तरह-तरह के setup को झेलने से यह कहीं ज्यादा मजेदार है। बच्चे की दिलचस्पी Voronoi diagrams जैसी computational geometry में ज्यादा है, इसलिए graphics API सिर्फ लक्ष्य तक पहुँचने का साधन है, और fancy shaders या lighting अभी महत्वपूर्ण नहीं हैं। C++ और पुराने OpenGL की performance Scratch से लगभग हज़ार गुना तेज है, इसलिए लगता है कि मौजूदा learning stage के लिए हमने अच्छा संतुलन पा लिया है
simplified OpenGL 1.2 API इस्तेमाल करने पर भी C++ और OpenGL को साथ-साथ समझने की कोशिश काफी ambitious learning load है, इसलिए simplicity इसे mentally manageable बनाती है। अभी सब अच्छा चल रहा है; बच्चे ने एक ठीक-ठाक marching squares demo बनाया है, और मैंने runtime पर parameters adjust करने के लिए IMgui menu जोड़ने में मदद की। काफी मजा आया
मुझे ठीक-ठीक समझ नहीं आ रहा कि यह वेबसाइट पूछ क्या रही है। क्या आप rigging करना चाहते हैं? texturing? modeling? driver लिखना? GUI बनाना? website animation? graphics tools? shaders? 2D photo engine? 2D game? 3D game? procedural scripts? graphics code optimization?
“computer graphics” के तहत सैकड़ों क्षेत्र आते हैं। लेकिन यह वेबसाइट उनमें से एक बहुत छोटे कोने, यानी graphics SDK programming पर केंद्रित है
graphics programmer से उम्मीद की जाती है कि वह games, 3D, 2D, tools, shaders और optimization को व्यापक रूप से संभाल सके
मैं भी उसी सफर पर हूँ। 2 साल पहले मैंने कई tutorials और YouTube videos follow करके अपना पहला 3D engine बनाया था
यह बहुत simple है, लेकिन मुझे simple चीज़ें पसंद हैं। अभी मैं इसी engine से एक city-building game बना रहा हूँ। matrices और cross product का इस्तेमाल करके elements को manipulate करना सीखना वाकई मज़ेदार है
https://www.youtube.com/watch?v=cvyrfPUpyp0