2012-05-19 14 views
6

से कॉल करते समय विफल रहता है ViewDidLoad से बनावट लोड हो रहा है ठीक है। लेकिन अगर मैं उन्हें GLKViewController अद्यतन से लोड करने का प्रयास करता हूं तो मुझे एक त्रुटि मिलती है। मैं ऐसा इसलिए करता हूं क्योंकि मैं दृश्य को बदलने के बिना एक नई पृष्ठभूमि बनावट में स्वैप करना चाहता हूं।GLKTextureLoader अद्यतन

यह अंतिम अपग्रेड से पहले काम कर रहा था। शायद मैं समय के साथ भाग्यशाली था। मुझे संदेह है कि यह असफल रहा है क्योंकि कुछ धागा व्यस्त है या कुछ?

यहां पूरी तरह से त्रुटि है।

डोमेन = GLKTextureLoaderErrorDomain कोड = 8 "कार्रवाई पूर्ण नहीं किया जा सका। (GLKTextureLoaderErrorDomain त्रुटि 8.)" UserInfo = 0x10b5b510 {GLKTextureLoaderGLErrorKey = 1282, GLKTextureLoaderErrorKey = ओपन त्रुटि}

तो सवाल यह है, क्या मैं सुरक्षित रूप से GLKViewController अद्यतन फ़ंक्शन से बनावट लोड कर सकता हूं? या क्या मुझे अपने दृष्टिकोण पर पुनर्विचार करने और पूरे दृश्य या कुछ को पुनः लोड करने की आवश्यकता है?

-(void) LoadTexture:(NSString *)texture textureInfo:(GLKTextureInfo**)textureInfo 
{ 
    NSString *path = [[NSBundle mainBundle] pathForResource:texture ofType:@"png"]; 
    NSError *error = nil; 

    (*textureInfo) = [GLKTextureLoader textureWithContentsOfFile:path options:nil error:&error]; 

    NSLog(@"path %@", path); 

    if(!(*textureInfo)) 
    { 
     NSLog(@"Failed to load texture %@ %@", texture, error); 
    } 
    else 
    { 
     NSLog(@"LOADED Texture %@ !!! YAY!!! ", texture); 
    } 
} 

धन्यवाद,

डेविड

+0

मेरे पास एक ही समस्या है। क्या आपको एक समाधान मिला? – hanno

+0

नहीं मैंने अभी तक जांच नहीं की है। ऐसा लगता है कि कुछ संसाधन व्यस्त होने पर यह तुल्यकालिक कॉल विफल हो सकती है। मुझे लगता है कि समाधान लोड करना है इस फ़ंक्शन के लंबे संस्करण का उपयोग करके असीमित रूप से है जहां आप एक पूर्ण हैंडलर में पास करते हैं। इस स्थगित संस्करण का अर्थ है कि आपको बाद में बनावट मिल जाएगी ताकि इसे सही तरीके से संभाला जा सके, लेकिन मुझे उम्मीद है कि यह समाधान होगा। - बनावट WithContentsOfFile: विकल्प: कतार: समापन हैंडलर: –

+1

मैंने अंत में छोड़ दिया और केवल सादे पुराने glTexImage2D का उपयोग किया। – hanno

उत्तर

0

मैं आप के लिए एक ऐसी ही समस्या थी:

यहाँ मेरी कार्य है। समस्या को ठीक करने के लिए मैंने जो किया वह एक कक्षा थी जिसमें सभी बनावट मैं पूरे गेम के लिए उपयोग करना चाहता था। viewDidLoad: में मैंने कक्षा शुरू की और सभी बनावट को लोड किया। जब मुझे किसी भी बनावट का उपयोग करने की आवश्यकता होती है, तो वे पहले ही लोड हो चुके थे और समस्या नहीं हुई थी।

उदाहरण के लिए। viewDidLoad में

GameTextures *textures = [GameTextures alloc] init]; 
[textures LoadAll]; 

LoadAll सब बनावट लोड होगा बाद में

का उपयोग के लिए फिर जब आप एक बनावट

[myBackground setTexture: textures.backgroundTexture2]; 

आशा उपयोग करने के लिए इस मदद की जरूरत है :)

1

मुझे इस तरह की समस्या थी और काम के आसपास glktextureloader के बिना बनावट लोड हो रहा था।

यहाँ

GLKtextureLoader बिना बनावट से लोड होने वाले कोड:

bool lPowerOfTwo = false; 

UIImage *image = [UIImage imageNamed:@"texture.png"]; 

GLuint width = CGImageGetWidth(image.CGImage); 
GLuint height = CGImageGetHeight(image.CGImage); 
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
void *imageData = malloc(height * width * 4); 
CGContextRef context = CGBitmapContextCreate(imageData, width, height, 8, 4 * width, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
CGColorSpaceRelease(colorSpace); 

CGContextClearRect(context, CGRectMake(0, 0, width, height)); 
CGRect bounds=CGRectMake(0, 0, width, height); 
CGContextScaleCTM(context, 1, -1); 
bounds.size.height = bounds.size.height*-1; 
CGContextDrawImage(context, bounds, image.CGImage); 

GLuint lTextId; 
glGenTextures(1, &lTextId); 
glBindTexture(GL_TEXTURE_2D, lTextId); 


glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData); 

if(!lPowerOfTwo) 
{ 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); 

    glGenerateMipmap(GL_TEXTURE_2D); 
}else 
{ 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 

    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
} 

CGContextRelease(context); 

free(imageData); 

lTextId चर ओपन बनावट ईद है।

नोट: अगर बनावट आयाम दो की शक्ति नहीं है, बनावट काले दिखाया जाएगा अगर GL_TEXTURE_WRAP_S और _T

0

मैं लगभग एक ही त्रुटि थी GL_GLAMP_TO_EDGE पर सेट नहीं हैं:

Error Domain=GLKTextureLoaderErrorDomain Code=8 "(null)" UserInfo={GLKTextureLoaderGLErrorKey=1282, GLKTextureLoaderErrorKey=OpenGLES Error.}

यह कार्यक्रमों के बीच स्विचिंग के कारण होता है। एक ओपन जीएल ES त्रुटि ब्रेकपॉइंट का सामना किया जाएगा यदि मैंने gluniform1i को ऐसे प्रोग्राम के साथ कॉल करने का प्रयास किया जो वर्तमान में उपयोग में नहीं है।

सही प्रोग्राम का उपयोग करके फिक्स्ड, किसी भी त्रुटि ब्रेकपॉइंट को ट्रिगर करने से बचें।