【问题标题】:opengl code compilation issueopengl代码编译问题
【发布时间】:2015-04-04 04:27:04
【问题描述】:

绘制形状后,我无法在我的显示功能中绘制更多形状。但它在其他方法中被完美绘制,但不是在我的 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;

}

【问题讨论】:

  • 您只需要在主显示函数结束时每帧调用一次glutSwapBuffers()
  • 在这段代码中,我画了一个可怜的对象,并在可见范围内沿 x 轴不断移动对象。通过在我的主显示功能最后调用一次 glutSwapBuffers() 并不能解决我的问题。它没有在屏幕上绘制任何新形状,甚至没有停止我之前绘制的形状的移动。我也尝试过使用单个缓冲区,但它也在提取同样的问题

标签: opengl graphics


【解决方案1】:

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

另外,虽然技术上没有错误,但风格上的问题是,应该将 glutSwapBuffers 移到显示函数中,这样在维护程序时就不会去寻找诸如在哪个子程序中执行缓冲区交换之类的细节.

【讨论】:

  • 在这段代码中,我画了一个可怜的对象,并在可见范围内沿 x 轴不断移动对象。通过在我的主显示功能的最后调用一次 glutSwapBuffers() 并不能解决我的问题。它没有在屏幕上绘制任何新形状,甚至没有停止我之前绘制的形状的移动。我也尝试过使用单个缓冲区,但它也在提取同样的问题。但是,如果我在除 myDisplay() 之外的 drawthrower()/draw circle() 中的其他方法上绘制某些东西,我将完美地生成精确的输出。
  • #include "mongo/client/dbclient.h" #include &lt;iostream&gt; #include &lt;cstdlib&gt; using namespace std; using namespace mongo; int main(int argc, const char** argv) { cout&lt;&lt;"good so far"&lt;&lt;endl; client::GlobalInstance instance; //everytime producing segmentation fault if (!instance.initialized()) { std::cout &lt;&lt; "failed to initialize the client driver: " &lt;&lt; instance.status() &lt;&lt; std::endl; return EXIT_FAILURE; } else { std::cout &lt;&lt; "Successfully initialized the client driver: " &lt;&lt; instance.status() &lt;&lt; std::endl; } return EXIT_SUCCESS; }
猜你喜欢
  • 2014-06-08
  • 2011-07-18
  • 2012-05-07
  • 2017-01-28
  • 1970-01-01
  • 2011-07-07
  • 1970-01-01
  • 2015-01-06
  • 2015-02-15
相关资源
最近更新 更多