2011-02-03 16 views
6

मैं रेटिना डिस्प्ले के लिए समर्थन करने के लिए अपना OPENGL ES ऐप बनाने की कोशिश कर रहा था। मैंने @ 2x एक्सटेंशन के साथ छवि को जोड़ा है और सामग्री के कारक को 2 तक बनाया है। उच्च रिज़ॉल्यूशन छवि स्क्रीन में सही तरीके से आ रही है लेकिन इसमें गुणवत्ता की बड़ी हानि होती है। किनारों और धुंधले और इसमें छवि की गुणवत्ता नहीं है जिसे मैंने संसाधन फ़ोल्डर में जोड़ा है।रेटिना डिस्प्ले छवि गुणवत्ता समस्या

मैं इसे कैसे ठीक कर सकता हूं?

+0

आप वास्तविक रेटिना डिवाइस या सिम्युलेटर पर उसकी जांच की है: विधि, निम्न कोड जोड़? मदद के लिए – Max

उत्तर

5

मेरा ऐप डिफ़ॉल्ट ढांचे पर आधारित है और मुझे रेटिना आधारित डिवाइस पर चलते समय यह समस्या मिल रही थी। विशेष रूप से मेरा फ्रेमबफर 320x480 पर 640x960 के बजाय बनाया गया था जैसा कि मैं चाहता था। क्षमा करें जेम्स लेकिन यह स्वचालित नहीं है क्योंकि समस्या renderBufferStorage:fromDrawable: द्वारा बनाई गई फ्रेमबफर के साथ है (जो हमारी ओर से glRenderbufferStorage को कॉल करती है लेकिन डिफ़ॉल्ट रूप से चौड़ाई और ऊंचाई के लिए देशी डिवाइस पिक्सेल के बजाय लेआउट पिक्सल निर्दिष्ट करती है)।में EAGLView.m:: डेविड अमाडोर के post करने के लिए मुझे सही दिशा में इशारा करते हुए के लिए

UIScreen *mainScreen = [UIScreen mainScreen]; 
if ([mainScreen respondsToSelector:@selector(scale)]) 
{ 
    // iOS 4.0 and up (further to simeon's comment) 
    const CGFloat scale = mainScreen.scale; 
    self.contentScaleFactor = scale; 
    eaglLayer.contentsScale = scale; 
} 

धन्यवाद

मैं लाइन लाइनों नीचे निम्नलिखित कोड जो eaglLayer.drawableProperties initWithCoder में सेट जोड़ा । धन्यवाद, हाल ही में, शिमोन की सहायक टिप्पणियों के लिए।

+0

मैं रेटिना आयामों के लिए स्पष्ट रूप से जांच करने का सुझाव नहीं दूंगा क्योंकि यह सभी मामलों में काम नहीं करता है (उदाहरण के लिए, रेटिना आईपैड)। स्क्रीन के स्केल फैक्टर का उपयोग करने वाले अधिक सामान्य समाधान के लिए नीचे मेरा उत्तर देखें। – simeon

+0

धन्यवाद शिमोन। अब, कुछ हद तक बेकार, सही! :) –

+0

आपको 'अन्य' शाखा की आवश्यकता नहीं है क्योंकि कोई रेटिना प्री-आईओएस 4.0 डिवाइस नहीं है, इसलिए यदि मुख्यस्क्रीन 'स्केल' चयनकर्ता का जवाब नहीं देती है, तो आप यह सुनिश्चित कर सकते हैं कि यह गैर-रेटिना है। – simeon

-1

ओपनगलएस स्वचालित रूप से रेटिना डिस्प्ले पर सबसे बड़े संभावित रिज़ॉल्यूशन पर प्रस्तुत किया जाएगा (बशर्ते आपने अपना व्यूपोर्ट स्क्रीन की चौड़ाई और ऊंचाई आदि पर सेट किया हो) ताकि समस्या आपके ओपनजीएल प्रतिपादन से आती है।

ओपनगलस छवि पर संलग्न प्रत्यय @ 2X के बारे में परवाह नहीं करता है (यह कोको टच फ्रेमवर्क के लिए है)। हालांकि, यह छवि के संकल्प की परवाह करता है। सर्वोत्तम परिणामों के लिए, आपको स्क्वायर छवियों का उपयोग करना चाहिए जो चौड़ाई और ऊंचाई है जो दो की शक्ति है (उदा। 1024, 2048 इत्यादि)।

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

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

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

मुझे आशा है कि यह आपको सही दिशा में इंगित करे।

+0

हाय धन्यवाद। लेकिन आपने जो भी कहा, कोशिश करने के बाद भी, यह गुणवत्ता नहीं दिखा रहा है। क्या आप कृपया मुझे बता सकते हैं कि छवि को संपीड़ित किया गया है या नहीं? यदि मैं मल्टीसाम्पलिंग का उपयोग करता हूं तो क्या मुझे कोई बेहतर परिणाम मिलेगा ?? – Aaron

+0

क्या आप अपने प्रश्न में कुछ कोड जोड़ सकते हैं जो कि बनावट को ओपनगलएस में बनावट में कैसे लोड करता है? मुझे नहीं लगता कि यदि आप मल्टीसाम्पलिंग का उपयोग करते हैं तो यह बेहतर परिणाम प्राप्त करेगा (यह एक अनुकूलन का अधिक है)। –

1

अपने EAGLView.m initWithCoder में:

if([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) 
{ 
    self.contentScaleFactor = [[UIScreen mainScreen] scale]; 
} 
संबंधित मुद्दे