首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用OpenGL/Cocoa共享纹理故障

用OpenGL/Cocoa共享纹理故障
EN

Stack Overflow用户
提问于 2010-09-13 17:40:44
回答 1查看 829关注 0票数 0

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

代码语言:javascript
复制
-(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;
}

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

EN

回答 1

Stack Overflow用户

发布于 2010-09-13 19:29:33

不要将init消息发送到不只是从alloc获得的对象。

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

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

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

您还做错了initWithFrame:实现。请看这篇博客文章和我对它的评论。

更广泛地说,我认为您需要重新阅读Objective编程语言可可基本面指南文档。特别是Objective文档在其一章中涵盖了init方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3702930

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档