2011-08-23 10 views
6

अगर मैं गलत हूं तो कृपया मुझे सही करें। वर्टेक्स और पिक्सेल शेडर्स का उपयोग करते समय, हम आमतौर पर वर्टेक्स शेडर के आउटपुट gl_position की गणना करने के लिए कोड प्रदान करते हैं। फिर, हमें पिक्सेल शेडर में इनपुट gl_FragCoord के साथ ouselves मिलते हैं। gl_prosition से gl_FragCoord की गणना करने के लिए OpenGL द्वारा किए गए संचालन का नाम क्या है? क्या यह सही है कि वे "प्रक्षेपण" और "क्लिप समन्वय परिवर्तन" हैं? फिर, उन परिचालनों के दौरान परिवर्तन वास्तव में क्या प्रदर्शन करते हैं? अन्य शर्तों में, gl_FragCoord और gl_position के बीच गणितीय संबंध क्या है, जिसे मैं ओपनजीएल फ़ंक्शन को प्रतिस्थापित करने के लिए उपयोग कर सकता हूं?glsl में, gl_fragCoord gl_position से गणना करने के लिए प्रयुक्त सूत्र क्या है?

किसी भी योगदान के लिए आपको बहुत बहुत धन्यवाद।

+0

मुझे थोड़ी देर पहले एक ही समस्या और प्रश्न था, और मैंने इसे "ओपनजीएल: जीएलएसएल में विंडो स्पेस समन्वय से आंख अंतरिक्ष समन्वय की गणना करें" सवाल में जवाब दिया है, जिसे आप दाईं ओर एक लिंक पा सकते हैं। – karx11erx

+0

क्षमा करें karx11erx, यह वही नहीं है जो मैं चाहता हूं। असल में, मुझे लगता है कि मैं जो चाहता हूं वह विपरीत है। मैं "अप्रचलित" नहीं करना चाहता, मैं 2 डी स्क्रीन निर्देशांक में अपने 3 डी निर्देशांक प्रोजेक्ट करना चाहता हूं। – wil

+0

आप देख सकते हैं कि वहां भी ऐसा कैसे करें, क्योंकि शेडर पहले अप्रचलित (प्रकाश दृश्य स्थान से) और फिर परियोजनाओं (दर्शक स्क्रीन स्थान पर)। – karx11erx

उत्तर

9

gl_Position पोस्ट-प्रोजेक्शन समरूप समन्वय में है।

कि gl_Position, (4d) एक शिखर की स्थिति है, जबकि gl_FragCoord (2 डी) एक टुकड़ा की स्थिति है यह ध्यान देने योग्य है।

संचालन में होने के बीच

  1. आदिम विधानसभा (3 कोने से एक त्रिकोण उत्पन्न करने के लिए, उदाहरण के लिए) कर रहे हैं
  2. कतरन (यानी कई त्रिकोण उस दृश्य के अंदर सभी पर हैं में त्रिकोण में कटौती, अगर यह शुरू में फिट नहीं करता है)
  3. व्यूपोर्ट आवेदन
  4. रैस्टराइज़ेशन (उन त्रिकोण लेने के लिए और उन लोगों से कवर टुकड़े)
उत्पन्न

तो, जब आप व्यूपोर्ट के 2 डी स्पेस में कशेरुक स्थिति से दर्शाए गए मनमानी बिंदु को बदलने के लिए सूत्र ढूंढ सकते हैं, तो यह स्वयं में और उपयोगी नहीं है, क्योंकि जेनरेट किए गए टुकड़े सीधे संरेखित नहीं होते हैं vertex स्थिति। वर्टेक्स के 2 डी समन्वय प्राप्त करने के लिए सूत्र

2d_coord_vertex = viewport.xy + viewport.wh * (1 + gl_Position.xy/gl_Position.w)/2 

फिर से, यह gl_FragCoord नहीं है। यदि आप अधिक गहन ज्ञान चाहते हैं तो जीएल विनिर्देश में रास्टरराइजेशन पर विवरण देखें।

मुझे यकीन नहीं है कि "ओपनजीएल फ़ंक्शन को प्रतिस्थापित करें" से आपका क्या मतलब है, लेकिन रास्टरराइजिंग गैर-तुच्छ है, और एक SO उत्तर के दायरे से बाहर रास्ता है।

+0

आपके उत्तर के लिए धन्यवाद। मेरा उद्देश्य छाया नक्शा प्रकाश व्यवस्था शेडर को लागू करना है। मैंने प्रकाश स्थिति (प्रकाश के "प्रक्षेपण मैट्रिक्स" का उपयोग करके) को दृश्य प्रस्तुत करके गहराई का नक्शा (छाया मानचित्र) बनाया है, हालांकि अंतिम दृश्य के शिखर को प्रस्तुत करते समय मुझे नहीं पता कि मानचित्र से छाया डेटा लाने के लिए कौन से निर्देशांक उपयोग करना है । मैंने सोचा था कि जब मैं छाया मानचित्र बनाता हूं, तो gl_position के मान को प्राप्त करने के लिए मैं प्रकाश के "प्रक्षेपण मैट्रिक्स" का उपयोग कर सकता हूं, और फिर उस स्थिति की गणना कर सकता हूं जो gl_fragCoord था जब मैंने छाया स्थिति बनाई, सही स्थिति पर छाया डेटा लाने के लिए। क्या यह काम कर सकता है? – wil

+0

@ विल: ऐसा करने का सामान्य तरीका एक दुनिया को पार करना या ग्राउंड_Position (एक अलग आउटपुट में) के साथ स्पेस स्थिति को टुकड़ा शेडर में देखना है। इस तरह, टुकड़े टुकड़े में, सही इंटरपोलेटेड स्थिति (दृश्य या विश्व स्थान, जो आपने पारित किया है उसके आधार पर), इसे मैट्रिक्स द्वारा परिवर्तित किया जा सकता है ताकि इसे वापस प्रकाश स्थान पर लाया जा सके। संक्षिप्त जवाब है, gl_FragCoord पर भरोसा न करें, आपको जो चाहिए उसे पास करें। – Bahbar

+0

मुझे यकीन नहीं है कि आप वास्तव में क्या कर रहे हैं, लेकिन यह छाया मानचित्र की गणना करने की तरह नहीं लगता है। यही वह बात है जिसका मैं जिक्र कर रहा था, और आपकी अपनी चीज़ के लिए काफी अलग लगता है। मैं एक नया प्रश्न खोलने की सिफारिश करता हूं, कुछ अंतर्दृष्टि के साथ _what_ जिसे आप हल करने का प्रयास कर रहे हैं – Bahbar

संबंधित मुद्दे