【问题标题】:Iphone OpenGL ES Reuse or draw once Texture sceneIphone OpenGL ES 重用或绘制一次纹理场景
【发布时间】:2010-10-29 13:01:20
【问题描述】:

好的,我正在为 Iphone 使用 OpenGL 绘制图表。一切都很好,直到我使用那个 Texture2D 类来绘制 X 轴标签和 Y 轴标签。绘制标签的功能是在每一帧执行,我认为这很耗时。为了解决动画变慢,我有2个想法,但我仍然找不到如何实现它们: 1. 绘制Labels 1 次,但下一次只是重复使用它们,重复使用矩阵或纹理,如果有任何可能的话(对不起,我是新手,我可能会写一些不够充分的东西); 2. 清理缓冲区时 (glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) 只清理屏幕的一部分,而不是整个渲染场景,我也很高兴知道是否有可能不清理整个屏幕而是清理绘制的对象(例如在柱形图中,仅清除列,而不是背景,而不是标签或图例)。 非常感谢您的帮助。

【问题讨论】:

    标签: iphone opengl-es rendering textures reusability


    【解决方案1】:
        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);
    

    【讨论】:

      【解决方案2】:

      如果您每次都清除完整的渲染缓冲区,事情会变得更加简单和顺利。只需将轴预渲染为单个纹理并在每次传递时渲染纹理。

      【讨论】:

      • 清除渲染缓冲区是指清除帧和深度缓冲区 (glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT))。如果是这样,我会在每一帧上清除它们。如何将轴预渲染为单个纹理。抱歉,您能否提供更多详细信息以及一些代码示例?我会提到我正在使用 Texture2D 类来绘制标签。这是我的做法:
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-29
      • 1970-01-01
      • 2011-04-09
      • 2019-11-16
      • 1970-01-01
      • 2012-01-12
      相关资源
      最近更新 更多