Iphone OpenGL ES Повторное использование или рисование один раз Текстурная сцена - PullRequest
0 голосов
/ 29 октября 2010

Хорошо, ребята, поэтому я рисую графики в OpenGL для Iphone. И все в порядке, пока я не использую этот класс Texture2D для рисования меток оси X и меток оси Y. Функция рисования меток выполняется в каждом кадре, что я считаю трудоемким. Чтобы решить проблему замедления анимации, у меня есть 2 идеи, но я до сих пор не могу найти, как я могу их реализовать: 1. Нарисуйте метки 1 раз, но в следующий раз просто используйте их повторно, используйте матрицу или текстуры, если есть такая возможность (извините, я новичок, я могу написать некоторые неадекватные материалы); 2. При очистке буфера (glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) очищайте только часть экрана, а не всю сцену рендеринга, я также был бы очень рад узнать, есть ли возможность очистить не весь экран, а нарисованный объекты (например, на диаграмме столбцов, чтобы очистить только столбцы, а не фон и не метки и не легенду). Буду очень признателен за вашу помощь.

Ответы [ 2 ]

2 голосов
/ 29 октября 2010
    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);
0 голосов
/ 29 октября 2010

Все будет намного проще и пройдет намного более гладко, если вы каждый раз очищаете полный буфер рендеринга. Просто предварительно визуализируйте оси в одну текстуру и визуализируйте текстуру при каждом проходе.

...