2012-08-22 3 views
1

J'essaie d'écrire une visionneuse de fichiers Wavefront OBJ dans Objective-C, qui est capable de charger des maillages/matériaux/shaders à partir de fichiers. J'ai créé des classes pour les shaders et les shaders, et je suis en train de créer un objet de programme de shaders OpenGL dans le cadre de la méthode d'initialisation de ma classe de programme de shaders:glCreateProgram provoque un segfault?

- (id)initWithVertexShader:(NSString *)vshader FragmentShader:(NSString *)fshader { 
self = [super init]; 
if (self) { 
    SRShader* shaders[2] = { 
     [[SRShader alloc] initWithFilename:vshader Type:GL_VERTEX_SHADER Source:nil], 
     [[SRShader alloc] initWithFilename:fshader Type:GL_FRAGMENT_SHADER Source:nil] 
    }; 

    program = glCreateProgram(); 

    for (int i = 0; i < 2; i++) { 
     SRShader* s = shaders[i]; 
     NSError* e = nil; 
     s.source = [NSString stringWithContentsOfFile:s.filename encoding:NSUTF8StringEncoding error:&e]; 
     if (!e) { 
      NSLog(@"Failed to read shader file: %@\n", s.filename); 
      exit(-1); 
     } 

     GLuint shader = [s compile]; 
... and so on. 

Toutefois, l'appel des résultats glCreateProgram à EXC_BAD_ACCESS, tout comme l'appel à [compiler SRShader], qui à son tour appelle glCreateShader. Quelqu'un connaît-il des problèmes avec ces appels de fonction dans Objective-C? Peut-être quelque chose à voir avec ARC ou les appeler dans une fonction d'initialisation?

+0

Avez-vous d'abord créé un contexte OpenGL et l'avez-vous mis à jour sur le thread appelant? – bosmacs

Répondre

2

Si vous utilisez un NSOpenGLView, vous devrez ajouter les lignes de code ci-dessous avant de vous appeler glCreateProgram(), donc probablement -(id)initWithCoder si vous chargez la vue depuis Interface Builder:

NSOpenGLContext* context = [self openGLContext]; 

[context makeCurrentContext]; 

Très basique , et je sais que ce fil est daté, mais peut-être que cela sauvera quelqu'un une minute ou deux quand ils trouveront Google et trouveront ce fil (comme je l'ai fait tout à l'heure).

+0

pas que cela m'a aidé, mais je pense que votre effort devrait être acknoledge – VivienLeger

Questions connexes