Iphone OpenGL ES 重用或绘制一次纹理场景

发布于 2024-09-30 03:22:06 字数 348 浏览 1 评论 0原文

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

Ok guys, so I am drawing charts in OpenGL for Iphone. And everything is ok, until I use that Texture2D class to draw X axis labels and Y axis labels. The function of drawing labels is executing at each frame which I think is time consuming. In order to solve animation slowing, I have 2 ideas, but I still can't find how could I implement them:
1. Draw the Labels 1 time, but next time just reuse them, reuse the matrix or the textures, if there is any possibility (sorry I am a newbie, I may write some not adequate stuff);
2. When cleaning the buffer (glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)) clean just a part of the screen, not the whole Rendering scene, I would also be very happy to know if there is any possibility to clear not the whole screen but the drawn objects (for example in the Column chart, to clear just the columns, not the background and not the Labels, or lengend).
I would appreciate very much your help.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

浊酒尽余欢 2024-10-07 03:22:06
    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);
    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);
萌︼了一个春 2024-10-07 03:22:06

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

Things will be much simpler and go far more smoothly if you clear the full render buffer every time. Just pre-render the axes into a single texture and render the texture on each pass.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文