glCreateProgram 导致段错误?

ala*_*dai 1 opengl macos objective-c automatic-ref-counting

我正在尝试用 Objective-C 编写一个 Wavefront OBJ 文件查看器,它能够从文件加载网格/材质/着色器。我已经为着色器和着色器程序创建了类,并且我正在尝试创建一个 OpenGL 着色器程序对象作为着色器程序类的 init 方法的一部分:

- (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.
Run Code Online (Sandbox Code Playgroud)

但是,调用 glCreateProgram 会导致 EXC_BAD_ACCESS,对 [SRShader compile] 的调用也是如此,后者又会调用 glCreateShader。有谁知道在 Objective-C 中这些函数调用有什么问题吗?也许与ARC有关或在初始化函数中调用它们?

Mik*_*ike 5

如果您使用的是 NSOpenGLView,则需要在调用之前添加以下代码行glCreateProgram(),因此-(id)initWithCoder如果您从 Interface Builder 加载视图,则可能需要添加以下代码行:

NSOpenGLContext* context = [self openGLContext];

[context makeCurrentContext];
Run Code Online (Sandbox Code Playgroud)

非常基本,我知道这个帖子已经过时了,但是当他们谷歌并找到这个帖子时,也许它会节省一两分钟的时间(就像我刚才所做的那样)。