C++ 在opengl中使用线程绘制顶点

C++ 在opengl中使用线程绘制顶点,c++,opengl,C++,Opengl,我将glut库与opengl一起使用,并用它画圆圈。圆是在框架上成功绘制的,但我想在线程中编译这些圆顶点。例如,我把循环放在圆圈中,每个顶点在2秒后绘制完成,而在运行时,每个顶点在经过秒的帧上出现。我正在使用sleep()函数,但无法使用它。 代码: #包括 #包括 #包括 #包括 #包括 #定义M_PI 3.14159265358979323846 使用名称空间std; void init(void){ glClearColor(0.0f、0.0f、0.0f、0.0f); glMatrixMo

我将glut库与opengl一起使用,并用它画圆圈。圆是在框架上成功绘制的,但我想在线程中编译这些圆顶点。例如,我把循环放在圆圈中,每个顶点在
2秒后绘制完成,而在运行时,每个顶点在经过秒的帧上出现。我正在使用
sleep()
函数,但无法使用它。
代码:

#包括
#包括
#包括
#包括
#包括
#定义M_PI 3.14159265358979323846
使用名称空间std;
void init(void){
glClearColor(0.0f、0.0f、0.0f、0.0f);
glMatrixMode(GL_投影);
glLoadIdentity();
格洛托(-1.0,1.0,-1.0,1.0,-1.0,1.0);
}
无效键盘(无符号字符键,整数x,整数y)
{
开关(钥匙)
{
案例“\x1B”:
退出(退出成功);
打破
}
}
空心绘图圆(浮点X、浮点Y、浮点半径、整数段)
{
glBegin(GL_线_环);
对于(int i=0;i
如果我正确理解了您的问题,您希望为圆的绘制设置动画。OpenGL中的绘制命令不会立即发出-您需要绘制,然后将结果显示给窗口。因此,在绘图函数中使用
睡眠
,将延迟演示。使用您发布的代码,在
drawCircle
中循环的每次迭代中,您都会休眠2秒钟。由于您正在传入
segment=360
,因此渲染圆大约需要12分钟(在这段时间内,您的应用程序将显示为挂起)。很可能,您应该在一种状态下绘制帧2秒,然后绘制下一种状态

要实现这一点,您应该删除
睡眠
,并在
显示
功能中设置一个计时器,随着时间的推移,该计时器会增加
参数。例如:

#include <ctime>
// ...
void display()
{
    static clock_t startTime = clock(); // NOTE: evaluated only once
    clock_t currentTime = clock();
    float timeLength = 2.0f * CLOCKS_PER_SEC;
    float circlePercentage = (currentTime - startTime) / timeLength;        
    circlePercentage = circlePercentage >= 1.0f ? 1.0f : circlePercentage; //clamp
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0f,0.0f,0.0f);
    drawCircle(0.0f, 0.0f, 0.80f, static_cast<int>(circlePercentage * 360));
    glFlush();
}
#包括
// ...
无效显示()
{
静态时钟\u t startTime=clock();//注意:只计算一次
clock_t currentTime=时钟();
浮动时间长度=2.0f*时钟每秒;
浮点数百分比=(当前时间-开始时间)/时间长度;
circlePercentage=circlePercentage>=1.0f?1.0f:circlePercentage;//夹具
glClear(GLU颜色缓冲位);
GL3F(1.0f,0.0f,0.0f);
拉丝圈(0.0f,0.0f,0.80f,静态_铸造(圈百分比*360));
glFlush();
}

如果我理解正确,您想画一个圆,请等待2秒钟,然后再次绘制。如果这是你想要的,那你就睡错地方了。通过在循环段内进行休眠,可以在每个顶点之间休眠,但如果要在连续绘制圆之间休眠,请在glEnd()调用后或在主显示方法中移动休眠。currentTime,startTime,timeLength如何初始化这些变量,下面是红色的下划线。例如,您可以使用ctime初始化它们。更新后,时钟更适合计时,因为分辨率更高-然而,这不是“真实”的wallclock时间,但可能足以满足您的需要。但当时间过去时,您的代码会在帧上画圆圈。但是有没有办法,当显示帧时,我们可以看到每个顶点立即绘制并形成一个完整的圆圈。如果要立即绘制完整的圆圈,只需设置
circlePercentage=1.0f
#include <ctime>
// ...
void display()
{
    static clock_t startTime = clock(); // NOTE: evaluated only once
    clock_t currentTime = clock();
    float timeLength = 2.0f * CLOCKS_PER_SEC;
    float circlePercentage = (currentTime - startTime) / timeLength;        
    circlePercentage = circlePercentage >= 1.0f ? 1.0f : circlePercentage; //clamp
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0f,0.0f,0.0f);
    drawCircle(0.0f, 0.0f, 0.80f, static_cast<int>(circlePercentage * 360));
    glFlush();
}