我是一位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;
}
當我提到「第二視圖」時,我的意思是試圖使用原始視圖的紋理。
'alloc','init'和'autorelease'應該都在同一個語句中,也就是說,你應該使用'alloc'作爲'initWithFormat:shareContext:'的接收者的結果,使用它的結果作爲'autorelease'的接收者,並將'autorelease'的結果作爲變量的初始值。 – 2010-09-13 20:04:52
好的,我做了這個改變。這不僅僅是風格上的差異嗎? – Mike2012 2010-09-13 20:38:04
不一定。如果您將它們放在不同的行中,那麼您可能會忘記其中一個步驟,或者在它們之間插入足夠的代碼,以至於您以後可能會認爲您忘記了其中一個步驟並插入了冗餘步驟。將它們全部保留在一條線上防止了這兩個問題。 – 2010-09-14 03:05:19