0

我需要以一定的频率闪烁两个 2d 对象。我在 Visual C++ Express Edition 中使用这个 OpenGL (glut) 和 C++。操作系统是 Windows XP Sp3,32 位。

我想我已经成功地实现了基本应用程序,但是我无法弄清楚如何以一定的频率制作 flash 对象。你对我有什么建议吗?我做的代码是这样的。

void display(void) {

glClear( GL_COLOR_BUFFER_BIT);

    glBegin(GL_POLYGON);
    glColor3f(0.0, 0.0, 0.0);
    glVertex3f(140.0, 250.0+300.0, 0.0); //bottom left corner
    glVertex3f(140.0+300.0, 250.0+300.0, 0.0); //bottom right corner
    glVertex3f(140.0+300.0, 250.0, 0.0); //top right corner
    glVertex3f(140.0, 250.0, 0.0);
    glEnd();

    glBegin(GL_POLYGON);
    glColor3f(1.0, 1.0, 1.0);
    glVertex3f(640.0+200.0, 250.0+300.0, 0.0); //bottom left corner
    glVertex3f(640.0+200.0+300.0, 250.0+300.0, 0.0); //bottom right corner
    glVertex3f(640.0+200.0+300.0, 250.0, 0.0); //top right corner
    glVertex3f(640.0+200.0, 250.0, 0.0);
    glEnd();

    glFlush();
}

int main(int argc, char **argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode ( GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);

    glutInitWindowPosition(0,0);
    glutInitWindowSize(1280,800);
    glutGameModeString("1280x800:32@60");
    glutEnterGameMode();
    glutSetWindowTitle("OpenGL SSVEP stimulator");

    glDisable(GL_DEPTH_TEST);

    glClearColor(0.0, 0.0, 0.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0,1280,800,0.0,0.0,1.0);

    glutDisplayFunc(display);

    glutMainLoop();

    return 0;
}

为了闪现,我想到了这样的东西(伪代码):

int leftFrequency=12;
int rightFrequency=20;
int i=0;
while(running) {
    if(i%leftFrequency)
        blackSquare;
    }
    else {
        whiteSquare;
    }
    if(i%rightFrequency)
        blackSquare;
    }
    else {
        whiteSquare;
    }
}

但我不知道把这段代码放在哪里。在 display() 函数中可能吗?我在哪里可以增加 i 变量?我试图将所有内容都放在 display() 函数中,但是两个方块不闪烁。i 变量增加到 3。我没有错误类型。

也许它不正确闪烁的逻辑?

4

2 回答 2

0

如果要达到一定的频率,那么您需要根据时间轻弹。

于 2013-04-24T12:05:21.520 回答
0

创建一个全局变量(或使其i成为静态局部变量)并将您的闪烁代码(最后一个代码片段)放入显示函数中。

启用双缓冲glutInitDisplayMode(… | GLUT_DOUBLE)并将glFlush()显示替换为glutSwapBuffers().

i在显示末尾添加一个增量。

注册glutPostRedisplay为 GLUT 空闲函数,即在main调用之前在您的函数中glutMainLoop()

glutIdleFunc(glutPostRedisplay);
于 2013-04-24T12:56:52.407 回答