0

我是一个 openGL 新手,我正在尝试让纹理共享在两个 openGL 视图之间工作。我创建了两个 NSOpenGL 视图类,然后在界面构建器中创建了一个窗口,每个窗口都有一个 openGL 视图。第一个视图在其 prepareOpenGl 中有代码,用于设置纹理并将其分配给全局变量,第二个视图将其 openGlContext 重新初始化为与创建纹理的原始视图共享的代码,然后在第二个视图我在全局纹理上调用 glBindTexture。当我运行我的应用程序时,我只在第一个视图上看到一个纹理,而第二个视图只显示一个无纹理的对象。看来我的纹理共享不起作用。我想知道我的总体策略是否有缺陷,或者我是否只是遗漏了一些细节。

-(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;
}

当我提到“第二个视图”时,我的意思是试图使用原始视图的纹理。

4

1 回答 1

0

不要将init消息发送到您不是从alloc.

你在那里做的是接收一个已经初始化的上下文,然后重新初始化它。这很糟糕:大多数(可能是所有)类都不希望重新初始化,因此这很可能导致内存泄漏。

您应该做的是使用allocinitWithFormat:shareContext:和自己创建上下文autorelease,并将其设置为您的上下文

我无法知道这是否会完全解决您的问题,但它会有所帮助,并且至少会消除您当前代码中可能存在的一些内存泄漏。

你也initWithFrame:做错了。请参阅此博客文章和我对此的评论。

更一般地说,我认为您需要重新阅读Objective-C Programming LanguageCocoa Fundamentals Guide文档。尤其是 Objective-C 文档,其中一章涵盖了init方法。

于 2010-09-13T19:29:33.460 回答