opengl代码编译问题

时间:2015-04-03 18:39:53

标签: opengl graphics

绘制形状后,我的显示功能无法再绘制任何形状。但它在其他方法中被完美地绘制,但在我的glutidlefunction(myDispalay)中却没有。在这里呆了大约两天。谁可以帮助我从这里出来?

以下是代码:

include < stdio.h>

include< math.h>

include < GL/glut.h>

define PI 3.1416

float x,y,r,y2,r2;

void drawCircle(float x, float y, float radius)

{
    int i;

    int triangleAmount = 1000; //# of triangles used to draw circle

    float twicePi = 2.0f * PI;

    glBegin(GL_TRIANGLE_FAN);

    for(i = 0; i <= triangleAmount;i++)

    {
        glVertex2f( x + (radius * cos(i * twicePi / triangleAmount)),
            y + (radius * sin(i * twicePi / triangleAmount)));
    }
    glEnd();
}

void drawthrower()

{
    glClear(GL_COLOR_BUFFER_BIT);

    glColor3f(0.0,1.0,0.0);
    drawCircle(x,y,r);
    glBegin(GL_LINES);
        glVertex2i(x-12,y-28);
        glVertex2i(x-12,y-70);

        glVertex2i(x+12,y-28);
        glVertex2i(x+12,y-70);
    glEnd();
    drawCircle(x,y2,r2);
    glutSwapBuffers();
}

void myDisplay()
{

       while ((x+r)<=1024)
        {
            x+=8;
            drawthrower();
        }

     while ((x-r)>=0)
       {
            x-=8;
            drawthrower();
       }

}


void myInit()
{

    glClearColor(1,1,1,1);

    x=50,y=693,r=30,x=50,y2=623,r2=12;

}

void reshape(int w, int h)
{

   glViewport(0, 0, (GLsizei) w, (GLsizei) h);

   glMatrixMode(GL_PROJECTION);

   glLoadIdentity();

   glOrtho(0.0, 1024.0, 0.0, 768.0, 0.0, 1.0);

   glMatrixMode(GL_MODELVIEW);

}


int main(int argc, char** argv)

{

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);
    glutInitWindowSize(1024,768);
    glutInitWindowPosition(0, 0);
    glutCreateWindow("Graphics_Project");
    myInit();
    glutReshapeFunc(reshape);
    glutIdleFunc(myDisplay);
    glutMainLoop();
    return 0;

}

1 个答案:

答案 0 :(得分:0)

使用GLUT时,绘图代码应与显示回调函数隔离。您当前已将显示功能注册为空闲功能。要使程序调用显示函数,请从idle函数中连续调用glutPostRedisplay(或将glutPostRedisplay 注册为空闲函数)。您应该将绘图代码限制为显示回调的原因是,根据操作系统发送重绘事件时,可能会设置某些特殊状态。

另外,虽然技术上没有错,但是风格问题是,应该将glutSwapBuffers移动到显示功能中,这样在维护程序时就不会寻找详细信息,例如在哪个子程序中执行缓冲区交换