WinRT 2017, UNIX 2017, RTR 2018
दंडवत प्रणाम सर,
मी सरांचं पहिलं seminar केलं ते Unix Seminar. त्यानंतर सर्व seminars व Unix, Win32 SDK batches पूर्ण केल्या.
मग OpenGL seminar भाग १, भाग २, भाग ३ असे सगळेच पूर्ण केले. त्यात जे काही शिकले त्याच्या basis वर एक साधा Doraemon cartoon चा demo तयार केला.
सरांनी केलेले OpenGL चे demos पाहून असे चमत्कार code ने करता येतात हे उमझले आणि ते coding आपण शिकायचं हे ठरवलं.
त्याचा पुढे काय आणि कसा उपयोग होईल, so called scope काय असेल, या skillset मध्ये आपलयाला job मिळेल का , असे कोणतेही प्रश्न मनात आलेच नाहीत कारण code करून असे output screen वर पाहणे यातच खूप समाधान मिळणार होते.
मस्त शिकून coding करूयात ते पण across multiple platforms, असे भारी demos करून Hawa करायची, shining मारायची बस हेच लहानसं स्वप्न.
Class ला admission घेतली. Class आणि Job सोबतच सुरु झाले.
१ वर्ष होत आला OpenGL शिकत होते. Office मध्ये team ला माहित होते कि मी Graphics Programming करतीय ते पण इतके पैसे व वेळ invest करून. त्यांनी मला समजावलं कि तू याच क्षेत्रात काम मिळवण्याचा प्रयत्न कर. मनात सरांच वाक्य आठवलं,
“Don’t learn to earn, but try to earn from whatever you learn”.
आपल्या हातात प्रयत्न करणे असतं बाकी जे मिळायचा ते मिळेलच मग ठरलं तर Graphics programmer job साठी apply करायचे.
एक विशेष बात म्हणजे Resume मध्ये Education Section open करून त्यात आपलं Real Time Rendering at AstroMediComp add केलं होतं.
पहिलं तर Resume shortlist झाला त्या company चा फोन आला कि 5 Rounds होतील, म्हटलं ठीक आहे नसीब आजमाते है.
पहिला Round होता General aptitude ते solve करून दिले.
दुसरा Round होता Technical assignments, त्यात एक OpenGL आणि बाकी C++ असे code करून द्यायचे होते.
OpenGL assignment होती ती म्हणजे एक curve generation करायचे, त्या geometry ला extrude करायचे आणि त्याला texture लावायचे. आधी भीती वाटत होती कि जमेल कि नाही, पण code करायचाच, कमीतकमी त्यातून एक अनुभव येईल कसे प्रश्न सोडवायचे ते तरी कळेल म्हणून केले सुरु काम.
त्यांनी सांगितलेले कि C किंवा C++ based Graphics API म्हणजे OpenGL , DirectX इत्यादी वापरून code करू शकता आणि extrusion चे main logic स्वतः लिहायचे.
आधी तो curve काय आहे ते वाचलं विकिपीडिया वर, तिथे मग थोडं गणित समझून घेतले आणि code करायला सुरुवात केली. पहिला आठवला तो tessellation मध्ये केलेला आपला Bezier curve त्यालाच base code म्हणून घेतले. पुढील काम सुरु केले curve तर दिसत होता पण आता texture कसे लावायचे याचे प्रयत्न सुरु झाले थोडे अडथळे यायला लागले म्हणून तो बाजूला ठेवला आणि नवीन code करूयात using simple 2D Colored Shapes as a base code असे ठरवले यामध्ये algorithm लिहून, मग geometry extrusion, आणि मग त्याला texture लावून code पूर्ण केला. दुसऱ्या बाजूला cpp चे code पण पूर्ण केले आणि दुसरा round संपला.
भारी वाटत होते… मी code enjoy केला होता आता result काहीही आला तरी tension नव्हतं.
Result आला ते बोलले congragulations you have cleared second round.
पुढचा round होता technical question and answers
First question होता दुसऱ्या round मध्ये केलेला code कसा केला ?
आपण सरांचे विद्यार्थी, code मध्ये केलेली line आणि line समझलेली पाहिजे, तुमचा code तुम्हाला सांगायला plus शिकवायला हि जमला पाहिजे ?
Code template आपलाच असल्यामुळे मग काय घाबरायचं !!!
Geometry extrusion चे logic त्यांना समझावले. ते बोलता बोलता texcoords वर आम्ही आलो, मी extruded geometry draw करताना 3 curves वापरले होते, त्यात middle main curve, up curve and down curve असे बाकी 2 curves यांचे vertices घेऊन quads काढले. एक quad बनला होता 2 triangles ने एका triangle ला texcoords जसे देतो तसे इथेही दिले.
मग actual code open केला .cpp file त्यामध्ये घुसलो सर्वात पहिला प्रश्न असा कि data कसा पाठवला किंवा data वर operations कसे केलेत ?
मी सांगितले vertex array objects(vao) वापरून data कसा आपण vertex buffer objects मध्ये GL_ARRAY_BUFFER या target ला bind करतो . सरांनी शिकवलेला vao म्हणजे initialize मध्ये केलेले recorded cassette आणि तीच cassette draw मध्ये वाजवली कि drawing होणार मग vao नसेल तर आपल्याला त्या 4 lines glBindBuffer, glBufferData, glVertexAttribPointer and glEnableVertexAttribArray या draw मध्ये वारंवार लिहाव्या लागणार.
Data तर ठेवला vbos च्या आत, पण आता shaders आले त्यात attribute आणि uniform मध्ये काय फरक आहे असे विचारण्यात आले,
for an vertex it’s attribute can be position, color, texcoord, normal which changes per vertex but uniform remains same for all vertices in a every draw call, then how do we get this location? answer was using glBindAttribLocation for attributes and glGetUniformLocation for uniforms.
असाच code scroll होत असताना मधेच त्यांनी थांबवले glVertexAttribPointer काय आहे ? ……………………………
( खरंच हे प्रश्न उत्तर चालू असताना मागचे 1.5 वर्ष डोळ्यासमोर येत होते, कसली भीती नाही काहीही विचारा आमचाच code आहे आम्ही सांगू शकतो हा confidence जो आपल्याला सरांनी मिळवून दिलाय तोच मला पुढे नेत होता.
केलेल्या सर्व assignments आठवत होत्या,
” याजसाठी केला होता अट्टहास ।
शेवटचा दिस गोड व्हावा ।। ”
सतत क्रिया करत राहिलो त्याचं फळस्वरूप सर तुम्ही आम्हाला जी अभ्यासाची शिस्त लावलीत त्यासाठी तुमचे मनापासून खूप खूप आभार व्यक्त करते. )
चला …. glVertexAttribPointer is used to provide format of data which includes it’s type, glBindAttribLocation ने जे attribute location मिळवले ते द्यायचे , no of components for that attribute like for position 3 (x, y, z), त्यानंतर data वाचताना किती ढांगा टाकायच्या तो stride आणि कुठून start करायचं तो offset, तर normalized data आहे कि नाही अशी सर्व parameters द्यावे लागतात.
मला इतकं समझलं होतं कि interviewer check करतायेत कि code copy paste तर केला नाहीये ना
मनात आले कि, विचार बाबा विचार, जणू काय माझ्या मागच्या १ वर्षात मी काय केले त्याची परीक्षा चालू होती.
मग गेलो draw मध्ये draw arrays आणि draw elements वर चर्चा जमली तेव्हा सांगितले कि जिथे heavy models load केले जातात तिथे vertices नाही वापरायचे तर त्या vertices ला indices लावून ते model draw करायचे म्हणजेच memory wise उत्तम तर data repetition पण होत नाही.
मग आलं glUniformMatrix4fv, प्रश्न होता सगळे parameters explain करा, मी 3 बरोबर सांगितले आणि 4th मला on the spot नाही आठवला.
Uniform ची value shader ला पाठवण्यासाठी हे function वापरतात असे सांगितले, तर integer uniform ला value कशी पाठवणार असे विचारले त्यांनी, आपले उत्तर ready glUniform1i.
Normals म्हणजे काय? आपल्या diffuse light on cube या assignment मधे surface normals जे आपण वापरलेत ते कसे घेतलेत सांगितले.
OpenGL चा प्रवास संपला आणि C++ वर बरेच प्रश्न विचारले त्यांचीही उत्तरे दिली
थोडे logical problems code ने सोडविले.
हुश्य …. ! हा round १ तास २० मिनटात संपला.
या round मध्ये मझ्या आली, खूप आनंद होत होता. सगळ्या प्रश्नांची उत्तरे सरांचे lecture आणि assignments यांमध्येच मिळून गेले.
आता पुढचा round होता detail indepth technical
Resume मध्ये मी 3 personal projects mention केलेले, त्यातला एक म्हणजे shadowing special effect, interactive object वाला.
पहिला प्रश्न आला shadowing कसं केलंय ? उत्तर दिले LightSpaceMatrix वापरून प्रत्येक vertex ची z value that is depth हि LightSpaceMatrix मध्ये बसत नसेल तर त्याची shadow पडणार आणि त्याचा depthmap / texturemap तयार करायचा.
Then while drawing use 2 different shader program objects, One for generating shadow and another for regular drawing. For shadow map use framebuffer as drawing destination and for regular drawing use color buffer as drawing destination.
असं मला जितके समझले hote ते सर्व बोलले next question असा होता कि volume shadows काय असतात ? वाजली डोक्यात टणटण, मी अजून volume shadows केले नाहीये असं स्पष्ट मी त्यांना केले.
OpenGL Pipeline सरांनी आपल्याला शिकवली होती आता त्यावर प्रश्न सुरु झाले …
आलो pipeline वर , खालील pipeline explain केली vertex shader->tessellation control shader->tessellation evaluation shader->Geometry shader->Primitive Assembly->Clipping->Rasterisation->Fragment shader
आणि पुढचा शब्द भार उचलला तो rasterization ने rasterization म्हणजे काय तर सोप्या भाषेत 3D pyramid 2D screen वर कसा दाखवायचा.
Input for rasterization is updated primitives which have undergone clipping in previous stage and output of rasterization is collection of pixels called as fragment तर या पुढच्या stages मध्ये per fragment operations perform केले जातात. Vertex shader and fragment shader are compulsory, tessellation and geometry shaders are optional.
All of above shaders, process the data associated with each vertex. मग येते primitive assembly which assembles these vertices to make a geometric primitive from it.
आता विषय निघाला तो front and back buffers चा मला इतकं झटकन नाही आठवलं पण नुकतेच आपले iOS झालेले शिकून, त्यात आपल्याला front and back buffers, double buffering ची concept clear झालेली. तीच explain करायला घेतली एक buffer मध्ये आपण rendered image तयार ठेवतो आणि दुसरा buffer म्हणजे जो screen वर दाखवतो. म्हणून जर rendered image वाला buffer screen वर दाखवायचा असेल तर आपण buffers ला swap करतो.
Next question असा होता कि culling काय आहे मी त्यांना back face culling चं example घेऊन concept explain केली.
OpenGL चे प्रश्न विचारून झाले होते नंतर cpp चे प्रश्न विचारले आणि हा round आमचा जवळपास २० मिनटात संपला.
हा round ठीकठाक गेला काही प्रश्न जमले काही नाही जमले. पण एकूणच चांगला गेला.
१ दिवसातच त्यांचा मला फोन आला कि you have cleared all rounds आणि salary discussion चा एक शेवटचा round झाला.
As a fresher with 1 year hands – on experience in Graphics programming, त्यांनी मला Graphics Developer च्या Profile साठी select केलं.
हे सर्व कसे शक्य झाले ते मात्र एक कानमंत्र जो सरांनी आपल्याला दिलाय –
“ bhavabhyasanam abhyasah Silanam satatam kriya “
तुमचे आशीर्वाद आणि प्रेम आम्हाला असेच निरंतर लाभो हीच ईश्वरचरणी प्रार्थना.
– धन्यवाद सर
सरांना नमन करण्याचा हा छोटासा प्रयत्न आहे. माझे काही चुकले असेल तर कृपा करून क्षमा असावी.
तुमची कृतज्ञ विद्यार्थिनी,
निकिता राजिवडे