[英]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上僅使用非阻塞操作,輪詢輸入是否可用並將其傳遞給全狀態解析器。 這樣做的問題是,您一次只能獲得一個字符,當然,對於fscanf
, fgets
類的功能,此類字符並不能很好地發揮作用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.