ओपेंगल पर प्रकाश को समझने की कोशिश कर रहा है, यथार्थवादी सूरज की रोशनी का अनुकरण कैसे करें?


13

मुझे नहीं पता कि मैं कुछ गलत कर रहा हूं या कुछ भी याद कर रहा हूं, लेकिन मैं धूप में दिन की तरह सूरज की रोशनी का अनुकरण करना चाहता हूं।

जब ऑब्जेक्ट दिशात्मक प्रकाश का सामना कर रहा है, तो यह अच्छी तरह से जलाया जाता है और वहां कोई समस्या नहीं है। अगर मैं ऑब्जेक्ट के चारों ओर जाता हूं और इसे वापस देखता हूं, तो यह अंधेरा है। यह बहुत अंधेरा नहीं है क्योंकि मैं उपयोग कर रहा हूं GL_AMBIENTलेकिन यह अभी भी एक धूप दिन के लिए बहुत अंधेरा है। यदि मैं मूल्य बढ़ाता हूं, तो यह कभी भी बेहतर नहीं होगा क्योंकि प्रकाश का सामना करने वाली वस्तु का पक्ष बहुत उज्ज्वल होगा।

और परिवेश प्रकाश के साथ एक और कष्टप्रद मुद्दा है, जब ऑब्जेक्ट के पीछे की ओर देखते हुए, मैं किसी भी आकार, केवल एक सादे रंग नहीं देख सकता। व्याख्या करना कठिन है, यहाँ कुछ चित्र हैं:

ऑब्जेक्ट फ्रंट: http://i.stack.imgur.com/YW53X.png
ऑब्जेक्ट बैक: http://i.stack.imgur.com/Qufha.png

जैसा कि आप आसानी से देख सकते हैं, सामने की तरफ अच्छा दिखता है, आप उस लाल चीज़ का आकार देख सकते हैं। पीछे की तरफ, यह सीधा है, आप एक ही आकार नहीं देख सकते।

अब, मुझे पता है कि मैं एक वस्तु के पीछे देख रहा हूं और मैं प्रकाश की दिशा में देख रहा हूं और यह सामने की तरफ से गहरा होना चाहिए। लेकिन यह इस तरह सादा नहीं दिखना चाहिए। ऐसा नहीं है कि जब हम किसी वस्तु को देखते हुए सूर्य प्रकाश के खिलाफ जाते हैं, तो हम देखते हैं कि वस्तुएं कुछ आकृति बनाती हैं।

OpenGL पर मेरा (या समान) प्रभाव कैसे हो सकता है?

मेरा प्रकाश वर्तमान में इस तरह परिभाषित किया गया है:

float posLight0[4] = {-1.0f, 1.0f, 1.0f, 0.0f};
float ambLight0[4] = {0.5f, 0.5f, 0.5f, 0.5f};

glLightfv(GL_LIGHT0, GL_POSITION, posLight0);
glLightfv(GL_LIGHT0, GL_AMBIENT, ambLight0);

मेरा सुझाव है कि यदि संभव हो तो आप शेड का उपयोग करने पर विचार करें। ओपनजीएल फिक्स्ड-फंक्शन पाइपलाइन एक काफी सरल प्रकाश मॉडल का उपयोग करता है, जबकि शेड्स आपको मैथ्स पर पूर्ण नियंत्रण देते हैं।
अतुल्य भिक्षु

जवाबों:


11

परिवेश प्रकाश के साथ आपकी वस्तुएं बहुत चमकीली दिखाई देती हैं क्योंकि विसरित प्रकाश को परिवेश प्रकाश में जोड़ा जाता है, और फैलाने वाली प्रकाश 1.0 में चूक हो जाती है। यह 1.5 तक जोड़ता है, और 1.0 से ऊपर का सब कुछ क्लैंप किया गया है। फैलाना प्रकाश को 0.5 पर सेट करें:

float difLight0[4] = {0.5f, 0.5f, 0.5f, 1.0f};
glLightfv(GL_LIGHT0, GL_DIFFUSE, difLight0);

दूसरी समस्या को हल करना कठिन है। आप सतह पर कुछ ठीक विवरण जोड़ने की कोशिश कर सकते हैं जैसे कि बनावट या बम्प मानचित्र। ओपनजीएल में परिवेश प्रकाश स्थिर है, लेकिन वास्तविक दुनिया में ऐसा कभी नहीं होता है। वास्तविक दुनिया का अनुकरण करने के लिए, कुछ प्रकार के वैश्विक रोशनी समाधान की आवश्यकता है। परिवेश रोड़ा यहाँ बहुत मदद करता है, लेकिन केवल OpenGL राज्यों को स्थापित करने की तुलना में लागू करना कठिन है। आप अपने 3D मॉडलिंग सॉफ़्टवेयर में अपने मॉडल के शीर्ष पर परिवेश रोड़ा सेंक सकते हैं या SSAO का उपयोग कर सकते हैं , लेकिन मैं विवरण में नहीं जा रहा हूं।

जो आप आसानी से कर सकते हैं, वह किसी अन्य दिशा (जैसे विपरीत दिशा) से एक और डिमर प्रकाश स्रोत जोड़ सकता है। यह यथार्थवादी नहीं होगा, लेकिन कम से कम यह आपकी वस्तुओं के पीछे के पक्षों के लिए भी कुछ आकार देगा।

अपने एप्लिकेशन में स्पेक्युलर हाइलाइट्स जोड़ने पर भी विचार करें। यह वस्तुओं को चमकदार बना देगा।

float specLight0[4] = {0.5f, 0.5f, 0.5f, 1.0f};
glLightfv(GL_LIGHT0, GL_SPECULAR, specLight0);
glMaterialfv(GL_FRONT, GL_SHININESS, 10.0f); // Shininess between 0 and 128

आप हल्के और भौतिक रंगों को अलग-अलग भी निर्दिष्ट कर सकते हैं, खासकर अगर चूक आपके लिए उपयुक्त नहीं हैं।


तो वहाँ कोई आसान और सीधा तरीका है कि मैं क्या करना चाहता हूँ OpengGL में ... बहुत बुरा है। हो सकता है कि मैं एक और प्रकाश स्रोत जोड़ने की कोशिश करूं, लेकिन मैं वास्तव में प्रकाश की तीव्रता को कैसे निर्दिष्ट करूं?
rfgamaral

GL_SPECULARऔर GL_SHININESSहालांकि ... मैं बदल दिया किसी भी प्रभाव उत्पन्न करने के नहीं लग रहे glMaterialfvकरने के लिए glMaterialiहै क्योंकि यह संकलन नहीं किया गया। और 128 की तरह एक बड़ा मूल्य भी आजमाया। यह मुझे भी ऐसा ही लगता है ... शायद समस्या मेरे लोडेड मॉडल (obj / mtl) पर है, इस पर एक नज़र डालनी होगी।
rfgamaral

1
@Nazgulled अभी जाँच की है कि light0 स्पेक्युलर 1.0 तक डिफॉल्ट करता है, लेकिन मैटीरियल स्पेकुलेट्स 0.0 से डिफॉल्ट करता है। तो glLightfv (GL_LIGHT0, GL_SPECULAR, specLight0) बदलें; to glMaterialfv (GL_FRONT, GL_SPECULAR, specLight0); यह GlLightModeli (GL_LIGHT_MODEL_LOCAL_VIEWER, GL_TRUE) सेट करना भी अच्छा है; या कैमरा के घूमने पर स्पेक्युलर की गलत गणना की जा सकती है।
एमएसल

1
@Nazgulled द्वितीयक प्रकाश के लिए, परिवेश और स्पेक्युलर को शून्य और कुछ छोटे मूल्य जैसे 0.2 को फैलाना के लिए सेट करें। आप सभी लाइट्स के परिवेश को शून्य पर सेट कर सकते हैं और इसके बजाय GL_LIGHT_MODEL_AMBIENT के साथ वैश्विक परिवेश का उपयोग कर सकते हैं।
एमएसल

2

ओपेनग्ल की एंबियंट लाइट एक सिंगल कलर है, लेकिन वास्तविक दुनिया में एंबियंट लाइट आमतौर पर ऊपर से नीचे और नीचे से अधिक चमकदार होती है। आप OpenGL में इसे परिवेशी प्रकाश को बहुत गहरे नीले रंग में सेट करके, और नीचे की ओर इंगित करते हुए गहरे नीले रंग की दिशात्मक प्रकाश को जोड़कर अनुमानित कर सकते हैं। वह, साथ ही एक चमकदार सफेद दिशात्मक प्रकाश जहां से सूरज आ रहा है, सड़क पर प्रकाश को अच्छी तरह से अनुमानित कर सकता है।

आपको वास्तव में क्या करना चाहिए एक ऐसा शेडर लिखना है जो प्रति पिक्सेल प्रकाश की गणना करता है, लेकिन वहां से जहां आप थोड़ा समय लेने जा रहे हैं।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.