opengl मध्ये प्रकाश स्रोत पॉइंट करा. आम्ही आमचा OpenGL चा अभ्यास सुरू ठेवतो: Phong नुसार प्रकाशयोजना. हे सर्व एकत्र ठेवणे

OpenGL ES मधील प्रकाशयोजना हे एक उपयुक्त वैशिष्ट्य आहे जे 3D गेममध्ये छान स्पर्श जोडू शकते. अशा प्रकारची कार्यक्षमता वापरण्यासाठी, आम्हाला प्रथम OpenGL ES लाइटिंग मॉडेल समजून घेणे आवश्यक आहे.

प्रकाश कसे कार्य करते

लाइटिंग कसे कार्य करते याचा विचार करूया. प्रथम आपल्याला प्रकाश उत्सर्जित करणारा प्रकाश स्रोत आवश्यक आहे. आपल्याला एका प्रकाशित वस्तूची देखील आवश्यकता असेल. शेवटी, आपल्याला डोळ्या किंवा कॅमेरा सारख्या सेन्सरची देखील आवश्यकता असते, जो प्रकाश स्रोताद्वारे पाठवलेले आणि ऑब्जेक्टद्वारे परावर्तित केलेले फोटॉन प्राप्त करतो. प्रकाशामुळे एखाद्या वस्तूचा समजलेला रंग यावर अवलंबून बदलतो: प्रकाश स्रोताचा प्रकार; प्रकाश स्रोताचा रंग किंवा तीव्रता; प्रकाश स्रोताची स्थिती आणि प्रकाशित वस्तूशी संबंधित त्याची दिशा; ऑब्जेक्ट सामग्री आणि पोत.

एखाद्या वस्तूद्वारे प्रकाश परावर्तित होण्याची तीव्रता अनेक घटकांवर अवलंबून असते. प्रकाश किरण ज्या कोनात पृष्ठभागावर आदळतो तो सर्वात महत्त्वाचा घटक आपण पाहतो. हा कोन उजव्या कोनाच्या जितका जवळ असेल तितकी जास्त तीव्रता ऑब्जेक्टमधून प्रकाश परावर्तित होईल. हे अंजीर मध्ये स्पष्ट केले आहे. 11.1.

एकदा प्रकाश किरण पृष्ठभागावर आदळला की ते दोन वेगवेगळ्या दिशांनी परावर्तित होईल. बहुतेक प्रकाश विसर्गाने परावर्तित होईल. याचा अर्थ असा की परावर्तित प्रकाश किरण वस्तुच्या पृष्ठभागावर असमान आणि यादृच्छिकपणे विखुरलेले असतात. काही किरण स्पेक्युलरपणे परावर्तित होतात. याचा अर्थ असा की प्रकाश किरणे परत परावर्तित होतील जणू ते एखाद्या परिपूर्ण आरशाला मारत आहेत. अंजीर मध्ये. आकृती 11.2 डिफ्यूज आणि स्पेक्युलर रिफ्लेक्शनमधील फरक दर्शवते.

तांदूळ. 11.1. कोन काटकोनाच्या जितका जवळ असेल तितकी परावर्तित प्रकाशाची तीव्रता जास्त असेल

तांदूळ. 11.2. विखुरलेले आणि स्पेक्युलर प्रतिबिंब

स्पेक्युलर रिफ्लेक्शन ऑब्जेक्ट्सवर हायलाइट्स म्हणून दिसतील. प्रकाश एखाद्या वस्तूवरून स्पेक्युलरपणे परावर्तित होतो की नाही हे ज्या सामग्रीपासून बनवले जाते त्यावर अवलंबून असते. त्वचेसारख्या असमान किंवा खडबडीत पृष्ठभाग असलेल्या वस्तूंमध्ये बहुधा स्पेक्युलर हायलाइट नसतील. काच किंवा संगमरवरीसारख्या गुळगुळीत पृष्ठभाग असलेल्या वस्तू या हलक्या कलाकृतींचे प्रदर्शन करतील. अर्थात, काच किंवा संगमरवरी पूर्णपणे गुळगुळीत नसतात, परंतु लाकूड किंवा मानवी त्वचेच्या तुलनेत ते आहेत.

जेव्हा प्रकाश पृष्ठभागावर आदळतो, तेव्हा त्याचे प्रतिबिंब देखील रंगानुसार बदलते रासायनिक रचनाप्रकाशित वस्तू. आम्हाला लाल दिसणार्‍या वस्तू प्रकाशाचे फक्त लाल भाग प्रतिबिंबित करतात आणि इतर सर्व फ्रिक्वेन्सी शोषून घेतात. काळी वस्तू म्हणजे त्यावर पडणारा जवळजवळ सर्व प्रकाश शोषून घेणारी वस्तू.

OpenGL ES तुम्हाला प्रकाश स्रोत आणि ऑब्जेक्ट मटेरियल परिभाषित करून वास्तविक-जगातील वर्तनाचे अनुकरण करण्यास अनुमती देते.

प्रकाश स्रोत

आपण अनेक वेगवेगळ्या प्रकाश स्रोतांनी वेढलेले आहोत. सूर्य सतत त्याचे फोटॉन पाठवत असतो. मॉनिटर्स प्रकाश उत्सर्जित करतात जो रात्रीच्या वेळी आनंददायी चमकाने आपल्याभोवती असतो. लाइट बल्ब आणि हेडलाइट्स आपल्याला अंधारात विविध वस्तूंशी टक्कर टाळण्यास मदत करतात. OpenGL ES तुम्हाला चार प्रकारचे प्रकाश स्रोत तयार करण्यास अनुमती देते.

बॅकलाइट. हा स्वतःच प्रकाशाचा स्त्रोत नाही, परंतु इतर प्रकाश स्रोतांमधून फोटॉन दिसण्याचा परिणाम आहे. एकत्रितपणे, हे यादृच्छिक फोटॉन एक स्थिर पातळीचे प्रकाश तयार करतात ज्याला दिशा नसते आणि सर्व वस्तू समान रीतीने प्रकाशित करतात.

पॉइंट प्रकाश स्रोत. त्यांना अंतराळात स्थान आहे आणि ते सर्व दिशांना प्रकाश उत्सर्जित करतात. उदाहरणार्थ, प्रकाशाचा बिंदू स्त्रोत म्हणजे लाइट बल्ब.

दिशात्मक प्रकाश स्रोत. OpenGL ES मध्ये दिशानिर्देश म्हणून व्यक्त केले आहे. ते असीम दूर आहेत असे गृहीत धरले जाते. तद्वतच, सूर्य असा स्रोत असू शकतो. पृथ्वी आणि सूर्य यांच्यातील अंतरामुळे सूर्यापासून येणारे सर्व प्रकाशकिरण एकाच कोनात पृथ्वीवर आदळतात असे आपण गृहीत धरू शकतो.

दिवे बद्दल. हे दिवे पॉइंट लाइट्ससारखे असतात कारण त्यांना स्पेसमध्ये दिलेले स्थान असते. याव्यतिरिक्त, त्यांच्याकडे एक दिशा आहे ज्यामध्ये ते प्रकाश किरण उत्सर्जित करतात. ते एका विशिष्ट त्रिज्यापर्यंत मर्यादित प्रकाश शंकू तयार करतात. अशा प्रकाश स्रोताचे उदाहरण म्हणजे पथदिवा.

आम्ही फक्त बॅकलाइटिंग, तसेच बिंदू आणि दिशात्मक प्रकाश स्रोतांचा विचार करू. OpenGL ES ज्या प्रकारे लाइटिंगची गणना करते त्यामुळे GPU-मर्यादित Android डिव्हाइसेसवर दिवे वापरणे कठीण असते. हे असे का आहे हे तुम्हाला लवकरच समजेल.

प्रकाश स्रोताची स्थिती आणि दिशा व्यतिरिक्त, OpenGL ES तुम्हाला प्रकाशाचा रंग किंवा तीव्रता निर्धारित करण्यास अनुमती देते. ही वैशिष्ट्ये आरजीबीए रंग वापरून व्यक्त केली जातात. तथापि, OpenGL ES साठी तुम्हाला फक्त एका ऐवजी चार भिन्न रंग प्रति स्रोत परिभाषित करणे आवश्यक आहे.

हायलाइट - तीव्रता/रंग जी ऑब्जेक्टच्या छायांकनात योगदान देते. ऑब्जेक्ट सर्व बाजूंनी समान रीतीने प्रकाशित होईल, प्रकाश स्त्रोताशी संबंधित तिचे स्थान किंवा अभिमुखता विचारात न घेता.

डिफ्यूज - प्रकाशाची तीव्रता/रंग जो डिफ्यूज रिफ्लेक्शनची गणना केल्यानंतर ऑब्जेक्ट प्रकाशित करेल. वास्तविक जीवनाप्रमाणेच प्रकाशझोताकडे तोंड नसलेल्या वस्तूच्या कडा प्रकाशित होणार नाहीत.

स्पेक्युलर - डिफ्यूज कलर प्रमाणेच तीव्रता/रंग. तथापि, हे केवळ ऑब्जेक्टच्या त्या बिंदूंना प्रभावित करते ज्यांचे प्रकाश स्रोत आणि सेन्सरच्या संबंधात विशिष्ट अभिमुखता असते.

एमिसिव्ह ही एक अतिशय जटिल रंग गणना आहे ज्याचा वास्तविक जगातील भौतिकशास्त्र अनुप्रयोगांमध्ये अत्यंत मर्यादित वापर आहे, म्हणून आम्ही ते कव्हर करणार नाही.

बर्‍याचदा आपण प्रकाश स्रोताची डिफ्यूज आणि स्पेक्युलर तीव्रता वापरू आणि इतर दोन डीफॉल्ट मूल्ये देऊ. तसेच, बर्‍याच वेळा आम्ही डिफ्यूज आणि स्पेक्युलर तीव्रतेसाठी समान RGBA रंग वापरू.

साहित्य

आपल्या जगातील सर्व वस्तूंमध्ये कोणत्या ना कोणत्या साहित्याचा समावेश असतो. वस्तूवर पडणारा प्रकाश कसा परावर्तित होईल आणि परावर्तित प्रकाशाचा रंग कसा बदलेल हे प्रत्येक साहित्य ठरवते. OpenGL ES तुम्हाला प्रकाश स्रोताप्रमाणेच सामग्रीसाठी समान चार RGBA रंग परिभाषित करण्याची परवानगी देतो.

बॅकलाइट हा एक रंग आहे जो दृश्यातील कोणत्याही प्रकाश स्रोताच्या पार्श्वभूमीच्या रंगासह एकत्रित होतो.

डिफ्यूज हा रंग आहे जो कोणत्याही प्रकाश स्रोताच्या डिफ्यूज रंगाशी जोडतो.

स्पेक्युलर हा एक रंग आहे जो कोणत्याही प्रकाश स्रोताच्या स्पेक्युलर रंगाशी जोडतो. हे ऑब्जेक्टच्या पृष्ठभागावर हायलाइट्स तयार करण्यासाठी वापरले जाते.

उत्सर्जित - आम्ही या प्रकारच्या रंगाकडे दुर्लक्ष करत आहोत, कारण ते आमच्या संदर्भात व्यावहारिकपणे वापरले जात नाही.

आकृती 11.3 पहिले तीन प्रकारचे साहित्य/प्रकाश स्रोत गुणधर्म स्पष्ट करते: बॅकलाइट, डिफ्यूज आणि स्पेक्युलर.

तांदूळ. 11.3. विविध प्रकारचे साहित्य/प्रकाश स्रोत: केवळ बॅकलाइट (डावीकडे), केवळ डिफ्यूज (मध्यम), बॅकलाइट आणि स्पेक्युलर हायलाइट्ससह डिफ्यूज रंग (उजवीकडे)

अंजीर मध्ये. आकृती 11.3 रंगावरील सामग्री आणि प्रकाश स्रोतांच्या विविध गुणधर्मांचा प्रभाव दर्शविते. बॅकलाइट आकारास समान रीतीने प्रकाशित करतो. प्रकाशकिरण ऑब्जेक्टवर कोणत्या कोनावर आदळतात त्यानुसार विखुरलेला प्रकाश परावर्तित होईल; प्रकाश स्रोताकडे थेट तोंड असलेले क्षेत्र अधिक उजळ होईल, ज्या भागात प्रकाश पोहोचू शकत नाही ते गडद असतील. उजव्या प्रतिमेमध्ये तुम्ही बॅकलाइट, डिफ्यूज आणि स्पेक्युलर प्रकाशाचे संयोजन पाहू शकता. स्पेक्युलर प्रकाश गोलावर पांढरा हायलाइट्स म्हणून दिसतो.

OpenGL ES लाइटिंगची गणना कशी करते: व्हर्टेक्स नॉर्मल

तुम्हाला माहिती आहे की, एखाद्या वस्तूतून परावर्तित होणाऱ्या प्रकाशाची तीव्रता ही वस्तूवरील घटनांच्या कोनावर अवलंबून असते. OpenGL ES हे तथ्य प्रकाशाची गणना करण्यासाठी वापरते. हे यासाठी व्हर्टेक्स नॉर्मल वापरते, जे टेक्सचर कोऑर्डिनेट्स किंवा व्हर्टेक्स रंगांप्रमाणेच कोडमध्ये परिभाषित केले जावे. अंजीर मध्ये. आकृती 11.4 एक गोल आणि त्याचे शिरोबिंदू नॉर्मल दाखवते.

तांदूळ. 11.4. गोल आणि त्याचे शिरोबिंदू नॉर्मल

नॉर्मल हे एकक वेक्टर असतात जे पृष्ठभाग कोणत्या दिशेने फिरवले जातात ते दर्शवतात. आमच्या बाबतीत, पृष्ठभाग एक त्रिकोण आहे. पृष्ठभाग सामान्य परिभाषित करण्याऐवजी, आम्ही शिरोबिंदू सामान्य परिभाषित करतो. या नॉर्मलमधील फरक असा आहे की व्हर्टेक्स नॉर्मल पृष्ठभागाच्या समान दिशेने निर्देशित करू शकत नाही. हे अंजीर मध्ये स्पष्टपणे दृश्यमान आहे. 11.4, जेथे प्रत्येक शिरोबिंदू सामान्य हा शिरोबिंदू ज्या त्रिकोणाशी संबंधित आहे त्या सर्व त्रिकोणांचा सरासरी सामान्य असतो. ऑब्जेक्टची गुळगुळीत शेडिंग तयार करण्यासाठी ही सरासरी केली जाते.

लाइटिंग आणि व्हर्टेक्स नॉर्मल वापरून ऑब्जेक्ट रेंडर करताना, OpenGL ES प्रत्येक व्हर्टेक्स आणि प्रकाश स्रोत यांच्यातील कोन निश्चित करेल. जर त्याला हा कोन माहित असेल तर तो सामग्रीच्या गुणधर्मांवर आधारित शिरोबिंदूच्या रंगाची गणना करू शकतो. अंतिम परिणाम म्हणजे प्रत्येक शिरोबिंदूचा रंग, जो नंतर इतर शिरोबिंदूंच्या गणना केलेल्या रंगांच्या संयोजनात प्रत्येक त्रिकोणावर लागू केला जातो. वापरलेला हा रंग आम्ही ऑब्जेक्टवर लागू केलेल्या कोणत्याही टेक्सचर ट्रान्सफॉर्मेशनसह एकत्र केला जाईल.

हे खूपच भितीदायक वाटते, परंतु प्रत्यक्षात ते इतके वाईट नाही. आम्हाला प्रकाश सक्षम करणे आवश्यक आहे आणि प्रकाश स्रोत, प्रस्तुत करण्यायोग्य सामग्री आणि शिरोबिंदू नॉर्मल (आम्ही सामान्यपणे परिभाषित करू इच्छित असलेल्या शिरोबिंदू व्यतिरिक्त, जसे की स्थिती किंवा पोत निर्देशांक) परिभाषित करणे आवश्यक आहे. OpenGL ES वापरून याची अंमलबजावणी कशी करता येईल ते पाहू.

सरावावर

आता OpenGL ES वापरून लाइटिंगसह काम करण्यासाठी आवश्यक असलेल्या सर्व पायऱ्या करू. चला काही छोटे मदतनीस वर्ग तयार करू जे प्रकाश स्रोतांसोबत काम करणे थोडे सोपे करतील आणि त्यांना com.badlogi पॅकेज with.androi dgames.framework.gl मध्ये ठेवू.

परवानगी आणि दिवे लावण्यास मनाई

इतर OpenGL ES राज्यांप्रमाणे, तुम्ही प्रथम नामित कार्यक्षमता सक्षम करणे आवश्यक आहे. हे खालीलप्रमाणे केले जाऊ शकते:

यानंतर, सर्व प्रस्तुत वस्तूंवर प्रकाशयोजना लागू होईल. परिणाम प्राप्त करण्यासाठी, आपल्याला प्रकाश स्रोत आणि सामग्री तसेच शिरोबिंदू नॉर्मल परिभाषित करणे आवश्यक आहे. एकदा आम्ही सर्व आवश्यक वस्तू रेखाटणे पूर्ण केल्यानंतर, प्रकाश बंद केला जाऊ शकतो:

प्रकाश स्रोत निश्चित करणे

OpenGL ES 4 प्रकारचे प्रकाश स्रोत प्रदान करते: बॅकलाइट, स्पॉट, दिशात्मक आणि स्पॉटलाइट. पहिले तीन कसे ठरवायचे ते पाहू. ल्युमिनेअर प्रभावी होण्यासाठी आणि चांगले दिसण्यासाठी, प्रत्येक मॉडेलमध्ये मोठ्या संख्येने त्रिकोण असणे आवश्यक आहे. सध्याच्या अनेक मोबाईल उपकरणांसाठी हे शक्य नाही.

OpenGL ES तुम्हाला एकाच वेळी जास्तीत जास्त 8 प्रकाश स्रोत तसेच एक जागतिक प्रकाश स्रोत परिभाषित करण्याची परवानगी देतो. 8 प्रकाश स्रोतांपैकी प्रत्येकामध्ये GL10.GL LIGHT0 ते GL10.GL LIGHT7 पर्यंत एक अभिज्ञापक आहे. तुम्हाला यापैकी एका दिव्याचे गुणधर्म बदलण्याची आवश्यकता असल्यास, तुम्ही संबंधित आयडी परिभाषित करून हे करू शकता.

तुम्ही खालील वाक्यरचना वापरून दिवे वापरणे सक्षम करू शकता:

पुढे, OpenGL ES ला या प्रकाश स्रोताचे गुणधर्म प्राप्त होतील आणि ते सर्व प्रस्तुत वस्तूंवर लागू होतील. आम्हाला प्रकाश स्रोताचा वापर अक्षम करायचा असल्यास, आम्ही खालील विधानासह करू शकतो:

हायलाइट हा एक विशेष केस आहे कारण त्यात आयडी नाही. OpenGL ES सीनमध्ये फक्त एक हायलाइट अस्तित्वात असू शकतो. चला या प्रकाश स्रोतावर जवळून नजर टाकूया.

बॅकलाइट

बॅकलाइटिंग हा एक विशेष प्रकारचा प्रकाश आहे. त्याला कोणतेही स्थान किंवा दिशा नाही, फक्त एक रंग जो सर्व प्रकाशित वस्तूंना समान रीतीने लागू केला जातो. OpenGL ES तुम्हाला खालीलप्रमाणे जागतिक हायलाइटिंग परिभाषित करण्यास अनुमती देते:

ambi entCol किंवा अॅरेमध्ये बॅकलाईट रंगाची RGBA मूल्ये असतात, जी 0 ते 1 पर्यंत फ्लोटिंग पॉइंट संख्या म्हणून प्रस्तुत केली जातात. gl LightModel fv पद्धत ही पहिली पॅरामीटर म्हणून एक स्थिरता दर्शवते जी आम्हाला पार्श्वभूमी प्रकाशाचा रंग सेट करायचा आहे. स्त्रोत, फ्लोटिंग पॉइंट नंबर्सचा एक अॅरे, ज्यामध्ये स्त्रोत रंग असतो आणि फ्लोट अॅरेसाठी ऑफसेट ज्यामधून पद्धत RGBA मूल्ये वाचण्यास सुरुवात करेल. या समस्येचे निराकरण करणारा कोड लहान वर्गात टाकू. त्याचा कोड सूची 11.2 मध्ये दर्शविला आहे.

सूची 11.2. वर्ग AmbientLight.java. साधे जागतिक प्रदीपन अमूर्तता ODenGL ES

आम्ही फक्त हायलाइट कलर फ्लोट अॅरेमध्ये संग्रहित करतो आणि दोन पद्धती देतो: एक रंग सेट करण्यासाठी वापरला जातो आणि दुसरा OpenGL ES ला तो रंग वापरण्यासाठी सांगायचा. डीफॉल्ट रंग राखाडी आहे.

पॉइंट लाइटिंग स्रोत

पॉइंट लाइट्सची स्थिती, तसेच पार्श्वभूमी, डिफ्यूज आणि स्पेक्युलर रंग/तीव्रता असते (आम्ही उत्सर्जित रंग/तीव्रता मानत नाही). परिभाषित वेगळे प्रकारखालीलप्रमाणे रंग:

पहिला पॅरामीटर प्रकाश स्रोत अभिज्ञापक आहे. या प्रकरणात आम्ही चौथा स्त्रोत वापरतो. पुढील पॅरामीटर आपल्याला बदलू इच्छित असलेली विशेषता निर्दिष्ट करते. तिसरा पॅरामीटर हा आरजीबीए व्हॅल्यूज असलेल्या फ्लोटिंग पॉइंट नंबरचा अॅरे आहे आणि शेवटचा हा या अॅरेमधील ऑफसेट आहे. स्त्रोताची स्थिती निश्चित करणे तितकेच सोपे आहे:

आपण बदलू इच्छित असलेले गुणधर्म पुन्हा परिभाषित करतो (या स्थितीत), चार-घटकांचा अॅरे ज्यामध्ये x-, y- आणि z-समन्वय आहे ज्यामध्ये प्रकाश स्रोत तयार केला जात आहे. लक्षात घ्या की जर प्रकाश स्रोताची स्थिती असेल तर अॅरेचा चौथा घटक एक सारखा असणे आवश्यक आहे. चला हे मदतनीस वर्गात ठेवूया. त्याचा कोड लिस्टिंग 11.3 मध्ये समाविष्ट आहे.

सूची 11.3. Point.Light.java क्लास, OpenGL ES पॉइंट लाइट्सचा एक साधा अ‍ॅब्स्ट्रॅक्शन

आमच्या सहाय्यक वर्गात प्रकाशाची पार्श्वभूमी, पसरलेले आणि स्पेक्युलर रंग घटक तसेच स्थान (चौथा घटक एक आहे) समाविष्ट आहे. याव्यतिरिक्त, आम्ही दिलेल्या स्त्रोतासाठी वापरलेला शेवटचा अभिज्ञापक संचयित करतो, त्यामुळे एक disableO पद्धत तयार करणे शक्य होते जे आवश्यक असल्यास प्रकाश बंद करेल. आमच्याकडे enableO पद्धत देखील आहे, जी GL10 वर्ग आणि प्रकाश स्रोत अभिज्ञापक (उदाहरणार्थ GL10.GL LIGHT6) चे उदाहरण घेते. हे लाइटिंग वापरण्याची परवानगी देते, त्याचे गुणधर्म सेट करते आणि वापरलेला आयडी संग्रहित करते. disableO पद्धत फक्त सक्षम पद्धतीमध्ये सेट केलेल्या 1ast.Ligh.tId वर्ग सदस्याचा वापर करून प्रकाशाचा वापर अक्षम करते.

वर्ग सदस्य अॅरे सुरू करताना आम्ही पार्श्वभूमी, डिफ्यूज आणि स्पेक्युलर रंगांसाठी वाजवी डीफॉल्ट मूल्ये वापरतो. प्रकाश पांढरा असेल आणि त्याचा स्पेक्युलर घटक काळा असल्याने कोणतीही चमक निर्माण करणार नाही.

दिशात्मक प्रकाश स्रोत

दिशात्मक प्रकाश स्रोत जवळजवळ पॉइंट सारखेच असतात. फरक एवढाच आहे की त्यांना स्थानाऐवजी दिशा असते. कोणत्या दिशेने व्यक्त होतो ते काहीसे गोंधळात टाकणारे आहे. दिशा दर्शवण्यासाठी वेक्टर वापरण्याऐवजी, OpenGL ES आम्हाला एकच बिंदू परिभाषित करण्याची अपेक्षा करते. त्यानंतर या बिंदूला आणि उत्पत्तीला जोडणारा वेक्टर वापरून दिशा निश्चित केली जाईल. खालील स्निपेट तुम्हाला जगाच्या उजव्या बाजूने येणारा दिशात्मक प्रकाश स्रोत तयार करण्यास अनुमती देते:

आम्ही ते वेक्टरमध्ये रूपांतरित करू शकतो:

इतर गुणधर्म, जसे की पार्श्वभूमी किंवा डिफ्यूज कलर, पॉइंट लाइटच्या समान आहेत. 11.4 सूची दिशात्मक दिवे तयार करण्यासाठी वापरल्या जाणार्‍या छोट्या मदतनीस वर्गासाठी कोड दर्शवते.

सूची 11.4. Directi onLi class ght.java, OpenGL ES मधील दिशात्मक प्रकाश स्रोतांचे साधे अमूर्तीकरण

हा मदतनीस वर्ग जवळजवळ पॉइंटलाइट वर्गासारखाच आहे. फरक एवढाच आहे की अॅरेवरील डायरेक्टीमध्ये चौथा घटक एक आहे. याव्यतिरिक्त, setPosition पद्धतीऐवजी, setDirecti on method दिसू लागले आहे. हे तुम्हाला दिशा परिभाषित करण्यास अनुमती देते, उदाहरणार्थ: (-1; 0; 0), अशा परिस्थितीत उजव्या बाजूने प्रकाश येईल. पद्धतीच्या आत, वेक्टरचे सर्व घटक त्यांचे चिन्ह बदलतात, म्हणून आम्ही दिशा OpenGL ES द्वारे अपेक्षित स्वरूपामध्ये रूपांतरित करतो.

साहित्य निश्चित करणे

सामग्री अनेक गुणधर्मांद्वारे परिभाषित केली जाते. इतर कोणत्याही OpenGL ES ऑब्जेक्टप्रमाणे, मटेरियल ही अशी स्थिती असते जी आम्ही ती पुन्हा बदलेपर्यंत किंवा OpenGL ES संदर्भ हरवल्याशिवाय सक्रिय राहते. वर्तमान सामग्री गुणधर्म सेट करण्यासाठी, आम्ही पुढील गोष्टी करू शकतो:

नेहमीप्रमाणे, आम्हाला पार्श्वभूमी, डिफ्यूज आणि स्पेक्युलर आरजीबीए रंग परिभाषित करणे आवश्यक आहे. हे पूर्वीप्रमाणेच केले जाऊ शकते - चार घटकांचा समावेश असलेल्या फ्लोटिंग पॉइंट नंबरच्या अॅरेचा वापर करून.

या क्रिया एका सहाय्यक वर्गात एकत्र करणे खूप सोपे आहे. तुम्ही लिस्ट 11.5 मध्ये निकाल पाहू शकता.

सूची 11.5. मटेरिअल जावा क्लास, ओपनजीएल ईएस मटेरियलचे साधे अ‍ॅब्स्ट्रॅक्शन

इथेही आश्चर्य वाटण्यासारखे काही नाही. आम्ही फक्त तीन घटक संग्रहित करतो जे सामग्रीचे वर्णन करतात आणि त्यांची मूल्ये सेट करण्यासाठी फंक्शन्स आणि सक्षम ई पद्धत देखील देतात जी त्यांना OpenGL ES मध्ये पास करतात.

OpenGL ES मटेरिअलच्या बाबतीत आणखी एक इक्का आहे. हे सहसा glMaterialfvO पद्धतीऐवजी मटेरियल कलर नावाचे काहीतरी वापरते. याचा अर्थ असा की glMateri al fv पद्धतीद्वारे निर्धारित केलेल्या पार्श्वभूमी आणि डिफ्यूज रंगांऐवजी, OpenGL ES आमच्या मॉडेल्सच्या शिरोबिंदूंचा रंग पार्श्वभूमी आणि सामग्रीचे पसरलेले रंग म्हणून घेईल. हे वैशिष्ट्य सक्षम करण्यासाठी, तुम्ही फक्त याला कॉल करा:

हे सहसा मी करतो कारण पार्श्वभूमी आणि डिफ्यूज रंग बर्‍याचदा समान असतात. मी माझ्या बहुतेक गेम आणि डेमोमध्ये स्पेक्युलर हायलाइट्स वापरत नसल्यामुळे, मी ही पद्धत सहजपणे वापरू शकतो आणि glMaterial fv पद्धतीला अजिबात कॉल करू शकत नाही. ते कोणते मार्ग वापरायचे ते ठरवायचे आहे.

सामान्यांची व्याख्या

OpenGL ES मध्‍ये काम करण्‍यासाठी लाइटिंगसाठी, तुम्हाला मॉडेलमधील प्रत्येक शिरोबिंदूसाठी व्हर्टेक्स नॉर्मल परिभाषित करणे आवश्यक आहे. शिरोबिंदूचा सामान्य भाग (सामान्यतः) ज्या दिशेने शिरोबिंदूचा पृष्ठभाग फिरवला जातो त्या दिशेने निर्देशित करणारा एकक वेक्टर असावा. अंजीर मध्ये. आकृती 11.5 आपल्या घनासाठी शिरोबिंदू नॉर्मल दर्शवते.

तांदूळ. 11.5. आपल्या क्यूबच्या प्रत्येक शिरोबिंदूसाठी व्हर्टेक्स नॉर्मल

व्हर्टेक्स नॉर्मल हे शिरोबिंदूचे आणखी एक गुणधर्म आहे, जसे की स्थिती किंवा रंग. व्हर्टेक्स नॉर्मलचा फायदा घेण्यासाठी, आम्हाला पुन्हा व्हर्टी सीएस3 वर्ग बदलण्याची गरज आहे. OpenGL ES ला ते प्रत्येक शिरोबिंदूसाठी नॉर्मल कुठे शोधू शकतात हे सांगण्यासाठी, आम्ही gl Normal PointerO पद्धत वापरू, जसे आम्ही पूर्वी gl VertexPointer किंवा gl Col किंवा Pointer पद्धती वापरत होतो. सूची 11.6 वर्टिसेस3 वर्गाची अंतिम आवृत्ती दर्शवते.

सूची 11.6. Vertices3.Java क्लास, नॉर्मलला सपोर्ट करणारी अंतिम आवृत्ती

वर्गात एक नवीन सदस्य hasNormal.s आहे जो शिरोबिंदूंना नॉर्मल आहे की नाही याचा मागोवा घेतो.

कन्स्ट्रक्टर आता hasNormals पॅरामीटर देखील स्वीकारतो. आम्हाला अजूनही शक्य असेल तेथे प्रत्येक शिरोबिंदूवर तीन फ्लोट्स जोडून व्हर्टेक्ससाइज सदस्याची गणना सुधारणे आवश्यक आहे.

तुम्ही बघू शकता, setVertices आणि setlndices पद्धती अपरिवर्तित राहतील.

आम्ही नुकतेच दाखवलेल्या bindO पद्धतीमध्ये, आम्ही पूर्वीप्रमाणेच ByteBuffer सोबत तीच तंत्रे वापरतो, परंतु यावेळी आम्ही gl Normal Pointer पद्धत वापरून नॉर्मल जोडतो. सामान्य पॉइंटरच्या ऑफसेटची गणना करण्यासाठी, पोत आणि रंग निर्देशांक निर्दिष्ट केले आहेत की नाही हे विचारात घेणे आवश्यक आहे.

तुम्ही बघू शकता, ड्रॉ पद्धत देखील बदललेली नाही; सर्व क्रिया बाइंड पद्धती O मध्ये होतात.

शेवटी, आम्ही unbindO पद्धतीमध्ये थोडासा बदल करतो. आम्ही सामान्य पॉइंटरचा वापर अक्षम करतो, जर असेल तर, त्यानुसार OpenGL ES स्थिती साफ करून.

सुधारित Verti ces3 वर्ग लागू करणे पूर्वीसारखेच सोपे आहे. एक लहान उदाहरण पाहू:

आम्ही तीन शिरोबिंदू संचयित करण्यासाठी फ्लोटिंग पॉइंट अॅरे तयार करतो, ज्यापैकी प्रत्येकाला एक स्थान (प्रत्येक ओळीतील पहिले तीन संख्या) आणि एक सामान्य (प्रत्येक ओळीतील शेवटचे तीन संख्या) असतात. या प्रकरणात, आम्ही xy समतल त्रिकोणाची व्याख्या करतो, त्याचे सामान्य z अक्षाच्या सकारात्मक भागाच्या दिशेने निर्देशित करतात.

आपल्याला फक्त Vertices3 वर्गाचे उदाहरण तयार करायचे आहे आणि शिरोबिंदूंची मूल्ये सेट करायची आहेत. खूपच सोपे, नाही का?

सर्व बंधनकारक, रेखाचित्र आणि अनबाइंडिंग कार्य वर्गाच्या मागील आवृत्तीप्रमाणेच केले जाते. पूर्वीप्रमाणे, आपण शिरोबिंदू रंग आणि पोत समन्वय जोडू शकतो.

हे सर्व एकत्र ठेवणे

चला हे सर्व एकत्र ठेवूया. आपल्याला जागतिक प्रदीपन, बिंदू आणि दिशात्मक प्रकाश स्रोत असलेले दृश्य रेखाटण्याची आवश्यकता आहे. ते उगमस्थानी स्थित क्यूब प्रकाशित करतील. आम्हाला gl uLookAt, पद्धत देखील कॉल करणे आवश्यक आहे. कॅमेरा ठेवण्यासाठी. अंजीर मध्ये. 11.6 दाखवले देखावाआपले जग.

इतर सर्व उदाहरणांप्रमाणे, GLGame वर्ग नेहमीप्रमाणे वाढवून, LightTest नावाचा वर्ग तयार करू. हे getStartScreenO पद्धत वापरून लाइटस्क्रीन क्लासचे उदाहरण देईल. लाइटस्क्रीन क्लास GLScreen क्लास (लिस्टिंग 11.7) कडून प्राप्त होतो.

तांदूळ. 11.6. आमचा पहिला पेटलेला सीन

सूचीकरण 11.7. LightTest.java वर्गाचे तुकडे. OpenGL ES वापरून प्रकाश तयार करणे

चला वर्गातील काही सदस्यांचे वर्णन करून सुरुवात करूया. कोन सदस्य y-अक्षाभोवती घनाच्या फिरण्याच्या वर्तमान कोनाबद्दल माहिती संग्रहित करतो. Verti ces3 सदस्य क्यूब मॉडेलचे शिरोबिंदू संग्रहित करते, जे आम्ही लवकरच परिभाषित करू. याव्यतिरिक्त, आमच्याकडे अॅम्बियंटलाइट, पॉइंटलाइट आणि डायरेक्शनल लाइट क्लासेसची उदाहरणे तसेच मटेरियल क्लासची उदाहरणे आहेत.

पुढे कन्स्ट्रक्टर येतो. येथे क्यूब मॉडेलचे शिरोबिंदू तयार केले जातात आणि बॉक्सचा पोत लोड केला जातो. आम्ही दिवे आणि साहित्य देखील सुरू करतो. बॅकलाइटचा रंग हलका हिरवा आहे. निर्देशित स्त्रोत लाल आहे आणि आपल्या जगाच्या बिंदू (3; 3; 0) वर स्थित आहे. दिशात्मक प्रकाश स्रोताचा निळा पसरलेला रंग आहे, प्रकाश डावीकडून पडतो. सामग्रीसाठी आम्ही डीफॉल्ट मूल्ये वापरतो (काहीसे पार्श्वभूमी, पसरलेल्या घटकासाठी पांढरा आणि स्पेक्युलर घटकासाठी काळा).

रेझ्युमे पद्धतीमध्ये आम्ही खात्री करतो की संदर्भ हरवल्यास आमचा पोत (पुन्हा) लोड झाला आहे.

CreateCube पद्धत पूर्वीच्या उदाहरणांपेक्षा अपरिवर्तित आहे. तथापि, यावेळी आम्ही अंजीर मध्ये दर्शविल्याप्रमाणे, प्रत्येक शिरोबिंदूमध्ये नॉर्मल जोडतो. 11.5. त्याशिवाय सर्व काही तसेच राहते.

अपडेट पद्धतीमध्ये आपण क्यूबचा रोटेशन अँगल फक्त वाढवतो.

येथे ते अधिक मनोरंजक होते. पहिल्या काही ओळी रंग आणि खोली बफर साफ करण्यासाठी, खोली चाचणी सक्षम करण्यासाठी आणि व्याप्ती सेट करण्यासाठी बॉयलरप्लेट कोड आहेत.

पुढे, आम्ही gl uPerspecti ve पद्धत वापरून परिप्रेक्ष्य प्रोजेक्शन मॅट्रिक्सच्या समान प्रोजेक्शन मॅट्रिक्स सेट करतो आणि मॉडेल-व्ह्यू मॅट्रिक्ससाठी gl uLookAt पद्धत देखील वापरतो, ज्यामुळे कॅमेरा अंजीर प्रमाणेच कार्य करतो. 11.6.

मग आम्ही प्रकाशयोजना वापरण्यास परवानगी देतो. या टप्प्यावर, अद्याप कोणतेही दिवे परिभाषित केले गेले नाहीत, म्हणून आम्ही त्यांना पुढील काही ओळींमध्ये दिवे आणि सामग्रीवरील पद्धत कॉल करून परिभाषित करू.

नेहमीप्रमाणे, आम्‍ही टेक्‍चरिंग सक्षम करतो आणि बॉक्‍स टेक्‍चर बाइंड करतो. शेवटी, आम्ही क्यूब फिरवण्यासाठी gl RotatefC) पद्धतीला कॉल करतो आणि नंतर Verti ces3 क्लासच्या उदाहरणासाठी योग्यरित्या ठेवलेले कॉल वापरून त्याचे शिरोबिंदू काढतो.

पद्धतीच्या शेवटी, आम्ही स्पॉट आणि दिशात्मक दिवे अक्षम करतो (लक्षात ठेवा, बॅकलाइटिंग ही जागतिक स्थिती आहे), तसेच टेक्सचरिंग आणि डेप्थ टेस्टिंग. OpenGL ES मधील प्रकाशासाठी तेच आहे.

उर्वरित वर्ग रिकामे आहे; विराम दिल्यास आम्हाला कोणतीही क्रिया करण्याची आवश्यकता नाही. अंजीर मध्ये. आकृती 11.7 प्रोग्रामचा परिणाम दर्शविते.

तांदूळ. ११.७. अंजीर मध्ये दर्शविलेले दृश्य. 11.6, OpenGL ES सह प्रस्तुत

OpenGL ES मधील प्रकाशयोजनेवर काही टिपा

प्रकाशयोजना वापरल्याने तुमच्या गेममध्ये चव वाढू शकते, परंतु त्याच्या मर्यादा आणि तोटे आहेत. अशा काही गोष्टी आहेत ज्यांची तुम्हाला जाणीव असायला हवी.

प्रकाश वापरणे खूप संसाधने वापरते, विशेषत: धीमे उपकरणांवर लक्षात येते. प्रकाशयोजना काळजीपूर्वक वापरा. तुम्ही जितके अधिक प्रकाश स्रोतांचे वर्णन कराल, तितके दृश्य रेंडर करण्यासाठी अधिक गणिते आवश्यक असतील.

बिंदू/दिशात्मक प्रकाश स्रोतांची स्थिती/दिशा कॅमेरा मॅट्रिक्स लोड झाल्यानंतर आणि ऑब्जेक्ट्स हलवण्यासाठी आणि फिरवण्यासाठी इतर कोणत्याही मॅट्रिक्सद्वारे मॉडेल-व्ह्यू मॅट्रिक्सचा गुणाकार करण्यापूर्वी निर्धारित केले जावे. हे गंभीर आहे. या सूचनांचे पालन न केल्यास, अस्पष्टीकृत प्रकाश कलाकृती उद्भवू शकतात.

जेव्हा तुम्ही मॉडेलचा आकार बदलण्यासाठी gl Seal ef पद्धत वापरता, तेव्हा त्याचे सामान्य प्रमाण देखील मोजले जाईल. हे वाईट आहे कारण OpenGL ES ची अपेक्षा आहे की दिलेल्या युनिट्समध्ये पॅरामीटर्स असणे आवश्यक आहे. या समस्येवर काम करण्यासाठी, तुम्ही glEnable(GL10.GL NORMALIZE) कमांड वापरू शकता किंवा काही परिस्थितींमध्ये, gl Enable(GL10 .GL RESCALE N0RMAL) वापरू शकता. माझा विश्वास आहे की पहिली आज्ञा वापरली पाहिजे, कारण दुसऱ्याच्या वापरास मर्यादा आणि तोटे आहेत. समस्या अशी आहे की सामान्य करणे किंवा पुन्हा स्केलिंग करण्यासाठी भरपूर प्रक्रिया शक्ती आवश्यक आहे. कार्यक्षमतेच्या दृष्टिकोनातून सर्वोत्तम उपाय म्हणजे प्रकाशित वस्तूंचे प्रमाण न लावणे.

बरं, सज्जनांनो. आम्ही अलीकडे OpenGL बद्दल थोडे शिकलो आहोत, कसे करावे यासह कॅमेरा नियंत्रित करा , टेक्सचरसह कार्य करा, आणि सह देखील मॉडेल. अधिक मनोरंजक गोष्टींबद्दल बोलण्याची वेळ आली आहे, म्हणजे प्रकाशयोजना. हा विषय मनोरंजक आहे कारण ओपनजीएलमध्ये प्रकाशासह कार्य करण्यासाठी काहीही तयार नाही; शेडर्स वापरून सर्व काही स्वतंत्रपणे लिहिणे आवश्यक आहे. या पोस्टमध्ये आपण फोंग लाइटिंग पाहू. हा बर्‍यापैकी मोठा विषय आहे, म्हणून आम्ही याबद्दल विशेष बोलू प्रकाशयोजना. ते कसे तयार केले जातात सावल्या, आम्हाला ते दुसर्या वेळी शोधून काढावे लागेल.

जतन करणे आणि सामान्य वापरणे

आम्ही थेट प्रकाशाकडे जाण्यापूर्वी, आम्हाला सामान्य सारख्या गोष्टीची आवश्यकता आहे.

आम्हाला आधीच माहित आहे की मॉडेल्समध्ये शिरोबिंदू आणि यूव्ही समन्वय या शिरोबिंदूंशी संबंधित असतात. प्रकाश तयार करण्यासाठी, आम्हाला मॉडेल्सबद्दल काही अधिक माहिती आवश्यक आहे, म्हणजे नॉर्मल. सामान्य म्हणजे शिरोबिंदूशी संबंधित युनिट वेक्टर (किंवा, पर्यायाने, बहुभुज, परंतु हे आमच्या बाबतीत नाही). प्रकाशयोजना अंमलात आणण्यात सामान्यांची नेमकी भूमिका काय आहे हे आम्ही खाली शोधू. आत्तासाठी, हे सांगणे पुरेसे आहे की नॉर्मल खरोखरच खूप महत्वाचे आहेत. उदाहरणार्थ, त्यांना धन्यवाद, पृष्ठभाग नितळ दिसतात आणि आपण आयकोसेहेड्रॉन सारख्या नियमित बहिर्वक्र पॉलीहेड्रॉनपासून बॉल वेगळे करू शकता. आणि नॉर्मल हे खूप महत्वाचे असल्याने, ब्लेंडर मॉडेल्सना आमच्या स्वतःच्या फॉरमॅटमध्ये रूपांतरित करताना ते कसे जतन करायचे हे आम्हाला शिकण्याची गरज आहे.

संबंधित बदल अगदी क्षुल्लक आहेत. आपल्याला शिरोबिंदू निर्देशांक आणि अतिनील कोऑर्डिनेट्स मिळाले त्याच प्रकारे आपल्याला नॉर्मल मिळतात:

// प्रक्रिया मुख्य भाग आयातित ModelCreate

साठी (अस्वाक्षरित int j = 0; j< face.mNumIndices ; ++ j) {
स्वाक्षरी नसलेली इंट इंडेक्स = face.mIndices[j] ;
aiVector3D pos = जाळी->mVertices[ अनुक्रमणिका] ;
aiVector3D uv = जाळी-> mTextureCoords[ 0 ] [ अनुक्रमणिका] ;
aiVector3D normal = जाळी-> mNormals[ अनुक्रमणिका] ;

VerticesBuffer[verticesBufferIndex++ ] = pos.x ;
verticesBuffer[ verticesBufferIndex++ ] = pos.y ;
verticesBuffer[ verticesBufferIndex++ ] = pos.z ;
verticesBuffer[verticesBufferIndex++ ] = normal.x ;
verticesBuffer[verticesBufferIndex++ ] = normal.y ;
verticesBuffer[verticesBufferIndex++ ] = normal.z ;
verticesBuffer[ verticesBufferIndex++ ] = uv.x ;
verticesBuffer[ verticesBufferIndex++ ] = 1.0f - uv.y ;
}

मॉडेल ऑप्टिमायझेशन प्रक्रिया त्याचप्रमाणे बदलते. आणि मॉडेललोड प्रक्रियेमध्ये, दोन विशेषता अॅरेऐवजी, आम्हाला आता तीन आवश्यक आहेत:

// मॉडेललोड प्रक्रियेच्या मुख्य भागाचा भाग

GlBindVertexArray(modelVAO);
glEnableVertexAttribArray(0 ) ;
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);

GlBindBuffer(GL_ARRAY_BUFFER, modelVBO);
glBufferData(GL_ARRAY_BUFFER, शीर्षलेख-> शिरोबिंदूडेटाआकार, शिरोबिंदूPtr,
GL_STATIC_DRAW);

GLsizei stride = 8 * sizeof(GLfloat);
glVertexAttribPointer(0 , 3 , GL_FLOAT, GL_FALSE, स्ट्राइड, nullptr);
glVertexAttribPointer(1 , 3 , GL_FLOAT, GL_FALSE, स्ट्राइड,
(const void * ) (3 * आकाराचा (GLfloat) ) );
glVertexAttribPointer(2 , 2 , GL_FLOAT, GL_FALSE, स्ट्राइड,
(const void * ) (6 * sizeof (GLfloat) ) );

आम्हाला मॅट्रिक्स M सह एकसमान व्हेरिएबल देखील आवश्यक आहे:

GLint uniformM = getUniformLocation(programId, "M" );

// ...

GlUniformMatrix4fv(uniformM, 1, GL_FALSE, & towerM[ 0 ] [ 0 ] );

... व्हर्टेक्स शेडरमध्ये स्पेसमध्ये नॉर्मल योग्यरित्या फिरवण्यासाठी:

#आवृत्ती 330 कोर

vec3 vertexPos मध्ये लेआउट(स्थान = 0 );
vec3 vertexNorm मध्ये लेआउट(स्थान = 1);
vec2 vertexUV मध्ये लेआउट(स्थान = 2 );

एकसमान mat4 MVP;
एकसमान चटई 4 एम;

बाहेर vec2 fragmentUV;
बाहेर vec3 खंड सामान्य;
vec3 fragmentPos बाहेर;

शून्य मुख्य() (
fragmentUV = vertexUV;
fragmentNormal = (M * vec4 (vertexNorm, 0 ) ) . xyz;
fragmentPos = (M * vec4 (vertexPos, 1 ) ) . xyz;

gl_Position = MVP * vec4 (vertexPos, 1 );
}

शेवटी, फ्रॅगमेंट शेडर तीन शिरोबिंदूंवर एक सामान्य प्रक्षेपित करतो:

// ...

शून्य मुख्य() (

// ...
}

या सोप्या पद्धतीने आपल्याला नॉर्मल मिळतात तुकडे.

फॉंग लाइटिंग म्हणजे काय?

नमूद केल्याप्रमाणे, OpenGL मधील प्रकाशयोजना स्वतः प्रोग्रामरद्वारे शेडर्समध्ये लिहिली जाते. हे स्पष्ट आहे की या प्रकाशयोजनेची अंमलबजावणी करण्याचे एकापेक्षा जास्त मार्ग आहेत, प्रत्येकाची स्वतःची वास्तविकता आणि संसाधनांची आवश्यकता आहे. आणि प्रत्येक पद्धतीत अजूनही असंख्य विशिष्ट अंमलबजावणी असू शकतात. मला जे समजले त्यावरून, कार्यक्षम आणि वास्तववादी रिअल-टाइम प्रकाशयोजना अजूनही सक्रिय संशोधनाचे क्षेत्र आहे. या पोस्टसाठी, आम्ही Phong प्रकाशयोजना पाहू, जी अगदी वास्तववादी आणि अंमलात आणण्यास सोपी आहे.

खालील संकल्पनांमधील फरक समजून घेणे महत्वाचे आहे:

  • गौराऊड शेडिंग म्हणजे जेव्हा तुम्ही प्रत्येक शिरोबिंदूच्या प्रदीपनची गणना करता आणि त्यांच्यामधील तुकड्यांचा प्रकाश प्रक्षेपित केला जातो;
  • फॉंग शेडिंग - जेव्हा प्रत्येक तुकड्यासाठी प्रदीपन स्वतंत्रपणे मोजले जाते;
  • फोंग लाइटिंग किंवा फोंग रिफ्लेक्शन मॉडेल ही या लेखात चर्चा केलेली विशिष्ट प्रकाश पद्धत आहे आणि जी गौरॉड आणि फोंग शेडिंग दोन्हीमध्ये वापरली जाऊ शकते;

हे आश्चर्यकारक नाही की फॉंग शेडिंग आणि फॉंग लाइटिंग सहसा गोंधळात टाकतात आणि काही ट्युटोरियल्समध्ये तुम्ही "फॉन्ग शेडिंगची कल्पना तीन घटक वापरणे आहे..." यासारखे मूर्खपणा वाचू शकता ज्यामुळे तुम्हाला ताबडतोब त्याच्या अधिकारावर तीव्र शंका येते. ज्या व्यक्तीने हे ट्यूटोरियल लिहिले आहे.

मला समजल्याप्रमाणे, आधुनिक ऍप्लिकेशन्समध्ये गौरॉड शेडिंग जवळजवळ वापरले जात नाही, त्याऐवजी फॉंग शेडिंगला प्राधान्य दिले जाते. या पोस्टमध्ये, आम्ही Phong शेडिंग देखील वापरू, म्हणजेच, प्रत्येक तुकड्यासाठी प्रकाशाची स्वतंत्रपणे गणना केली जाईल. आम्ही वापरणार विशिष्ट प्रकाश पद्धत म्हणजे Phong प्रकाश. ही पद्धत खालीलप्रमाणे आहे.

वेगवेगळ्या सूत्रांचा वापर करून तीन प्रकाश घटकांची गणना केली जाते:

  • सभोवतालची प्रकाशयोजना हे प्रकाशाचे अनुकरण आहे जे इतर वस्तूंमधून परावर्तित झाल्यानंतर दिलेल्या बिंदूवर पोहोचले आहे. पार्श्वभूमी प्रकाशाची गणना करताना, सामान्य किंवा वर्तमान कॅमेरा स्थिती विचारात घेतली जात नाही;
  • डिफ्यूज लाइटिंग म्हणजे दिलेल्या बिंदूवर आदळल्यानंतर विखुरलेल्या स्त्रोतापासून प्रकाश असतो. प्रकाश ज्या कोनात पडतो त्यावर अवलंबून, प्रदीपन मजबूत किंवा कमकुवत होते. हे सामान्य स्थिती लक्षात घेते, परंतु कॅमेरा स्थिती नाही;
  • स्पेक्युलर लाइटिंग म्हणजे दिलेल्या बिंदूवर आदळल्यानंतर परावर्तित होणार्‍या स्त्रोताकडून येणारा प्रकाश. कॅमेरामध्ये प्रवेश केल्यास परावर्तित प्रकाश दृश्यमान होतो. म्हणून, येथे सामान्य आणि कॅमेरा स्थिती दोन्ही विचारात घेतले जातात;

नंतर एकूण प्रदीपन देण्यासाठी परिणामांची बेरीज केली जाते.

गोष्टी अधिक मनोरंजक बनवण्यासाठी, विविध प्रकाश स्रोत आहेत. साहजिकच, बाहेरचा सूर्य आणि अंधारात टॉर्च हे दृश्य अगदी वेगळ्या पद्धतीने प्रकाशित करतात. प्रथम, आपण सर्वात सोपा स्त्रोत पाहू - दिशात्मक प्रकाश.

दिशात्मक प्रकाश

दिशात्मक प्रकाश हे असीम दूरच्या प्रकाश स्रोताचे अनुकरण आहे. उदाहरणार्थ सूर्य घेऊ. सूर्य पृथ्वीपासून खूप दूर आहे. म्हणून, पृथ्वीच्या पृष्ठभागावर, सूर्यापासून येणारे सर्व प्रकाश किरण अत्यंत अचूकतेने समांतर मानले जाऊ शकतात. दिशात्मक प्रकाश त्याच्या दिशा, रंग, तसेच काही गुणांकांद्वारे दर्शविला जातो ज्याची आपल्याला खाली आवश्यकता असेल:

स्ट्रक्चर डायरेक्शनल लाईट(
vec3 दिशा;

vec3 रंग;
फ्लोट सभोवतालची तीव्रता;
फ्लोट diffuse तीव्रता;
फ्लोट स्पेक्युलर तीव्रता;
} ;

फ्रॅगमेंट शेडर कोडमध्ये, आम्ही कॅल्कडायरेक्शनल लाईट प्रक्रिया परिभाषित करू जी याप्रमाणे वापरली जाईल:

vec3 fragmentPos मध्ये;
एकसमान vec3 cameraPos;
एकसमान दिशात्मक प्रकाश दिशात्मक प्रकाश;

// ...

शून्य मुख्य() (
// प्रक्षेपणानंतर सामान्य दुरुस्त केले पाहिजे
vec3 normal = सामान्यीकरण (सामान्य तुकडा);


दिशात्मक प्रकाश) ;

// ...
}

चला प्रक्रियेच्या अंमलबजावणीचा विचार करूया.

vec4 calcDirectionallight(vec3 सामान्य, vec3 तुकड्याला कॅमेरा,
दिशात्मक प्रकाश प्रकाश) (
vec4 ambientColor = vec4 (प्रकाश. रंग, 1) * प्रकाश. वातावरणाची तीव्रता;

// ...
}

प्रथम, पहिल्या घटकाची गणना केली जाते - पार्श्वभूमी प्रकाश. हा फक्त पार्श्वभूमी प्रकाशाच्या तीव्रतेने गुणाकार केलेल्या उत्सर्जित प्रकाशाचा रंग आहे. आतापर्यंत सर्वकाही सोपे आहे.

// ...

फ्लोट डिफ्यूज फॅक्टर = कमाल (0.0 , बिंदू (सामान्य, - प्रकाश. दिशा) );
vec4 diffuseColor = vec4 (प्रकाश. रंग, 1) * प्रकाश. प्रसार तीव्रता
* डिफ्यूज फॅक्टर;

// ...

विखुरलेली प्रकाशयोजना. डिफ्यूज फॅक्टर व्हेरिएबल सामान्य ते तुकडा आणि तुकड्यापासून प्रकाश स्रोताकडे निर्देशित केलेला वेक्टर यांच्यातील कोनाचा कोसाइन दर्शवतो. जर प्रकाश पृष्ठभागावर लंब असेल तर कोन शून्य असेल. या कोनाचा कोसाइन एक समान आहे आणि प्रदीपन कमाल आहे (लॅम्बर्टच्या कायद्याबद्दल विकिपीडिया लेख पहा). कोन जसजसा वाढतो तसतसा कोसाइन कमी होतो आणि जर प्रकाश पृष्ठभागाच्या समांतर असेल तर तो शून्य होतो. जर कोसाइन ऋणात्मक असेल, तर प्रकाश स्रोत पृष्ठभागाच्या मागे कुठेतरी आहे आणि तो प्रकाशित होत नाही, म्हणून आपण max(0.0, ...) वापरून नकारात्मक मूल्ये शून्यावर बदलतो. प्रकाश ज्या कोनात पडतो त्या व्यतिरिक्त, विखुरलेल्या प्रकाशाची तीव्रता देखील विचारात घेतली जाते.

// ...
vec3 lightReflect = सामान्य करा(प्रतिबिंबित करा(प्रकाश. दिशा, सामान्य));
फ्लोट स्पेक्युलर फॅक्टर = पॉव(
कमाल (0.0 , बिंदू (तुकडा टू कॅमेरा, लाइट रिफ्लेक्ट) ,
मटेरियल स्पेक्युलर फॅक्टर
) ;
vec4 specularColor = प्रकाश. specularIntensity * vec4(light.color, 1)
* मटेरियल स्पेक्युलर इंटेन्सिटी * स्पेक्युलर फॅक्टर;
// ...

अप्रत्यक्ष प्रकाशयोजना. लाइटरिफ्लेक्ट व्हेरिएबल एक युनिट वेक्टर आहे जो परावर्तित प्रकाशाची दिशा निर्दिष्ट करतो. स्पेक्युलर फॅक्टर व्हेरिएबलची गणना diffuseFactor प्रमाणेच केली जाते, फक्त यावेळी तो प्रकाश ज्या दिशेला परावर्तित झाला होता आणि तुकड्यापासून कॅमेऱ्याकडे जाणारी दिशा यामधील कोनाचा कोसाइन विचारात घेतो. जर हा कोन शून्य असेल, तर परावर्तित प्रकाश थेट कॅमेऱ्यात उडतो आणि पृष्ठभागावरील चमक जास्तीत जास्त असते. जर कोन मोठा असेल तर कोणतीही चमक दिसू नये. येथे मटेरियलस्पेक्युलर फॅक्टर एकसमान चल आहे. ते जितके मोठे असेल तितके ऑब्जेक्टच्या पृष्ठभागावरील चकाकीचे क्षेत्रफळ लहान असेल. मटेरियल स्पेक्युलर इंटेन्सिटी व्हेरिएबलचा वापर हायलाइट्सची चमक निश्चित करण्यासाठी देखील केला जातो. लक्षात घ्या की हे सर्व साहित्याचे गुणधर्म आहेत, प्रकाश नाही. उदाहरणार्थ, धातू प्रकाश परावर्तित करते आणि त्यामुळे चमक असते. परंतु लाकूड प्रकाश प्रतिबिंबित करत नाही आणि नंतर आपल्याला झाडांवर कधीही चमक दिसत नाही (अर्थात, पृष्ठभाग कोरडे असल्यास, आणि असेच).

वरील कोडमध्ये, प्रकाशात स्पेक्युलर इंटेन्सिटी गुणधर्म आहे. परंतु हे केवळ विशिष्ट प्रकाश स्रोतातील हायलाइट्स हायलाइट करण्यासाठी डीबगिंगसाठी वापरले जावे. कोडच्या रिलीझ आवृत्तीमध्ये, हा गुणांक एकतर समान असावा किंवा कोडमधून पूर्णपणे काढून टाकला जावा.

शेवटी, तीन घटक जोडले जातात आणि परिणाम परत केला जातो:

// ...

परतावा ambientColor + diffuseColor + specularcolor;
}

इतके अवघड नाही, बरोबर?

पॉइंट प्रकाश स्रोत

प्रकाशाचा एक बिंदू स्त्रोत आहे, उदाहरणार्थ, एक जळणारा प्रकाश बल्ब. लाइट बल्बचा प्रकाश सर्व दिशेने निर्देशित केला जातो. म्हणून, बिंदू प्रकाश स्रोत प्रकाशाच्या दिशेने दर्शविले जात नाही, परंतु स्पेसमधील स्त्रोताच्या स्थानाद्वारे दर्शविले जाते:

रचना पॉइंटलाइट(
vec3 स्थिती;

vec3 रंग;
फ्लोट सभोवतालची तीव्रता;
फ्लोट diffuse तीव्रता;
फ्लोट स्पेक्युलर तीव्रता; // डीबग हेतूंसाठी, 1.0 वर सेट केले जावे
} ;

आधीपासून अस्तित्वात असलेल्या कॅल्कडायरेक्शनल लाईट प्रक्रियेचा वापर करून पॉइंट लाइट स्त्रोतापासून प्रदीपन सहजपणे मोजले जाते:

vec4 calcPointLight(vec3 सामान्य, vec3 तुकड्याला कॅमेरा,
पॉइंटलाइट लाईट) (
vec3 lightDirection = सामान्य करा (fragmentPos - प्रकाश. स्थिती );
फ्लोट अंतर = लांबी (fragmentPos - प्रकाश. स्थिती );
फ्लोट पॉइंट फॅक्टर = 1.0 / (1.0 + पॉव(अंतर, 2));

डायरेक्शनल लाईट टेंप डायरेक्शनल लाईट = डायरेक्शनल लाईट(
प्रकाशदिशा,
प्रकाश रंग,
प्रकाश वातावरणाची तीव्रता
प्रकाश प्रसार तीव्रता
प्रकाश specular तीव्रता
) ;
रिटर्न पॉइंट फॅक्टर * कॅल्कडायरेक्शनल लाईट(सामान्य, तुकडा टू कॅमेरा,
टेंपडायरेक्शनललाइट) ;
}

तुकड्याचे निर्देशांक आणि प्रकाश स्रोत असल्यास, आपण सदिशांच्या फरकाद्वारे दिलेल्या तुकड्याच्या प्रकाशाची दिशा सहजपणे मोजू शकता. पॉइंटफॅक्टर गुणक हे वस्तुस्थिती प्रतिबिंबित करतो की प्रकाश त्याच्या स्त्रोतापर्यंतच्या अंतराच्या वर्गासह कमी होतो (त्रिज्यावरील गोलाच्या पृष्ठभागाच्या क्षेत्रफळाच्या अवलंबित्वाच्या सूत्रानुसार). पॉइंटफॅक्टरची गणना करताना, शून्याने भागण्याची शक्यता टाळण्यासाठी विभाजकामध्ये अतिरिक्त एक जोडला जातो. यानंतर, दिशात्मक प्रकाशाप्रमाणेच सर्व गोष्टींची गणना केली जाते.

स्पॉटलाइट

या प्रकाश स्रोताचे उदाहरण म्हणजे फ्लॅशलाइट. हे बिंदू प्रकाश स्रोतासारखेच आहे, फक्त त्यास एक दिशा आणि प्रभावाचा कोन (कटऑफ):

स्ट्रक्चर स्पॉटलाइट (
vec3 दिशा;
vec3 स्थिती;
फ्लोट कटऑफ;

vec3 रंग;
फ्लोट सभोवतालची तीव्रता;
फ्लोट diffuse तीव्रता;
फ्लोट स्पेक्युलर तीव्रता; // डीबग हेतूंसाठी, 1.0 वर सेट केले जावे
} ;

संबंधित प्रक्रिया:

vec4 calcSpotLight(vec3 सामान्य, vec3 तुकड्यांना कॅमेरा,
स्पॉटलाइट लाइट) (
vec3 spotLightDirection = सामान्य करा (fragmentPos - प्रकाश. स्थिती );
float spotAngleCos = बिंदू (spotLightDirection, light. दिशा);
फ्लोट अॅटेन्युएशन = (1.0 - 1.0 * (1.0 - spotAngleCos) /
(1.0 - हलका. कटऑफ) );
float spotFactor = फ्लोट (spotAngleCos > light. cutoff ) * क्षीणन;

पॉइंटलाइट टेंपपॉइंटलाइट = पॉइंटलाइट(
प्रकाश स्थिती
प्रकाश रंग,
प्रकाश वातावरणाची तीव्रता
प्रकाश प्रसार तीव्रता
प्रकाश वातावरणाची तीव्रता
) ;
रिटर्न स्पॉटफॅक्टर * कॅल्कपॉइंटलाइट (सामान्य, तुकडा टू कॅमेरा,
टेंपपॉइंटलाइट);
}

प्रकाशाची दिशा बिंदू स्त्रोताप्रमाणेच मोजली जाते. नंतर ही दिशा आणि प्रकाश स्रोताच्या गुणधर्मांमध्ये निर्दिष्ट केलेल्या दिशा यांच्यामधील कोनाची कोसाइन मोजली जाते. अभिव्यक्ती वापरणे फ्लोट(spotAngleCos > light.cutoff)प्रकाश कठोरपणे निर्दिष्ट कोनात क्लिप केला जातो. अटेन्युएशन गुणक जोडते गुळगुळीतस्त्रोताच्या गुणधर्मांमध्ये निर्दिष्ट केलेल्या प्रकाशाच्या दिशेपासून तुकडे दूर जात असताना प्रकाशाचे क्षीणीकरण. यानंतर, सर्व गणना एका बिंदू प्रकाश स्रोतासाठी गणना करण्यासाठी कमी केली जाते.

गामा सुधारणा

फ्रॅगमेंट शेडरमधील संपूर्ण मुख्य प्रक्रिया यासारखी दिसते:

शून्य मुख्य() (
// प्रक्षेपणानंतर सामान्य दुरुस्त केले पाहिजे
vec3 normal = सामान्यीकरण (सामान्य तुकडा);
vec3 fragmentToCamera = सामान्य करा(cameraPos - fragmentPos);

vec4 directColor = calcDirectionalLight(सामान्य, तुकडा टू कॅमेरा,
दिशात्मक प्रकाश) ;
vec4 pointColor = calcPointLight(सामान्य, तुकडा टू कॅमेरा,
पॉइंटलाइट);
vec4 spotColor = calcSpotLight(सामान्य, फ्रॅगमेंटटू कॅमेरा, स्पॉटलाइट);
vec4 linearColor = टेक्सचर (टेक्चर सॅम्पलर, फ्रॅगमेंटयूव्ही) *
(vec4(materialEmission, 1) + directcolor +
पॉइंट कलर + स्पॉट कलर);

vec4 गॅमा = vec4 (vec3 (1.0 / 2.2 ) , 1 );
रंग = पॉव(रेखीय रंग, गॅमा); // गॅमा-सुधारित रंग
}

भौतिक उत्सर्जनाकडे जास्त लक्ष देऊ नका. ही सामग्रीची आणखी एक मालमत्ता आहे जी स्वतःची चमक जोडते. अनेक वस्तू स्वतःच चमकतात. इतर वस्तूंसाठी प्रकाश स्रोत म्हणून काम करणारे समान दिवे घ्या. बल्ब इतर कोणत्याही प्रकाश स्रोताने प्रकाशित केले नसले तरीही आपण त्यांना संपूर्ण अंधारात पाहू शकले पाहिजे, बरोबर?

खरोखर लक्ष देण्यास पात्र आहे गामा सुधारणा, ज्यामध्ये सर्व प्रकाश घटक 1/2.2 च्या पॉवरवर वाढवणे समाविष्ट आहे. 1.0 तीव्रता असलेला रंग 0.5 तीव्रतेच्या रंगापेक्षा दुप्पट तेजस्वी असतो असे गृहीत धरून आतापर्यंत आम्ही रेखीय रंगाच्या जागेत काम करत आहोत. समस्या अशी आहे की मानवी डोळ्याला चमक रेखीयपणे जाणवत नाही. म्हणून, वास्तववादी प्रकाशयोजना मिळविण्यासाठी, रेखीय जागेत सर्व गणना केल्यानंतर गॅमा सुधारणा करणे आवश्यक आहे.

हे लक्षात घेतले पाहिजे की प्रतिमा जतन करताना, आधुनिक ग्राफिक संपादक देखील गामा सुधारणा करतात. म्हणून, पोत वापरण्यापूर्वी, आपल्याला हे गॅमा सुधारणा रद्द करणे आवश्यक आहे. सुदैवाने, ते कठीण नाही.

टेक्सचर लोडिंग कोडमधील सर्व स्थिरांक पुनर्स्थित करणे पुरेसे आहे:

GL_COMPRESSED_RGBA_S3TC_DXT1_EXT
GL_COMPRESSED_RGBA_S3TC_DXT3_EXT
GL_COMPRESSED_RGBA_S3TC_DXT5_EXT

GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT
GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT
GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT

… अनुक्रमे. हे सूचित करेल की प्रतिमेवर गॅमा सुधारणा लागू केली गेली आहे आणि ती पूर्ववत करणे आवश्यक आहे. बाकीची काळजी OpenGL घेईल.

वास्तविक ऍप्लिकेशन्समध्ये, गॅमा पॅरामीटर (आमच्याकडे गॅमा = 2.2 आहे) प्रोग्राम सेटिंग्जमध्ये अधिक चांगले ठेवले जाते जेणेकरून वापरकर्ता, इच्छित असल्यास, त्याच्या मॉनिटरवर किंचित समायोजित करू शकेल.

निष्कर्ष

चित्रे पाहण्याची वेळ आली आहे!

येथे आपण विविध प्रकाश घटक पाहतो. डावीकडून उजवीकडे, वरपासून खालपर्यंत: पार्श्वभूमी, पसरलेले, परावर्तित, तिन्ही एकत्र. जसे आपण पाहू शकता, दृश्यात टॉरस मॉडेल जोडले गेले आहे. नॉर्मलच्या जटिल प्लेसमेंटमुळे, प्रकाश चाचणीसाठी या मॉडेलची शिफारस केली जाते.

विविध प्रकाश स्रोत. डावीकडून उजवीकडे, वरपासून खालपर्यंत: पांढरा स्पॉट लाइट, लाल स्पॉट लाइट, निळा स्पॉटलाइट, तिन्ही एकत्र.

मी पुन्हा लक्षात घेतो की समान प्रकाश पद्धती भिन्न अंमलबजावणी असू शकते. उदाहरणार्थ, तुम्ही भौतिक गुणधर्म सभोवतालच्या, पसरलेल्या आणि स्पेक्युलर रंगावर सेट करू शकता, जे तुम्हाला लाल रंगाच्या वस्तू काढण्यास अनुमती देईल जे हिरव्या रंगात पसरतात आणि निळे हायलाइट आहेत. काही Phong लाइटिंग अंमलबजावणीमध्ये मी पार्श्वभूमी प्रकाशाची गणना प्रत्येक प्रकाशाऐवजी एकदा केली असल्याचे पाहिले आहे. मी अशी अंमलबजावणी देखील पाहिली जिथे बिंदूच्या स्त्रोताचा प्रकाश फक्त त्याच्या अंतराच्या वर्गाच्या प्रमाणात (d * d) कमी होत नाही तर अधिक सामान्य सूत्रानुसार (A + B*d + C* च्या शैलीमध्ये) d*d). कोणीतरी सभोवतालची तीव्रता आणि प्रसरण तीव्रता केवळ प्रकाश स्रोताचीच नाही तर सामग्रीची देखील गुणधर्म बनवते. या सर्वांचा वास्तववादी प्रकाशयोजनेशी किती संबंध आहे याची मला खात्री नाही. पण तुम्ही हे सर्व गृहपाठ म्हणून खेळू शकता.

वर्षांची कामे. व्होलोशिन मॅक्सिमिलियन. कवीचे शौर्य. 1. परदेशी पाठवण्याच्या मजकुराप्रमाणे कविता संपादित करा: कोरडेपणा, स्पष्टता, दबाव - प्रत्येक शब्द सतर्क आहे.

कठीण आणि खडबडीत दगडावर अक्षराने अक्षरे कापण्यासाठी: शब्द जितके विरळ तितके त्यांची शक्ती अधिक तीव्र. विचारांचा स्वैच्छिक शुल्क मूक श्लोकांच्या बरोबरीचा आहे.

शब्दकोषातून “सौंदर्य”, “प्रेरणा” हे शब्द पुसून टाका - यमकांचा नीच शब्दजाल. कवीला - समज: सत्य, रचना, योजना, समतुल्यता, संक्षिप्तता आणि अचूकता. शांत, कठोर कलाकृतीमध्ये कवीची प्रेरणा आणि सन्मान आहे: मूक-बधिर गोष्टींमध्ये अतींद्रिय दक्षता तीक्ष्ण करणे. वोलोशिन M.A. लायब्ररी: ओरिओल प्रादेशिक वैज्ञानिक युनिव्हर्सल पब्लिक लायब्ररीचे नाव. I.A. बुनिना. - एम., ; निवडक कामे: 2 खंडात.

एम., ; लाल धूर: कथा. - एम., ; टोपण कंपनीकडून ग्लॅडिशेव्ह: कथा. - एम., ; एकलॉन; अपरिहार्यता: कादंबरी. त्यांनी मारी आणि उदमुर्त कवींची बरीच भाषांतरे केली. वेळोवेळी मी गद्यातही हात आजमावला. सहकारी मॅक्सिमिलियन अलेक्झांड्रोविच वोलोशिन () 20 व्या शतकाच्या पहिल्या तृतीयांश महान कवींपैकी एक आहे. तो एक प्रतिभावान कलाकार आहे, एक बहुआयामी गीतकार आहे, ज्याने प्रतीकात्मक, गूढ कवितांपासून नागरी-पत्रकारिता आणि वैज्ञानिक-तात्विक कवितेपर्यंत, मानववंशशास्त्रीय पूर्वकल्पनांद्वारे - "देवाच्या शहराच्या आदर्शापर्यंत" प्रवास केला आहे.

प्रस्तावित प्रकाशन वाचकाला केवळ व्होलोशिनच्या सर्वोत्कृष्ट काव्यात्मक कृतींबद्दलच नव्हे तर सौंदर्यशास्त्र, संस्मरण गद्य, पत्रकारिता आणि देशांच्या जीवनातील नाट्यमय घटनांशी संबंधित पत्रांवरील सर्वात मनोरंजक कृतींसह परिचित होण्याची संधी देते. लेखक. व्होलोशिन मॅक्सिमिलियन. लेखकाच्या सर्व कविता. काम. कवीचे शौर्य. 2. तारे. लेखक आणि कवितांचे आवडते संग्रह तयार करा!

समविचारी लोकांशी गप्पा मारा! पुनरावलोकने लिहा, कविता द्वंद्वयुद्ध आणि स्पर्धांमध्ये भाग घ्या! सर्वोत्तम सामील व्हा! Poembook मध्ये सामील झाल्याबद्दल धन्यवाद! खाते प्रवेश डेटासह एक पत्र तुमच्या ईमेलवर पाठवले गेले आहे!

तुम्ही २४ तासांच्या आत लॉग इन करणे आवश्यक आहे. अन्यथा, खाते हटविले जाईल! नोंदणीकृत वापरकर्त्यांना बरेच फायदे मिळतात: कविता प्रकाशित करा - तुमची प्रतिभा ओळखा! लेखक आणि कवितांचे आवडते संग्रह तयार करा! समविचारी लोकांशी गप्पा मारा! पुनरावलोकने लिहा, कविता द्वंद्वयुद्ध आणि स्पर्धांमध्ये भाग घ्या!. मॅक्सिमिलियन व्होलोशिन. वर्णन. मॅक्सिमिलियन अलेक्झांड्रोविच वोलोशिन हा 20 व्या शतकाच्या पहिल्या तृतीयांश महान कवींपैकी एक आहे.

तो एक प्रतिभावान कलाकार आहे, एक बहुआयामी गीतकार आहे, ज्याने प्रतीकात्मक, गूढ कवितांपासून नागरी-पत्रकारिता आणि वैज्ञानिक-तात्विक कवितेपर्यंत, मानववंशशास्त्रीय पूर्वकल्पनांद्वारे - "देवाच्या शहराच्या आदर्शापर्यंत" प्रवास केला आहे. प्रस्तावित प्रकाशन वाचकाला केवळ व्होलोशिनच्या सर्वोत्कृष्ट काव्यात्मक कृतींबद्दलच नव्हे तर सौंदर्यशास्त्र, संस्मरण गद्य, पत्रकारिता आणि नाटकाशी संबंधित पत्रांवरील सर्वात मनोरंजक कृतींसह परिचित होण्याची संधी देते.

निवडक कामे आणि पत्रे. एम. ए. वोलोशिन. किंमत. घासणे. मॅक्सिमिलियन अलेक्झांड्रोविच वोलोशिन हा 20 व्या शतकाच्या पहिल्या तृतीयांश महान कवींपैकी एक आहे. तो एक प्रतिभावान कलाकार आहे, एक बहुआयामी गीतकार आहे, ज्याने प्रतीकात्मक, गूढ कवितांपासून नागरी-पत्रकारिता आणि वैज्ञानिक-तात्विक कवितेपर्यंत, मानववंशशास्त्रीय पूर्वकल्पनांद्वारे - "देवाच्या शहराच्या आदर्शापर्यंत" प्रवास केला आहे.

व्होलोशिन एम.ए., द पोएट्स व्हॉलर: निवडक कामे आणि पत्रे. मालिका: रशियन क्लासिक्सची नवीन लायब्ररी: आवश्यक प्रत परेड, शहर, पृष्ठ, पुस्तकाचे वर्णन. मॅक्सिमिलियन अलेक्झांड्रोविच वोलोशिन () 20 व्या शतकाच्या पहिल्या तृतीयांश महान कवींपैकी एक आहे. तो एक प्रतिभावान कलाकार आहे, एक बहुआयामी गीतकार आहे, ज्याने प्रतीकात्मक, गूढ कवितांपासून नागरी-पत्रकारिता आणि वैज्ञानिक-तात्विक कवितेपर्यंत, मानववंशशास्त्रीय पूर्वकल्पनांद्वारे - "देवाच्या शहराच्या आदर्शापर्यंत" प्रवास केला आहे.

श्रेण्यापोस्ट नेव्हिगेशन

प्रकाश स्रोताशिवाय, प्रतिमा दृश्यमान नाही. स्त्रोत आरंभ करण्यासाठी आणि ऑब्जेक्ट्सवरील स्त्रोताच्या प्रभावाची गणना करण्यासाठी प्रोसेसर सक्षम करण्यासाठी, फक्त आज्ञा कार्यान्वित करा: glEnable(gl_lighting); // प्रकाश विश्लेषण मोड सक्षम करा

GlEnable(gl_light0); // दृश्यामध्ये विशिष्ट (शून्य) स्त्रोत समाविष्ट करा, त्याच्या वैशिष्ट्यांसह

स्त्रोत अक्षम करण्यासाठी, Disable() फंक्शन वापरा. डीफॉल्टनुसार, प्रकाश स्रोत अंतराळात निर्देशांक (0,0,∞) सह स्थित असतो. तुम्ही इमेज स्पेसमध्ये कुठेही प्रकाश स्रोत तयार करू शकता.

OpenGl लायब्ररी चार प्रकारच्या प्रकाश स्रोतांना समर्थन देते:

  • पार्श्वभूमी प्रकाश (परिवेश प्रकाश),
  • बिंदू स्रोत,
  • स्पॉटलाइट्स,
  • दूरस्थ प्रकाश स्रोत (दूरचा प्रकाश).
प्रत्येक प्रकाश स्रोताची स्वतःची वैशिष्ट्ये असतात.
प्रकाश स्त्रोताची वैशिष्ट्ये फोंग मॉडेलच्या पॅरामीटर्सशी संबंधित आहेत.
वेक्टर पॅरामीटर्स सेट करण्यासाठी, glLightfv() फंक्शन वापरा, ज्याचे खालील स्वरूप आहे:

glLightfv(स्रोत, पॅरामीटर, pointer_to_array);

चार वेक्टर पॅरामीटर्स आहेत जे स्त्रोत किरणांची स्थिती आणि दिशा आणि त्याच्या घटकांची रंग रचना - पार्श्वभूमी, प्रसार आणि स्पेक्युलर निर्धारित करतात.
OpenGL मध्ये स्केलर पॅरामीटर्स सेट करण्यासाठी, glLightf() फंक्शन वापरा:

glLightf(स्रोत, पॅरामीटर, मूल्य);

उदाहरणार्थ, आपण दृश्यामध्ये GL_LIGHT0 स्त्रोत समाविष्ट करू इच्छिता, जो बिंदूवर स्थित असावा (1.0, 2.0, 3.0). प्रोग्राममध्ये स्त्रोत स्थान एकसमान निर्देशांकांमध्ये बिंदू म्हणून जतन केले जाते:

GLfloat light0_pos=(1.0, 2.0, 3.0, 1.0);

जर या बिंदूचा चौथा घटक शून्य असेल तर बिंदूचा स्त्रोत दूरस्थ स्त्रोतामध्ये बदलतो, ज्यासाठी केवळ किरणांची दिशा महत्त्वपूर्ण असते:

GLfloat light0_dir=(1.0, 2.0, 3.0, 0.0);

पुढे, स्त्रोताच्या पार्श्वभूमी, प्रसार आणि स्पेक्युलर घटकांची रंग रचना निर्धारित केली जाते. विचाराधीन उदाहरणामध्ये जर स्त्रोतामध्ये पांढरा रंगाचा स्पेक्युलर घटक असेल आणि पार्श्वभूमी आणि प्रसार घटक लाल असले पाहिजेत, तर स्त्रोत तयार करणारा प्रोग्राम तुकडा यासारखा दिसतो:

GLfloat diffise0= (1.0, 0.0, 0.0, 1.0);

GLfloat ambient0=(1.0, 0.0, 0.0, 1.0);

GLfloat specular0=(1.0, 1.0, 1.0, 1.0);

GlEnable(GL_LIGHTING);

GlEnable(GL_LIGHT0);

GlLightfv(GL_LIGHT0, GL_POSITION, light0_pos);

GlLightfv(GL_LIGHT0, GL_AMBIENT, ambient0);

GlLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse0);

GlLightfv(GL_LIGHT0, GL_SPECULAR, specular0);

तुम्ही तुमच्या सीनमध्ये जागतिक पार्श्वभूमी प्रकाशयोजना देखील समाविष्ट करू शकता, जी कोणत्याही वैयक्तिक प्रकाश स्रोताशी संबंधित नाही. उदाहरणार्थ, जर तुम्हाला दृश्यातील सर्व वस्तू पांढर्‍या रंगाने अंधुकपणे हायलाइट करायच्या असतील, तर तुम्ही प्रोग्राममध्ये खालील कोडचा भाग समाविष्ट करावा:

GLfloat global_ambient=(0.1, 0.1, 0.1, 1.0);

GlLightModelfv(GL_LIGHT_MODEL_AMBIENT, global_ambient);

लाइटिंग मॉडेलमध्ये, स्त्रोतापर्यंतचे अंतर लक्षात घेतलेल्या शब्दाचे स्वरूप आहे:

K= 1/(a+ b*d+ c*d^2)

आणि स्थिर, रेखीय आणि चतुर्भुज घटक. प्रत्येक स्रोतासाठी संबंधित गुणांक स्केलर पॅरामीटर सेटिंग फंक्शन वापरून वैयक्तिकरित्या सेट केले जातात, उदाहरणार्थ:

GlLightf(GL_LIGHT0, GL_CONSTANT_ATTENATION, a);

पॉइंट स्रोत स्पॉटलाइटमध्ये रूपांतरित करण्यासाठी, तुम्हाला स्पॉटलाइट बीमची दिशा (GL_SPOT_DIRECTION), तीव्रता वितरण कार्य (GL_SPOT_EXPONENT) आणि बीम स्कॅटरिंग अँगल (GL_SPOT_CUTTOF) ची दिशा निर्दिष्ट करणे आवश्यक आहे. हे पॅरामीटर्स glLightf() आणि glLightfv() फंक्शन्स वापरून सेट केले आहेत.

प्रकाश स्रोतांसाठी डीफॉल्ट पॅरामीटर्स तक्ता 3 मध्ये दर्शविले आहेत.

दिवे साठी डीफॉल्ट सेटिंग्ज

तक्ता 3

पॅरामीटरचे नाव डीफॉल्ट मूल्य सामग्री
GL_AMBIENT (0.0, 0.0, 0.0, 1.0) सभोवतालच्या RGBA प्रकाशाची तीव्रता
GL_DIFFUSE (1.0, 1.0, 1.0, 1.0) डिफ्यूज RGBA प्रकाशाची तीव्रता
GL_SPECULAR (1.0, 1.0, 1.0, 1.0) प्रकाशाची विशिष्ट RGBA तीव्रता
GL_POSITION (0.0, 0.0, 1.0, 0.0) (x, y, z, w) प्रकाशाची स्थिती
GL_SPOT_DIRECTION (0.0, 0.0, -1.0) (x, y, z) स्पॉटलाइटची दिशा
GL_SPOT_EXPONENT 0.0 स्पॉटलाइट घातांक
GL_SPOT_CUTOFF 180.0 स्पॉटलाइट कटऑफ कोन
GL_CONSTANT_ATTENUATION 1.0 सतत क्षीणता घटक
GL_LINEAR_ATTENUATION 0.0 रेखीय क्षीणन घटक
GL_QUADRATIC_ATTENUATION 0.0 चतुर्भुज क्षीणन घटक