2009-03-19 13 views
18

मैं एक बनावट एटलस का चयन कैसे दोहरा सकता हूं?केवल एक बनावट एटलस के चयन को दोहराने के लिए GL_REPEAT का उपयोग कैसे करें? (ओपनजीएल)

GLfloat textureCoords[]= 
{ 
    .1f, .1f, 
    .3f, .1f, 
    .1f, .3f, 
    .3f, .3f 
}; 

तो मुझे लगता है कि स्प्राइट N बार एक त्रिकोण पट्टी (या ट्रैक्टर) द्वारा परिभाषित करने के लिए दोहराना चाहते हैं:

उदाहरण के लिए, मेरी स्प्राइट (चयन) बनावट भीतर निर्देशांक है

GLfloat vertices[]= 
{ 
    -100.f, -100.f, 
    100.f, -100.f, 
    -100.f, 100.f, 
    100.f, 100.f 
}; 

मुझे पता है कि GL_REPEAT के साथ इसका कुछ संबंध है और बनावट को [0,1] सीमा पारित करने के लिए कुछ है। हालांकि यह काम नहीं करता है: (दोहराने की कोशिश कर रहा एन = 10)

GLfloat textureCoords[]= 
{ 
    10.1f, 10.1f, 
    10.3f, 10.1f, 
    10.1f, 10.3f, 
    10.3f, 10.3f 
}; 

हम बार-बार हमारी पूरी बनावट एटलस देख रहे हैं ...

मैं इस सही तरीके से करना होगा?

उत्तर

18

यह प्रश्न में वर्णित तरीके से नहीं किया जा सकता है। ओपनजीएल के बनावट समन्वय मोड केवल पूरे बनावट के लिए आवेदन करते हैं।

आम तौर पर, एक बनावट को दोहराने के लिए, आप एक बहुभुज को आकर्षित करेंगे जो आपके बनावट से "बड़ा" है। उदाहरण के लिए, यदि आपके पास एक स्क्वायर बनावट थी जिसे आप एक बड़े क्षेत्र में कई बार दोहराते हैं (छः कहते हैं), तो आप एक आयत खींचेंगे जो कि चौड़ाई जितना लंबा होगा उतना लंबा होगा। फिर आप बनावट निर्देशांक (0,0) - (6,1), और बनावट मोड को "दोहराने" के लिए सेट करेंगे।बहुभुज में इंटरपोलेट करते समय, बनावट समन्वय जो 1 से अधिक हो जाता है, पुनरावृत्ति सक्षम होने के कारण, बनावट में "चारों ओर लपेटें", जिसके कारण आयत में छः गुना मैप किया जा सकता है।

कोई भी बनावट रैप मोड प्रश्न में वर्णित ऑपरेशन के प्रकार का समर्थन नहीं करता है, यानी वे सभी पूर्ण [0,1] रेंज पर नक्शा करते हैं, कुछ मनमानी सबसेट नहीं। जब आप बनावट के केवल एक हिस्से का उपयोग कर बना रहे हैं, तो उसमें बड़े बनावट को समन्वयित करने का कोई तरीका नहीं है जिससे ओपनजीएल इसे केवल उप-आयत के अंदर दोहराता है।

आपके मूल रूप से दो विकल्प हैं: या तो एक नया बनावट बनाएं जिसमें केवल मौजूदा बनावट से आपको स्प्राइट की आवश्यकता हो या बनावट निर्देशांक को उचित रूप से मैप करने के लिए एक जीएलएसएल वर्टेक्स प्रोग्राम लिखें।

+0

आपके योगदान के लिए "अनइंड", "जिमी जे" और "ट्रेमेन" के लिए धन्यवाद। मैंने आपके उत्तरों को वोट दिया और इस जवाब को आपके द्वारा संकलित किया जो अब बहुत अच्छी तरह से वर्णन करता है कि क्या हो रहा है। – Kriem

+2

> "या बनावट निर्देशांक को उचित रूप से मैप करने के लिए एक जीएलएसएल वर्टेक्स प्रोग्राम लिखें।" इसके बजाय * टुकड़ा * कार्यक्रम होना चाहिए। –

+0

यह निर्भर करता है, सार्ज। एक टेस्सेलेशन तकनीक का उपयोग खंड से अधिक vertex है। और आप आमतौर पर बनावट शेडर में बनावट समन्वय गणना नहीं कर सकते हैं - विशेष रूप से टाइल आधारित स्थगित प्रतिपादन के साथ। –

6

मुझे यकीन नहीं है कि आप ऐसा कर सकते हैं। मुझे लगता है कि ओपनजीएल के बनावट समन्वय मोड केवल पूरे बनावट के लिए आवेदन करते हैं। एटलस का उपयोग करते समय, आप "उप-बनावट" का उपयोग कर रहे हैं, ताकि आपके बनावट निर्देशांक 0 और 1 के करीब न आएं, सामान्य सीमाएं जहां रैपिंग और क्लैंपिंग होती है।

इस से निपटने के लिए एक्सटेंशन हो सकते हैं, मैंने चेक नहीं किया है।

संपादित करें: आम तौर पर, एक बनावट को दोहराने के लिए, आप एक बहुभुज को आकर्षित करेंगे जो आपके बनावट से "बड़ा" है। उदाहरण के लिए, यदि आपके पास एक स्क्वायर बनावट थी जिसे आप एक बड़े क्षेत्र में कई बार दोहराते हैं (छः कहते हैं), तो आप एक आयत खींचेंगे जो कि चौड़ाई जितना लंबा होगा उतना लंबा होगा। फिर आप बनावट निर्देशांक (0,0) - (6,1), और बनावट मोड को "दोहराने" के लिए सेट करेंगे। बहुभुज में इंटरपोलेट करते समय, बनावट समन्वय जो 1 से अधिक हो जाता है, पुनरावृत्ति सक्षम होने के कारण, बनावट में "चारों ओर लपेटें", जिसके कारण आयत में छः गुना मैप किया जा सकता है।

यह छवियों के बिना व्याख्या करने के लिए थोड़ा सा कच्चा है।

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

+0

हम्म, उदाहरण के लिए GL_CLAMP मोड समन्वय एक बनावट के कुछ हिस्सों पर लागू होते हैं, सब-बनावट आप का वर्णन कर रहे हैं को प्रभावित करता है मुझे विचार बनावट के लिए अग्रणी एटलस। या मैं यहाँ गलत हूँ? (बेशक, यह देखते हुए कि मैं जिस तरह से चाहता हूं उसे दोहराना नहीं कर सकता, मेरा तात्पर्य है कि मैं वास्तव में गलत हूं :)) – Kriem

-3

नहीं किया जा सकता है ...

+8

यह आपकी निश्चित पाइपलाइन बात कर रही है। – Kyle

5

बनावट रैप मोड में से कोई भी आपरेशन की तरह आप देख रहे हैं पूर्ण [0,1] श्रृंखला के लिए सभी नक्शे समर्थन करते हैं, वे यानी, नहीं कुछ मनमाने ढंग से सबसेट । आपके मूल रूप से दो विकल्प होते हैं: या तो एक नया बनावट बनाएं जिसमें केवल मौजूदा बनावट से आपको स्प्राइट की आवश्यकता हो या बनावट निर्देशांक को उचित रूप से मैप करने के लिए एक जीएलएसएल पिक्सेल प्रोग्राम लिखें।

1

हालांकि यह एक पुराना विषय हो सकता है; यहां बताया गया है कि मैं इसे कैसे कर रहा हूं:

एक वर्कअराउंड कई मैश बनाने के लिए होगा, जिसमें बनावट यूवी के सबसेट को एक साथ चिपकाया जाएगा।

उदा। मेरे पास एक बड़े बनावट एटलस के भीतर एक लेजर बनावट है, यू [0.05 - 0.1] & वी [0.05-0.1] पर।

मैं फिर एन मेष का निर्माण करता हूं, प्रत्येक में यू [0.05-0.1] & वी [0.05-0.1] निर्देशांक होता है। (एन = लंबाई/बनावट। हाइट; ऊंचाई बनावट की आयाम है जिसे मैं दोहराना चाहता हूं। या आसान: मैं कितनी बार बनावट को दोहराना चाहता हूं।)

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

(OpenGL ES 1.0,1.1,2.0 - मोबाइल हार्डवेयर 2011)

+0

फिर भी दिलचस्प है। धन्यवाद! :) – Kriem

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