2012-02-11 11 views
13

मैं एक शौक परियोजना के रूप में एक खान परियोजना के रूप में काम कर रहा हूं यह देखने के लिए कि आधुनिक हार्डवेयर और ओपनजीएल> = 3. पर वोक्सेल इलाकों की अवधारणा को कितनी दूर धकेल दिया जा सकता है। इसलिए, मेरी सभी ज्यामिति में क्वाड, या वर्ग होते हैं सटीक।एक ट्रैक्टर पर मानक के bilinear interpolation कैसे करें?

मैंने परिवेश के प्रक्षेपण का अनुमान लगाने के लिए एक रेकास्टर बनाया है, और प्रकाश व्यवस्था करने के लिए "झुकाव मानक" की तकनीक का उपयोग किया है। तो मेरे आदर्श क्वाड के लिए लंबवत नहीं हैं, न ही उनके पास इकाई की लंबाई है; बल्कि, वे मोटे तौर पर उस स्थान की तरफ इशारा करते हैं जहां कम से कम प्रकोप हो रहा है, और जब कमर को कम रोशनी मिलती है तो कम होते हैं। इस तकनीक का लाभ यह है कि इसे केवल एक बार की गणना की आवश्यकता होती है, और अनिवार्य रूप से समय प्रस्तुत करने में नि: शुल्क है।

हालांकि, जब मैं चिकनी रोशनी प्राप्त करने के लिए एक ही ट्रैक्टर के विभिन्न शीर्षकों को अलग-अलग मानदंडों को आवंटित करने का प्रयास करता हूं तो मैं परेशानी में पड़ता हूं।

Diagonal lines visible in the rendered result

समस्या यह है कि ओपन barycentric का उपयोग करता है: क्योंकि ट्रैक्टर त्रिकोण में विभाजित है, और रैखिक प्रक्षेप प्रत्येक त्रिकोण से अधिक होता है, प्रक्षेप का परिणाम स्पष्ट रूप से बदसूरत विकर्ण कलाकृतियों के रूप में त्रिकोण की उपस्थिति को दर्शाता प्रत्येक त्रिकोण पर इंटरपोलेशन, जो 4 कोनों में से 3 से अधिक भारित योग है। आदर्श रूप से, मैं बिलीनेर इंटरपोलेशन का उपयोग करना चाहता हूं, जहां परिणाम की गणना करने में सभी 4 कोनों का उपयोग किया जा रहा है। एक 2x2 आरजीबी बनावट में

  1. सामग्री Normals, और बनावट प्रोसेसर द्विरेखीय प्रक्षेप करते हैं:

    मैं कुछ समाधान के बारे में सोच सकते हैं। यह टुकड़े टुकड़े में एक बनावट लुकअप की लागत पर होता है। मुझे दक्षता के लिए इन सभी मिनी-बनावट को बड़े पैमाने पर पैक करने की भी आवश्यकता होगी।

  2. प्रत्येक चरम पर सभी 4 मानक संलग्न करने के लिए वर्टेक्स विशेषताओं का उपयोग करें। प्रत्येक वर्टेक्स में कुछ [0..1] गुणांक संलग्न करें, बनावट निर्देशांक की तरह, और टुकड़े टुकड़े में बिलीनेर इंटरपोलेशन करें। यह शेडर करने के लिए 4 normals गुजर बजाय सिर्फ 1.

की मुझे लगता है कि इन दोनों तकनीकों काम करने के लिए बनाया जा सकता है की कीमत पर होता है, लेकिन वे मेरे कुछ है कि बहुत सरल होना चाहिए के लिए kludges के रूप में हड़ताल। हो सकता है कि मैं किसी भी तरह के मानदंडों को बदल सकता हूं, ताकि ओपनजीएल का इंटरपोलेशन परिणाम देगा जो इस्तेमाल किए गए विशेष त्रिभुज पर निर्भर नहीं है।

(ध्यान दें कि समस्या normals के लिए विशिष्ट नहीं है, यह रंग या किसी अन्य मूल्य सुचारू रूप से एक ट्रैक्टर भर अंतर्वेशित किए जाने की जरूरत है कि करने के लिए समान रूप से लागू होता है।)

कोई भी विचार और कैसे इस समस्या के दृष्टिकोण के लिए? यदि नहीं, तो ऊपर की दो तकनीकों में से कौन सा सबसे अच्छा होगा?

उत्तर

4

जैसा कि आप स्पष्ट रूप से समझते हैं, जीएल जो त्रिकोण इंटरपोलेशन करेगा वह वह नहीं है जो आप चाहते हैं। तो सामान्य डेटा सीधे कशेरुक डेटा से नहीं आ रहा है।

मुझे डर है कि आप जिन समाधानों को कल्पना कर रहे हैं, वे सबसे अच्छे हैं जो आप प्राप्त कर सकते हैं। और इससे कोई फर्क नहीं पड़ता कि आप क्या चुनते हैं, आपको [0..1] गुणांक से उत्तराधिकारी को शेडर तक ले जाना होगा (2x2 बनावट सहित। आपको उन्हें बनावट निर्देशांक के लिए चाहिए)।

कुछ ऐसी चीजें हैं जो आप प्रक्रिया को सरल बनाने के लिए कर सकते हैं, हालांकि।

  • वर्टेक्स आईडी का उपयोग करने से आप वर्टेक्स "कोने" को चरम से गुजरने वाले शेडर (हमारे [0..1] मानों) से गुजरने में मदद कर सकते हैं। सबसे कम 2 बिट्स पर एक साधारण बिट टेस्ट आपको वास्तविक कशेरुक डेटा इनपुट के बिना, किस कोने को पारित करने के बारे में बता सकता है। यदि बनावट डेटा पैकिंग है, तो आपको अभी भी बनावट के अंदर एक पहचानकर्ता पास करने की आवश्यकता है, इसलिए यह म्यूट हो सकता है।
  • यदि आप इंटरपोलेशन की अनुमति देने के लिए 2x2 बनावट का उपयोग करते हैं, तो कुछ मिलचास (थे?) हैं। कुछ बनावट इंटरपोलेटर एक उच्च परिशुद्धता इंटरपोलेशन नहीं देते हैं यदि स्रोत कम परिशुद्धता में शुरू होता है। बैंडिंग कलाकृतियों से बचने के लिए आपको बनावट डेटा प्रकार को उच्च परिशुद्धता में बदलने की आवश्यकता हो सकती है।
0

खैर ... के रूप में आप बेंट normals तकनीक का उपयोग कर रहे हैं, परिणाम को बढ़ाने के लिए सबसे अच्छा तरीका है पूर्व tessellate जाल और फिर से गणना की जाली के साथ उच्च चौकोर साथ है।

एक और तरीका पिक्सेल शेडर के भीतर कुछ चाल होगी ... एक संभावित तरीका - आप वास्तव में पिक्सेल शेडर में बनावट (अंतर्निहित इंटरपोलेटर का उपयोग नहीं) कर सकते हैं, जो आपको बहुत मदद कर सकता है। और आप केवल बिलीनेर इंटरपोलेशन तक सीमित नहीं हैं, आप बेहतर कर सकते हैं, एफ.ई. बाइबिक इंटरपोलेशन;)

+0

मैं जाल घनत्व में वृद्धि नहीं करना चाहता, क्योंकि मैं जितना संभव हो उतने ब्लॉक को धक्का देने की कोशिश कर रहा हूं। मुझे पता है कि खुद को बनावट कैसे विभाजित करना है, लेकिन अगर मैं इसकी मदद कर सकता हूं तो मैं अपने आदर्शों को बनावट में संग्रहित नहीं करना चाहता - इसलिए यह सवाल! – Thomas

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