我是一个openGL新手,我试图让纹理共享在两个openGL视图之间工作。我创建了两个NSOpenGL视图类,然后在接口构建器中创建了一个窗口,其中每个openGL视图都有一个。第一个视图在其prepareOpenGl中包含代码,该代码设置纹理并将其分配给全局变量,第二个视图将其openGlContext重新划分为与创建纹理的原始视图共享的openGlContext,然后在第二个视图的prepareOpenGL中,我在全局纹理上称为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;
}当我提到“第二个视图”时,我指的是试图使用原始视图的纹理的视图。
发布于 2010-09-13 19:29:33
不要将init消息发送到不只是从alloc获得的对象。
您在那里所做的是接收一个已经初始化的上下文,然后重新初始化它。这很糟糕:大多数,可能所有的类都不期望重新初始化,因此这可能会导致内存泄漏。
您应该做的是使用alloc、initWithFormat:shareContext:、autorelease和将其设置为上下文自己创建上下文。
我无法知道这是否会完全解决您的问题,但这会有所帮助,而且至少会减少当前代码中可能出现的一些内存泄漏。
您还做错了initWithFrame:实现。请看这篇博客文章和我对它的评论。
更广泛地说,我认为您需要重新阅读Objective编程语言和可可基本面指南文档。特别是Objective文档在其一章中涵盖了init方法。
https://stackoverflow.com/questions/3702930
复制相似问题