2010-10-29 116 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);