0

私は少し openGL 初心者で、2 つの openGL ビュー間でテクスチャ共有を機能させようとしています。2 つの NSOpenGL ビュー クラスを作成し、インターフェイス ビルダーで、各 openGL ビューを 1 つ持つウィンドウを作成しました。最初のビューの prepareOpenGl には、テクスチャを設定してグローバル変数に割り当てるコードが含まれています。 2 番目のビューでは、グローバル テクスチャで glBindTexture を呼び出します。アプリケーションを実行すると、最初のビューにテクスチャしか表示されず、2 番目のビューにはテクスチャのないオブジェクトが表示されます。テクスチャの共有が機能していないようです。私の一般的な戦略に欠陥があるのか​​ 、それとも細部が少し欠けているだけなのか疑問に思っています.

-(void)prepareOpenGL {
    //prepareOPenGL of the first view
    glEnable( GL_TEXTURE_2D );
    glEnable(GL_DEPTH_TEST);
    //makeImage() creates a silly little texture pattern
    makeImage();
    glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
    glGenTextures(1, &texName);
    glBindTexture(GL_TEXTURE_2D, &texName);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 16, 16, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);
    glShadeModel(GL_SMOOTH);
}
-(void)prepareOpenGL {
    //prepareOpenGL of the second view
    glEnable( GL_TEXTURE_2D );
    glEnable(GL_DEPTH_TEST);
    glBindTexture(GL_TEXTURE_2D, &texName);
    glShadeModel(GL_SMOOTH);
}
- (id)initWithFrame:(NSRect)frame { 
    if(self = [super initWithFrame:frame])
   {
            printf("InitWithFrame: \n");
            NSOpenGLContext* context = [[[NSOpenGLContext alloc] initWithFormat:[NSOpenGLView defaultPixelFormat] shareContext:[otherView openGLContext]] autorelease];
           [self setOpenGLContext:context];
    }
    return self;
}

「2 番目のビュー」とは、元のビューのテクスチャを使用しようとしているビューを意味します。

4

1 に答える 1

0

initから取得したのではないオブジェクトにメッセージを送信しないでくださいalloc

そこで行っているのは、既に初期化されているコンテキストを受け取り、それを再初期化することです。これは悪いことです。ほとんどの、おそらくすべてのクラスは、再初期化されることを想定していないため、メモリ リークが発生する可能性があります。

あなたがすべきことはalloc、 、、initWithFormat:shareContext:およびを使用して自分でコンテキストを作成し、それを自分のコンテキストとして設定することです。autorelease

これで問題が完全に解決するかどうかはわかりませんが、役に立ちますし、少なくとも現在のコードで発生する可能性のあるメモリ リークをいくつか排除できます。

initWithFrame:また、実装が間違っています。このブログ投稿とそれに対する私のコメントを参照してください。

より一般的には、 Objective-C プログラミング言語Cocoa Fundamentals Guideのドキュメントを読み直す必要があると思います。特に、Objective-C ドキュメントは、initその章の 1 つでメソッドをカバーしています。

于 2010-09-13T19:29:33.460 に答える