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?
Avez-vous d'abord créé un contexte OpenGL et l'avez-vous mis à jour sur le thread appelant? – bosmacs