无法与OpenGL/Cocoa共享纹理

无法与OpenGL/Cocoa共享纹理,cocoa,macos,opengl,texture-mapping,nsopenglview,Cocoa,Macos,Opengl,Texture Mapping,Nsopenglview,我是一个openGL新手,我正在尝试在两个openGL视图之间实现纹理共享。我创建了两个openGL视图类,然后在interface builder中创建了一个窗口,每个窗口都有一个openGL视图。第一个视图的PreparePengl中包含设置纹理并将其指定给全局变量的代码,第二个视图将其openGlContext重新初始化为与创建纹理的原始视图共享的openGlContext,然后在第二个视图的PreparePengl中,我在全局纹理上调用glBindTexture。当我运行我的应用程序时,

我是一个openGL新手,我正在尝试在两个openGL视图之间实现纹理共享。我创建了两个openGL视图类,然后在interface builder中创建了一个窗口,每个窗口都有一个openGL视图。第一个视图的PreparePengl中包含设置纹理并将其指定给全局变量的代码,第二个视图将其openGlContext重新初始化为与创建纹理的原始视图共享的openGlContext,然后在第二个视图的PreparePengl中,我在全局纹理上调用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;
}

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

不要将
init
消息发送到一个对象,该对象不是从
alloc
获得的

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


您应该使用
alloc
initWithFormat:shareContext:
、和
autorelease
,自己创建上下文

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

您的
initWithFrame:
实现也有错误。请参阅和我的评论


更一般地说,我认为你需要重新阅读这些文件。特别是Objective-C文档,在其中一章中介绍了
init
方法。

alloc
init
autorelease
都应该在同一条语句中,也就是说,您应该使用
alloc
的结果作为
initWithFormat:shareContext:
的接收者,将其结果用作
autorelease
的接收器,并将
autorelease
的结果用作变量的初始值设定项。好的,我做了更改。这不只是风格上的不同吗?不一定。如果将它们放在单独的行中,则有可能会忘记其中一个步骤,或者在它们之间插入足够的代码,以至于以后可能会认为忘记了其中一个步骤而插入了多余的步骤。把它们放在一条线上可以避免这两个问题。谢谢你,彼得,你的建议和你链接的博客都非常有用。我对我的代码和包含的snipet进行了更改。不幸的是,我仍然有同样的行为