2010-10-29 64 views
0

好吧,我正在爲OpenGL繪製Iphone圖表。一切正常,直到我使用該Texture2D類繪製X軸標籤和Y軸標籤。繪製標籤的功能在我認爲非常耗時的每一幀執行。爲了解決動畫放緩,我有兩個想法,但我仍然無法找到如何實現它們: 1.繪製標籤1次,但下次只是重用它們,重用矩陣或紋理,如果有有任何可能(抱歉,我是一個新手,我可能會寫一些不夠的東西); 2.當清潔緩衝區(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT))時,只清潔屏幕的一部分,而不是整個渲染場景,我也很樂意知道是否有可能清除整個屏幕,但是(例如在柱狀圖中,只清除列,而不是背景,而不是標籤或lengend)。 非常感謝您的幫助。Iphone OpenGL ES重複使用或繪製一次紋理場景

回答

0

如果每次清除完整的渲染緩衝區,事情將會簡單得多,並且更加順暢。只需將軸預渲染爲單個紋理並在每次通過時渲染紋理即可。

+1

通過清除渲染緩衝區做你的意思是清除框架和深度緩衝(glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT))。如果是這樣,我會在每一幀中清除它們。我如何預先渲染軸到一個紋理。對不起,您能否提供更多詳細信息,以及一些代碼示例?我會提到你,我正在使用Texture2D類來繪製標籤。以下是我如何做到的: – 2010-10-29 13:39:29

2
glLoadIdentity(); // Added line 

glEnableClientState(GL_VERTEX_ARRAY); 

glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glEnable(GL_TEXTURE_2D); 
glEnable(GL_BLEND); 
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 

NumberFormatter *lFormater = [[NumberFormatter alloc] init]; 
int i = 0; 
for (NSNumber *lNumber in mColXLabelCoord) { 
    NSNumber *lUnformated = [NSNumber numberWithInteger:[[NSString stringWithString:[mColYLabelsArray objectAtIndex:i]] integerValue]]; 

    NSString *lFormated = [NSString stringWithString:[lFormater stringFromNumber:lUnformated withMask:[[mGraphArray objectAtIndex:0] mGraphMask]]]; 

    Texture2D* lWord= [[Texture2D alloc] initWithString:lFormated dimensions:CGSizeMake(40, 15) alignment:UITextAlignmentLeft fontName:@"Helvetica" fontSize:13]; 

    glColor4f(RedFromRGB(0xFFFFFF), GreenFromRGB(0xFFFFFF), BlueFromRGB(0xFFFFFF), 1.0);    
    [lWord drawInRect:CGRectMake([lNumber floatValue]+2, 470,40,15) rotation:-90]; 

    [lWord release]; 


    i++;   
} 
[lFormater release]; 

i = [mColYCoord count]-1; 
for (NSNumber *lNumber in mColYCoord) {  
    Texture2D* lWord= [[Texture2D alloc] initWithString:[NSString stringWithFormat:((GraphValue*)[mGraphValuesArray objectAtIndex:i]).mGraphValueXLabel,[lNumber floatValue]] 
              dimensions:CGSizeMake(40, 15) 
               alignment:UITextAlignmentCenter 
               fontName:@"Helvetica" fontSize:12]; 

    if ([mColYCoord count] < kOptimalLabelNumber) { 
     glColor4f(RedFromRGB(0xFFFFFF), GreenFromRGB(0xFFFFFF), BlueFromRGB(0xFFFFFF), 1.0);    
     [lWord drawInRect:CGRectMake(10, [lNumber floatValue]+15, 40, 15) rotation:-90];    
    }else { 
     glColor4f(RedFromRGB(0xFFFFFF), GreenFromRGB(0xFFFFFF), BlueFromRGB(0xFFFFFF), 1.0);    
     [lWord drawInRect:CGRectMake(2, [lNumber floatValue]+5, 40, 15) rotation:-30];   

    } 
    [lWord release]; 
    i--; 
} 

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA); 
glDisable(GL_BLEND); 
glDisable(GL_TEXTURE_2D); 
glDisableClientState(GL_TEXTURE_COORD_ARRAY); 

glDisableClientState(GL_VERTEX_ARRAY);