0

ファイルからメッシュ/マテリアル/シェーダーをロードできる Wavefront OBJ ファイル ビューアーを Objective-C で作成しようとしています。シェーダーとシェーダー プログラムのクラスを作成し、シェーダー プログラム クラスの init メソッドの一部として OpenGL シェーダー プログラム オブジェクトを作成しようとしています。

- (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.

ただし、glCreateProgram を呼び出すと EXC_BAD_ACCESS になり、[SRShader compile] を呼び出すと、glCreateShader が呼び出されます。Objective-C でのこれらの関数呼び出しに関する問題を知っている人はいますか? 多分ARCと関係があるか、初期化関数でそれらを呼び出すのですか?

4

2 に答える 2

5

NSOpenGLView を使用している場合は、 を呼び出す前に次のコード行を追加する必要があるため、Interface Builder からビューをロードする場合はglCreateProgram()おそらく次のようになります。-(id)initWithCoder

NSOpenGLContext* context = [self openGLContext];

[context makeCurrentContext];

非常に基本的であり、このスレッドが古いことは知っていますが、Google でこのスレッドを見つけたときに 1、2 分節約できるかもしれません (私が今行ったように)。

于 2013-01-22T00:04:15.410 に答える