双缓冲并反映C ++ / OpenGL中的变量

时间:2015-10-07 14:30:11

标签: c++ opengl glut

我希望允许用户通过控制台更改prob数组的值,然后将这些更改反映到窗口中。

我知道我必须使用双缓冲,所以我在主函数中将显示模式设置为

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);

以下是我的显示功能:

void display () {
    // declare some variables that will be used
    int point_num = 8000000;
    double r, x, y, x1 = 0, y1 = 0;
    double prob[4] = {0.01, 0.19, 0.20, 0.60};

    // clear the window
    glClear (GL_COLOR_BUFFER_BIT);

    for (int i = 0; i < point_num; i++) {
        r = drand48(); // generate a random number between 0.0 - 1.0

        // compare the random number we get to the if statement below and get the appropriate x and y values
        if (r < prob[0]) {
            x = ((0.2 * x1) + (4.4 * y1) + 7.5) / ((0.2 * x1) + (8.8 * y1) + 15.4);
            y = ((-0.3 * x1) + (-4.4 * y1) + -10.4) / ((0.2 * x1) + (8.8 * y1) + 15.4);
        }
        else if (r < prob[1]) {
            x = ((-32.5 * x1) + (5.81 * y1) + -2.9) / ((-128.1 * x1) + (-24.3 * y1) + -5.8);
            y = ((122.9 * x1) + (-0.1 * y1) + -19.9) / ((-128.1 * x1) + (-24.3 * y1) + -5.8);
        }
        else if (r < prob[2]) {
            x = ((96.5 * x1) + (35.2 * y1) + 5.8) / ((134.8 * x1) + (30.7 * y1) + 7.5);
            y = ((-131.4 * x1) + (-6.5 * y1) + 19.1) / ((134.8 * x1) + (30.7 * y1) + 7.5);
        }
        else {
            x = ((19.05 * x1) + (0.72 * y1) + 1.86) / ((5.63 * x1) + (2.01 * y1) + 20.0);
            y = ((-0.15 * x1) + (16.9 * y1) + -0.28) / ((5.63 * x1) + (2.01 * y1) + 20.0);
        }

        x1 = x;
        y1 = y;
        // plot the points
        glBegin(GL_POINTS);
        glVertex2d(x1, y1);
        glEnd();
    }

    glutSwapBuffers();
}

我知道如何通过控制台与用户进行交互并更改变量值,但我只是不明白如何在使用OpenGL运行程序时在窗口上反映这些更改。我尝试在for循环之前使用while循环,以允许用户更改prob数组的值,但这对我不起作用。关于如何实现我想要的任何想法?

2 个答案:

答案 0 :(得分:0)

  

但我只是不明白如何在窗口上反映这些变化

你需要国家。声明要使用的程序的变量,在处理控制台事件时更改它,使用该变量来显示内容。

除非您可以将控制台缓冲区交互与渲染交错,否则您很可能需要一个线程解决方案。

答案 1 :(得分:0)

  

关于如何实现我想要的任何想法?

最简单的解决方案是产生一个与stdio交互的额外线程。如果在GLUT主循环(线程)中执行此操作,则每次对stdio块进行操作时,整个程序都会冻结。这绝对不是你想要的。

另一种选择是在stdio上单独使用非阻塞操作,如果输入可用则轮询并将其传递给statefull解析器。问题是,你一次只能得到一个角色,当然,对于fscanffgets等类似的功能来说,它并不是那么顺利。