يتم تقديم القوام بينغل ES من ملفات PNG مع الشفافية مع التحف غريبة ويقود لي المكسرات!

StackOverflow https://stackoverflow.com/questions/1079884

سؤال

وأنا مطلع على العمل على بلدي أول تطبيق برنامج OpenGL فون، ولكن لقد ضرب بعقبة في وقت مبكر.

ولدي الملمس القليل بسيط جدا التي أريد لاستخدامه كقاعدة العفريت في لعبة 2D، لكنه يجعل مع بكسل غريبة "عشوائيا" الملونين حتى أعلى.

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);

و}

وهذه الوظيفة مزيج حققت أفضل النتائج.

ومن فضلك، اسمحوا لي أن أعرف ما هو رأيك هو الخطأ.

وشكرا جزيلا لك، وهذه المشكلة قد يقود لي المكسرات.

هل كانت مفيدة؟

المحلول

ومشكلة واحدة أستطيع أن أرى من التعليمات البرمجية هي أنك لا مسح السياق الخاص بك قبل رسم الصورة. منذ صورتك تحتوي على مناطق شفافة وتتكون في الخلفية، ترى فقط ما هو في الذاكرة المخصصة من قبل malloc. محاولة الإعداد الذي وضع مزيج الكوارتز لنسخ قبل رسم الصورة:

CGContextSetBlendMode(textureContext, kCGBlendModeCopy);

ويمكنك أيضا استخدام calloc بدلا من malloc، calloc منذ يمنحك ركزت الذاكرة.

وبينغل مزج الخاص بك هو الصحيح:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

ويتيح لك بورتر-داف "OVER"، وهو ما تريد عادة.

نصائح أخرى

وحاول محو بك CGContextRef أولا:

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

وأغلب الظن صورتك بعض بكسل الملونة مع قيمة ألفا الصفر، ولكن بسبب وظيفة المزج كنت تبين لهم. محاولة

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top