1

我需要在一个框架上画小圆圈,让它们在几帧后消失(淡出)。如何使用 OpenGL ES 实现这一点?

这是我到目前为止所拥有的,在框架中绘制圆圈的代码:

 [EAGLContext setCurrentContext:context];
    glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
    glViewport(0, 0, backingWidth, backingHeight);

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrthof(-1.0f, 1.0f, -1.5f, 1.5f, -1.0f, 1.0f);
    glMatrixMode(GL_MODELVIEW);

    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    GLfloat vertices[720];

    for (int i = 0; i < 720; i += 2) {
        vertices[i]   = (cos(DEGREES_TO_RADIANS(i)) * 1);
        vertices[i+1] = (sin(DEGREES_TO_RADIANS(i)) * 1);
    }

    glVertexPointer(2, GL_FLOAT, 0, vertices);
    glEnableClientState(GL_VERTEX_ARRAY);

    glColor4f(1.0f, 1.0f, 0.0f, 1.0f);

    glDrawArrays(GL_TRIANGLE_FAN, 0, 360);

    glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
    [context presentRenderbuffer:GL_RENDERBUFFER_OES];

我不明白的是如何跟踪同一个圆圈并在连续的帧中淡化它。谢谢

4

1 回答 1

1

您将需要在每一帧上重新渲染所有对象(圆圈)。因此,您需要保留一个包含有关圆的信息的数据结构(可能它们的中心、半径和不透明度就足够了)。像这样的东西:

typedef struct Circle {
    NSPoint center;
    float radius;
    float opacity;
} Circle;

Circle allCircles [ kMaxNumCircles ];

然后,当你去绘制它们时,你遍历圆数组,更新它们的不透明度,然后绘制它们:

for (int i = 0; i < kMaxNumCircles; i++)
{
    allCircles [ i ].opacity -= someDelta;
    drawCircle (allCircles [ i ]);
}

drawCircle()函数可能就是您在上面编写的:

void drawCircle(Circle c)
{
    GLfloat vertices[720];

    for (int i = 0; i < 720; i += 2) {
        vertices[i]   = (cos(DEGREES_TO_RADIANS(i)) * 1) + c.center.x;
        vertices[i+1] = (sin(DEGREES_TO_RADIANS(i)) * 1) + c.center.y;
    }

    glVertexPointer(2, GL_FLOAT, 0, vertices);
    glEnableClientState(GL_VERTEX_ARRAY);

    glColor4f(1.0f, 1.0f, 0.0f, c.opacity);

    glDrawArrays(GL_TRIANGLE_FAN, 0, 360);

}
于 2012-07-14T15:24:47.220 回答