2009-07-03 9 views
12

मैं अपने पहले ओपनजीएल आईफोन ऐप पर काम करना शुरू कर रहा हूं, लेकिन मैंने जल्दी स्नैग मारा है।पारदर्शिता के साथ पीएनजी से ओपनजीएल ईएस बनावट अजीब कलाकृतियों के साथ प्रस्तुत की जा रही है और मुझे पागल कर रही है!

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

http://i40.tinypic.com/2s7c9ro.png < - यहाँ

स्क्रीनशॉट मैं इन सबसे छुटकारा लग रहा है कि इस फ़ोटोशॉप की गलती है, इसलिए यदि इस बारे में किसी को कुछ तो कृपया मुझे बताएं मिलता है।

यह तो पर फ़ोटो नहीं है, तो यह होगा मेरे कोड हो ... तो यहाँ प्रश्न में कोड है ...

- (void)loadTexture { 

CGImageRef textureImage = [UIImage imageNamed:@"zombie0.png"].CGImage; 

if (textureImage == nil) { 
    NSLog(@"Failed to load texture image"); 
    return; 
} 

NSInteger texWidth = CGImageGetWidth(textureImage); 
NSInteger texHeight = CGImageGetHeight(textureImage); 

GLubyte *textureData = (GLubyte *)malloc(texWidth * texHeight * 4); 

CGContextRef textureContext = CGBitmapContextCreate(textureData, texWidth, texHeight, 8, texWidth * 4, CGImageGetColorSpace(textureImage), kCGImageAlphaPremultipliedLast); 

CGContextDrawImage(textureContext, CGRectMake(0.0, 0.0, (float)texWidth, (float)texHeight), textureImage); 

CGContextRelease(textureContext); 

glGenTextures(1, &textures[0]); 

glBindTexture(GL_TEXTURE_2D, textures[0]); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData); 

free(textureData); 

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 

glEnable(GL_TEXTURE_2D); 

glEnable(GL_BLEND); 
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 

}

इस मिश्रण समारोह झुकेंगे सबसे अच्छा परिणाम।

कृपया मुझे बताएं कि आपको क्या लगता है गलत है।

बहुत बहुत धन्यवाद, यह समस्या मुझे पागल कर रही है।

उत्तर

19

कोड से एक समस्या मैं देख सकता हूं कि आप छवि को चित्रित करने से पहले अपना संदर्भ साफ़ नहीं करते हैं। चूंकि आपकी छवि में पारदर्शी क्षेत्र हैं और पृष्ठभूमि पर रचित है, इसलिए आप देखते हैं कि मॉलोक द्वारा आवंटित स्मृति में क्या है। छवि निकालने से पहले आप कॉपी करना क्वार्ट्ज मिश्रण मोड सेट करके देखें:

CGContextSetBlendMode(textureContext, kCGBlendModeCopy); 

तुम भी calloc बजाय malloc की, इस्तेमाल कर सकते हैं के बाद से calloc आप स्मृति ध्यान केंद्रित किया देता है। है जो आप आमतौर पर चाहते हैं

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 

आप पोर्टर-गूंथा हुआ आटा "से अधिक" देता है,:

आपका ओपन सम्मिश्रण सही है।

+0

आप बहुत अच्छे हैं! यह उत्तर मुझे पूरी तरह से खुश करता है और मुझे समझ में आता है! मुझे यह महसूस हो गया था कि उन कलाकृतियों को स्मृति पर कुछ प्रकार का बायां था लेकिन मैंने इसे नहीं सोचा था। फिर से धन्यवाद sooooooo बहुत! आप शासन करते हैं! –

+0

* लाल मोड़ * * खुश मैं मदद कर सकता था। –

+0

धन्यवाद भी! मुझे पता नहीं लगा कि मेरे पास ये सभी कलाकृतियों क्यों थीं, अब यह बहुत अच्छा लग रहा है। – mk12

1

अपने CGContextRef मिटा पहला प्रयास:

CGContextSetRGBFillColor(ctxt, 1, 1, 1, 0); 
CGContextFillRect(ctxt, CGRectMake(0, 0, w, h)); 
0

अधिकांश शायद अपनी छवि को एक शून्य अल्फा मूल्य के साथ कुछ रंग पिक्सल है, लेकिन सम्मिश्रण समारोह की वजह से आप उन्हें दिखा रहे हैं।

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
+0

यह मिश्रण func केवल non-premultiplied अल्फा के लिए अच्छे परिणाम देता है, जो क्वार्ट्ज में शायद ही कभी होता है। –