2010-09-13 83 views
0

我是一位openGL新手,我試圖讓紋理共享在兩個openGL視圖之間工作。我創建了兩個NSOpenGL視圖類,然後在界面生成器中創建了一個具有每個openGL視圖之一的窗口。第一個視圖的prepareOpenGl中有一些代碼,用於設置紋理並將其分配給全局變量,第二個視圖將其openGlContext重新初始化爲與創建紋理的原始視圖共享的視圖,然後在prepareOpenGL第二個視圖我在全局紋理上調用glBindTexture。當我運行我的應用程序時,我只看到第一個視圖上的紋理,而第二個視圖僅顯示了未經過處理的對象。看起來我的紋理共享不起作用。我想知道我的總體戰略是否有缺陷,或者我是否缺少一些細節。我已經包括了似乎是最重要的代碼snipets。與OpenGL/Cocoa共享紋理問題

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

當我提到「第二視圖」時,我的意思是試圖使用原始視圖的紋理。

+0

'alloc','init'和'autorelease'應該都在同一個語句中,也就是說,你應該使用'alloc'作爲'initWithFormat:shareContext:'的接收者的結果,使用它的結果作爲'autorelease'的接收者,並將'autorelease'的結果作爲變量的初始值。 – 2010-09-13 20:04:52

+0

好的,我做了這個改變。這不僅僅是風格上的差異嗎? – Mike2012 2010-09-13 20:38:04

+0

不一定。如果您將它們放在不同的行中,那麼您可能會忘記其中一個步驟,或者在它們之間插入足夠的代碼,以至於您以後可能會認爲您忘記了其中一個步驟並插入了冗餘步驟。將它們全部保留在一條線上防止了這兩個問題。 – 2010-09-14 03:05:19

回答

0

不要發送init消息給你剛剛從alloc得到的對象。

你正在做的有接收上下文已經初始化,然後重新初始化它什麼。這很糟糕:大多數,可能是所有的類都不期望被重新初始化,所以這可能會導致內存泄漏。

您應該做的是使用alloc,initWithFormat:shareContext:autoreleaseset it as your context自己創建上下文。

我無法知道這是否會完全解決您的問題,但它會有所幫助,並且它至少會減少您在當前代碼中可能發生的內存泄漏。你的執行錯誤。見this blog post和我對它的評論。

更一般地說,我認爲你需要重新閱讀Objective-C Programming LanguageCocoa Fundamentals Guide文件。 Objective-C文檔特別涵蓋了其中一章中的init方法。

+0

謝謝彼得,你的建議和你鏈接的博客都非常有幫助。我對代碼和包含的snipets進行了更改。不幸的是,我仍然得到同樣的行爲 – Mike2012 2010-09-13 23:07:19