2008-11-03 22 views
11

में बनावट अस्पष्टता बदलें यह उम्मीद है कि एक साधारण प्रश्न है: मेरे पास ओपनजीएल बनावट है और मैं इसकी अस्पष्टता को बदलने में सक्षम होना चाहूंगा, मैं यह कैसे कर सकता हूं? बनावट में पहले से ही अल्फा चैनल है और मिश्रण ठीक काम करता है, लेकिन मैं पृष्ठभूमि में फीका करने के लिए पूरे बनावट की अस्पष्टता को कम करने में सक्षम होना चाहता हूं। मैंने glBlendFunc के साथ झुका हुआ है, लेकिन बिना किसी किस्मत के - ऐसा लगता है कि मुझे GL_SRC_ALPHA_MINUS_CONSTANT जैसी कुछ आवश्यकता होगी, जो उपलब्ध नहीं है। मैं ओपनजीएल ईएस के साथ आईफोन पर काम कर रहा हूं।ओपनजीएल

उत्तर

2

सभी विचारों के लिए धन्यवाद। मैंने glcolor4f और glTexEnv दोनों के साथ खेला है और आखिर में खुद को glTexEnv manpage को ध्यान से पढ़ने के लिए मजबूर किया है। मैनपेज का कहना है कि GL_MODULATE टेक्स्टिंग मोड में, परिणामस्वरूप रंग को बनावट वाले रंग (सी = सीएफ × सीटी) द्वारा आने वाले टुकड़े को गुणा करके गणना की जाती है, वही अल्फा के लिए जाती है। मैंने glColor4f (1, 1, 1, अस्पष्टता) की कोशिश की और यह काम नहीं किया, लेकिन कॉल के सभी चार तर्कों में वांछित अस्पष्टता को पार करने से चाल चल गई। (फिर भी यह सुनिश्चित नहीं है कि क्यों।)

+2

और इससे आपने अपना खुद का "उत्तर" स्वीकार किए गए उत्तर के रूप में ध्वजांकित करने का निर्णय लिया? – zmippie

+0

हां, जैसा कि मैंने समस्या को हल किया था। असहमत होने के लिए स्वतंत्र महसूस करें :) – zoul

+0

आप बनावट के साथ कुछ गलत सेट कर रहे हैं। दान ने क्या काम किया और समझ में आता है, आपका 'समाधान' एक हैक है। – cjcela

16

मैं OpenGL ES के बारे में पता नहीं है, लेकिन मानक ओपन में आप बनावट के लिए एक रंग की घोषणा के द्वारा पारदर्शिता सेट इससे पहले कि आप का प्रयोग करेंगे:

//   R, G, B, A 
glColor4f(1.0, 1.0, 1.0, 0.5); 

उदाहरण आप को प्रभावित किए बिना 50% अल्फा देना होगा आपके बनावट का रंग। अन्य मूल्यों को समायोजित करके आप बनावट रंग भी बदल सकते हैं।

+0

glblendFunc के लिए किस तरह की सेटिंग के साथ? – zoul

+2

वैसे यह एप्लिकेशन पर निर्भर है लेकिन मैं आमतौर पर उपयोग करता हूं: glblendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); – Dan

+3

यह काम करता है क्योंकि डिफ़ॉल्ट बनावट वातावरण GL_MODULATE – noop

1

फ्लाई पर बनावट के अल्फा मान को बदलने का सबसे सरल तरीका है। चूंकि आप किसी बिंदु पर बनावट के बारे में ओपनजीएल बताते हैं, तो आपके पास स्मृति में बिटमैप होगा। तो बस बनावट को उसी बनावट आईडी पर दोबारा दोहराएं। यदि आपके पास स्मृति में नहीं है, (स्पेस बाधाओं के कारण, क्योंकि आप ES पर हैं), तो आप glGetTexImage() का उपयोग कर बनावट को फिर से बफर में पुनर्प्राप्त कर सकते हैं। यह साफ समाधान है।

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

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_DST_ALPHA), 

के glBlendFunc का उपयोग करके आप "आसानी से" और करने में सक्षम हो सकता है।

+0

पर सेट होता है एक टेक्स्टर आमतौर पर एकाधिक ऑब्जेक्ट्स के लिए उपयोग किया जाता है, जिससे यह सभी ऑब्जेक्ट्स के लिए पारदर्शिता बदल जाएगा। साथ ही, कई प्रारूप बनावट अपलोड आंतरिक प्रारूप रूपांतरणों के कारण एक साधारण प्रतिलिपि ऑपरेशन से बहुत धीमे होते हैं। – noop

7

एक बनावट combiner का उपयोग करें। एक बनावट और निरंतर रंग के बीच GL_MODULATE ऑपरेशन करने के लिए बनावट चरण सेट करें। फिर अपने कोड से निरंतर रंग बदलें (glTexEnv, GL_TEXTURE_ENV_COLOR)।

यह प्रदर्शन के संदर्भ में "मुक्त" के रूप में आना चाहिए। अधिकतर (यदि नहीं सभी) ग्राफिक्स चिप्स कंपाइनर ऑपरेशंस जीपीयू चक्रों (आमतौर पर 1) की एक ही संख्या लेते हैं, इसलिए एक मॉड्यूलेट ऑपरेशन (या कोई अन्य ऑपरेशन) बनाम बनावट बनाकर बिल्कुल वही लागत है।

+0

हम्म .. एक बहुत ही सुरुचिपूर्ण + सरल समाधान, NeARAZ। – mstrobl

1

अधिकतर संभावना है कि आप अपनी छवि को बनावट में प्राप्त करने के लिए सीजी का उपयोग कर रहे हैं। जब आप सीजी का उपयोग करते हैं, तो अल्फा premultiplied है, इस प्रकार आप color4f func के rgba के लिए अल्फा का उपयोग क्यों करना है।

0

मुझे संदेह है कि आपके पास एक काला पृष्ठभूमि है, और इस प्रकार हर रंग की मात्रा कम करके, आप रंग को काले रंग में प्रभावी रूप से लुप्त कर रहे थे।

2

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