簡體   English   中英

雙重緩沖並反映C ++ / OpenGL中的變量更改

[英]Double Buffering and reflecting variable changes in C++/OpenGL

我希望允許用戶通過控制台更改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數組的值,但這對我不起作用。 關於如何實現自己想要的任何想法?

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

您需要狀態。 聲明一個供程序使用的變量,在處理控制台事件時對其進行更改,並使用該變量來顯示內容。

除非可以將控制台緩沖區交互與渲染交互,否則您很可能需要一個線程解決方案。

關於如何實現自己想要的任何想法?

最簡單的解決方案是產生一個與stdio交互的額外線程。 如果在GLUT主循環(線程)中執行此操作,則每次對stdio塊進行的操作都會凍結整個程序。 這絕對不是您想要的。

另一種選擇是在stdio上僅使用非阻塞操作,輪詢輸入是否可用並將其傳遞給全狀態解析器。 這樣做的問題是,您一次只能獲得一個字符,當然,對於fscanffgets類的功能,此類字符並不能很好地發揮作用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM