मैं एक ओपनजीएल ईएस 2.0 ऐप लिख रहा हूं जो एक 3 डी द्वीप प्रस्तुत करता है। मेरे पास पहले से ही द्वीप के चारों ओर एक आकाश गुंबद उत्पन्न करने के लिए कोड है। यह एक गोलार्ध है जिसमें त्रिभुज होते हैं जो द्वीप को ज़ेड पॉइंट ऊपर के साथ रखते हैं।मैं एक दृढ़ स्काईडोम कैसे प्रस्तुत करूं?
गुंबद में कुछ बहुत ही बुनियादी चलने वाले बादल हैं जो एक पेर्लिन शोर बनावट का उपयोग करके स्वयं को ओवरलैड करते हैं और विभिन्न गति को आगे बढ़ाते हैं।
लेकिन अंतत मैं गुंबद की जरूरत भी प्रस्तुत करना:
- सूर्य (जो आसमान में पटरियों) चंद्रमा (चरण सहित)
- सितारे (रात में)
- एक स्थिर बनावट के रूप में दूर भूमि
- विभिन्न रंग रात, सुबह, शाम, दिन अनुकरण
मैं काफी कुशलता से ऐसा करने की जरूरत है, क्योंकि यह खत्म हो जाएगा ओ एन एंड्रॉइड हालांकि इस पल के लिए यह एक परीक्षण दोहन में चल रहा है। तो उदाहरण के लिए सूर्य, चंद्रमा और सितारे सिर्फ बनावट होंगे हालांकि उनके अंक उचित सटीकता के साथ प्लॉट किए जा सकते हैं।
मेरे पास पहले से ही गुंबद उत्पन्न करने के लिए कोड है, और एक तिथि और समय के खिलाफ सूर्य को साजिश करने के लिए कोड है। इसलिए ज्यादातर इसकी जरूरत वाले शेडर्स और उन्हें क्या आपूर्ति की जाती है।
क्या कोई ऐसा उदाहरण है जो इन चीजों को प्रदर्शित करता है? मुझे बहुत कुछ मिला है जो मूल घन मानचित्र, या सीमित सामान करते हैं, लेकिन मुझे परिष्कार के स्तर के लिए कुछ भी नहीं चाहिए। जाहिर है क्योंकि यह ओपनजीएल ईएस 2.0 है, इसे शेडर्स में किया जाना है।
मेरे मौजूदा आकाश गुंबद के लिए शेडर बादलों को अनुकरण करने के लिए पर्लिन शोर की 2 परतें प्रस्तुत करता है। बनावट लगातार लपेटती है ताकि मैं गुंबद के कशेरुक के कोण पर एक्सई प्लेन (एक्स और वाई को एटान में खिलाकर) और गुंबद के वर्टेक्स जेड का उपयोग करके वी ऑफसेट में यू ऑफसेट की गणना कर सकूं।
शिखर शेडर दर्शाता है कि कैसे मैं यह कर:
#ifdef GL_ES
precision mediump float;
precision mediump int;
#endif
attribute vec4 aVertex;
uniform mat4 uPMVMatrix;
uniform float uTime;
uniform float uSkyDomeRadius;
const float PI = 3.1415926535897932384626433832795;
varying vec2 texCoord0, texCoord1;
void main()
{
vec2 centre = vec2(600., 600.);
gl_Position = uPMVMatrix * aVertex;
float slow_time = uTime/100.;
vec2 dome_point = aVertex.xy - centre;
float tex_u = atan(dome_point.x, dome_point.y);///(.25 * PI);
float tex_v = aVertex.z/(uSkyDomeRadius * .5);
texCoord0 = vec2(tex_u/2.0 + slow_time, tex_v/2.0);
texCoord1 = vec2(tex_u + slow_time/2.0, tex_v);
}
मैं भी एक समय का उपयोग यू थोड़ा प्रत्येक फ्रेम की भरपाई के लिए तो बादलों चलते हैं। यह ठीक काम करता है कि एटान -पीआई से पीआई तक जाता है और अचानक texCoord0 और texCoord1 मानों को खंडित शेडर इंटरपोलेट्स को एक बड़ी दूरी से अलग किया जाता है जो इंटरपोलेशन को खो देता है।
इसका वर्णन करने का सबसे अच्छा तरीका यह है कि यदि मेरे पास मेरे आधार पर 16 त्रिकोण हैं तो 0/16 से 1/16 कार्यों में इंटरपोलेशन, 1/16 से 2/16 काम करता है और इसी तरह। लेकिन जब मैं 15/16 से 0/16 तक जाता हूं तो इंटरपोलेटर पीछे की तरफ जाता है और बड़ी भिन्नता से टुकड़े टुकड़े करने के कारण एक छोटी सी जगह में बनावट को दोहराया जाता है।
मैं एक सहज 360 अंश दृश्य मुझे लगता है कि एक ही रास्ता मैं इसे ठीक कर देंगे अगर मैं पूरे गुंबद बारी बारी से इतना सीवन कैमरे के पीछे हमेशा होता है है के लिए किसी भी तरह से नहीं देख सकते हैं लेकिन यह अभी भी हो सकता है दिखाएं कि कैमरा सीधे गुंबद के शीर्ष तक इंगित करता है या नहीं।
स्रोत के साथ एक कामकाजी उदाहरण बहुत अच्छा होगा, खासकर यदि यह इस तरह के मुद्दों को संबोधित करता है।
बेवकूफ सवाल लेकिन tex_x होना> पीआई या <-PI – BevynQ
tex_x हमेशा पीआई और -पीआई के बीच होगा क्योंकि एटान उन मानों को वापस कर देता है। मेरे पास गुंबद के आधार पर 16 त्रिकोण हैं, इसलिए प्रत्येक त्रिभुज आधार 2 पीआई/16 या पीआई/8 की चाप निर्धारित करता है। इसलिए v0 3/16 वें स्थान और v1 4/16th हो सकता है और इसलिए tex_x ठीक से इंटरपोलेट करता है। मुद्दा तब आता है जब v0 15/16 थे और v1 0/16 थे और इंटरपोलेशन पूरी तरह से खराब हो गया था। मैं इसे ठीक से ठीक करने के किसी भी तरीके से नहीं सोच सकता, इसलिए मैं अनुमान लगा रहा हूं कि मुझे गुंबद को घूमना होगा ताकि सीम हमेशा कैमरे के पीछे हो और जो कुछ भी मैं बराबर राशि से प्रस्तुत करता हूं उसे ऑफ़सेट कर दूं। – locka
मैंने इसे स्पष्ट करने के लिए प्रश्न को अद्यतन किया और tex_x और tex_y को tex_u और tex_v – locka