2011-08-31 39 views
2

我想在我的應用程序中實現一些基本的OpenGL,並且這樣做時,我使用SDK附帶的GLPaint示例作爲跳轉點。我的代碼自行運行良好,但是一旦我將所有內容移至我的應用程序,相同的代碼就會失敗。當我調整大小時,OpenGL繪圖搞砸了CAEAGLLayer

根據我的嘗試,問題是(1)基元在第一次繪製時出現壓扁,然後在隨後的基元被繪製時浮動到屏幕的頂部,或者(2)基元不出現在所有。

我縮小了範圍,這是因爲我的應用程序要求CAEAGLLayer進行調整。它位於UIScrollView中,可隨時移動和調整大小(捏,拖動等)。在GLPaint示例中,每當視圖調整大小(通過layoutSubviews)時,我都會丟棄幀緩衝區並重新創建它,工作。 (由於GLPaint例子從未調整大小,我懷疑示例代碼的這部分從未工作,因爲它從不需要)

只有當我將CAEAGLLayer設置爲1024 x 768的常量大小時,代碼將作爲預計:

self.layer.frame = CGRectMake(0, 0, 1024, 768); 

有一次,我把上面一行:

self.layer.frame = self.bounds; 

的問題返回。我的layoutSubviews方法的其餘部分是這樣的:

[EAGLContext setCurrentContext:context]; 
[self destroyFramebuffer]; 
[self createFramebuffer]; 

if (needsClearView) { 
    [self clearView]; 
    needsClearView = NO; 
} 

的destroyFramebuffer和createFramebuffer方法大多來自GLPaint例子不變。引用視圖大小的唯一其他代碼是這些線路中的initWithCoder:

glOrthof(0, self.bounds.size.width, 0, self.bounds.size.height, -1, 1); 
glViewport(0, 0, self.bounds.size.width, self.bounds.size.height); 

我試圖在這裏改變價值觀,和其他地方的移動這些臺詞,但什麼我已經試過了工作。任何人對我有任何建議?

回答

1

我發現CAEAGLLayer不開心,除非其bounds.width是8

+0

這是真實的(和一個錯誤)期間的iOS 4.3測試期間,但不再是真實的。 –

+0

@quixoto:我正在測試的iOS 4(非beta版)iOS 4.3在過去的2個小時裏給我帶來了麻煩,直到我重新排列了所有東西以保持CAEAGLLayer的寬度和高度爲8的倍數。 – Anomie

3

多我有同樣的問題,有一天,我想通了。在重新創建幀緩衝區之前,您需要使用新尺寸調用glOrthof和glViewport。我這樣做是在layoutSubviews電話:

-(void)layoutSubviews 
{ 
    [EAGLContext setCurrentContext:context]; 

    glMatrixMode(GL_PROJECTION); 
    CGRect frame = self.bounds; 
    CGFloat scaleFactor = self.contentScaleFactor; 
    glLoadIdentity(); 
    glOrthof(0, frame.size.width * scaleFactor, 0, frame.size.height * scaleFactor, -1, 1); 
    glViewport(0, 0, frame.size.width * scaleFactor, frame.size.height * scaleFactor); 
    glMatrixMode(GL_MODELVIEW);  

    [self destroyFramebuffer]; 
    [self createFramebuffer]; 

    // Clear the framebuffer the first time it is allocated 
    if (needsErase) { 
     [self erase]; 
     needsErase = NO; 
    } 
} 

,請務必先調用glLoadIdentity,作爲glOrthof與當前矩陣相乘。

+0

謝謝,這真的幫助我了! –

+0

真棒我一直在追逐這個好幾天。 –

1

在VC中使用PaintingView並更改其框架時,我遇到了同樣的問題。通過在改變框架之前在視圖上應用CGAffineTransform來解決這個問題。

即:

paintingView.transform = CGAffineTransformMakeScale(0.5, 0.5); 
paintingView.frame = CGRectMake(paintingView.frame.origin.x, paintingView.frame.origin.y, paintingView.frame.size.width/2, paintingView.frame.size.height/2);