Edward Angel OpenGL示例代码:在联想X60上运行良好,但不会在我的桌面上渲染窗口(英特尔高清图形)

Edward Angel OpenGL示例代码:在联想X60上运行良好,但不会在我的桌面上渲染窗口(英特尔高清图形),opengl,rendering,Opengl,Rendering,我是OpenGL新手,尝试运行Edward Angel的著名著作Interactive Computer Graphics中的一些经典示例代码。然而,我遇到了一个让我很困惑的问题,但对许多其他人来说可能是非常明显的。示例代码为“垫片.c”,可从 我已经在我的联想X60(Windows7)上用VS2010 Express运行了这段代码,它已经成功地绘制了Sierspinski垫片。然而,当我试图用相同的软件系统在我的桌面(英特尔高清图形卡)上运行相同的代码时,它没有画任何东西,只显示了一个空白(白

我是OpenGL新手,尝试运行Edward Angel的著名著作Interactive Computer Graphics中的一些经典示例代码。然而,我遇到了一个让我很困惑的问题,但对许多其他人来说可能是非常明显的。示例代码为“垫片.c”,可从

我已经在我的联想X60(Windows7)上用VS2010 Express运行了这段代码,它已经成功地绘制了Sierspinski垫片。然而,当我试图用相同的软件系统在我的桌面(英特尔高清图形卡)上运行相同的代码时,它没有画任何东西,只显示了一个空白(白色)窗口。该文件已编译/生成,没有问题,也没有错误/警告

垫片c如下所示

/* Two-Dimensional Sierpinski Gasket          */
/* Generated Using Randomly Selected Vertices */
/* And Bisection                              */

#ifdef __APPLE__
#include <GLUT/glut.h>
#else
#include <GL/glut.h>
#endif

void myinit()
{

/* attributes */

     glClearColor(1.0, 1.0, 1.0, 1.0); /* white background */
     glColor3f(1.0, 0.0, 0.0); /* draw in red */

/* set up viewing */
/* 500 x 500 window with origin lower left */

     glMatrixMode(GL_PROJECTION);
     glLoadIdentity();
     gluOrtho2D(0.0, 50.0, 0.0, 50.0);
     glMatrixMode(GL_MODELVIEW);
}

void display( void )
{
    GLfloat vertices[3][2]={{0.0,0.0},{25.0,50.0},{50.0,0.0}}; /* A triangle */

    int j, k;
    int rand();       /* standard random number generator */
    GLfloat p[2] ={7.5,5.0};  /* An arbitrary initial point inside traingle */

    glClear(GL_COLOR_BUFFER_BIT);  /*clear the window */


/* compute and plots 5000 new points */

        glBegin(GL_POINTS);

    for( k=0; k<5000; k++)
    {
         j=rand()%3; /* pick a vertex at random */


     /* Compute point halfway between selected vertex and old point */

         p[0] = (p[0]+vertices[j][0])/2.0; 
         p[1] = (p[1]+vertices[j][1])/2.0;

     /* plot new point */

        glVertex2fv(p); 

     }
     glEnd();
     glFlush(); /* clear buffers */
   }

void main(int argc, char** argv)
{

/* Standard GLUT initialization */

    glutInit(&argc,argv);
    glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); /* default, not needed */
    glutInitWindowSize(500,500); /* 500 x 500 pixel window */
    glutInitWindowPosition(0,0); /* place window top left on display */
    glutCreateWindow("Sierpinski Gasket"); /* window title */
    glutDisplayFunc(display); /* display callback invoked when window opened */

    myinit(); /* set attributes */

    glutMainLoop(); /* enter event loop */
}
/*二维Sierpinski垫片*/
/*使用随机选择的顶点生成*/
/*和二分法*/
#苹果__
#包括
#否则
#包括
#恩迪夫
void myinit()
{
/*属性*/
glClearColor(1.0,1.0,1.0,1.0);/*白色背景*/
glColor3f(1.0,0.0,0.0);/*用红色绘制*/
/*设置查看*/
/*具有左下角原点的500 x 500窗口*/
glMatrixMode(GL_投影);
glLoadIdentity();
gluOrtho2D(0.0,50.0,0.0,50.0);
glMatrixMode(GLU模型视图);
}
作废显示(作废)
{
GLfloat顶点[3][2]={0.0,0.0},{25.0,50.0},{50.0,0.0};/*三角形*/
int j,k;
int rand();/*标准随机数生成器*/
GLfloat p[2]={7.5,5.0};/*traingle内的任意初始点*/
glClear(GL_COLOR_BUFFER_BIT);/*清除窗口*/
/*计算并绘制5000个新点*/
glBegin(总分);

对于(k=0;k尝试从单缓冲(
GLUT\u single
)切换到双缓冲(
GLUT\u double
):

#包括
作废显示(作废)
{
GLfloat顶点[3][2]={0.0,0.0},{25.0,50.0},{50.0,0.0};/*三角形*/
int j,k;
int rand();/*标准随机数生成器*/
GLfloat p[2]={7.5,5.0};/*traingle内的任意初始点*/
glClearColor(1.0,1.0,1.0,1.0);/*白色背景*/
glClear(GL_COLOR_BUFFER_BIT);/*清除窗口*/
glMatrixMode(GL_投影);
glLoadIdentity();
gluOrtho2D(0.0,50.0,0.0,50.0);
glMatrixMode(GLU模型视图);
glLoadIdentity();
/*计算并绘制5000个新点*/
glColor3f(1.0,0.0,0.0);/*用红色绘制*/
glBegin(总分);

对于(k=0;k尝试从单缓冲(
GLUT\u single
)切换到双缓冲(
GLUT\u double
):

#包括
作废显示(作废)
{
GLfloat顶点[3][2]={0.0,0.0},{25.0,50.0},{50.0,0.0};/*三角形*/
int j,k;
int rand();/*标准随机数生成器*/
GLfloat p[2]={7.5,5.0};/*traingle内的任意初始点*/
glClearColor(1.0,1.0,1.0,1.0);/*白色背景*/
glClear(GL_COLOR_BUFFER_BIT);/*清除窗口*/
glMatrixMode(GL_投影);
glLoadIdentity();
gluOrtho2D(0.0,50.0,0.0,50.0);
glMatrixMode(GLU模型视图);
glLoadIdentity();
/*计算并绘制5000个新点*/
glColor3f(1.0,0.0,0.0);/*用红色绘制*/
glBegin(总分);

对于(k=0;k这不是一个答案,而是一个有用的提示-你正在学习非常过时的OpenGL。如果你想真正学习现代图形,现在就停下来学习可编程管道。它速度更快,更灵活,尽管它的初始学习曲线更陡-但是,谁驾驶自动兰博基尼,对吗?问题-r正面提示:试着画一个点或一个三角形,然后再画几个,然后改变周围的颜色。这应该有助于隔离问题。是的,你是对的。我仍然想学习可编程管道。我实际上是从OpenGL教程3.2+开始的,但它不能在我的笔记本电脑(联想X60)上运行,也没有在使用英特尔高清图形卡的桌面上运行。然后,我切换到适用于我的桌面的OpenGL教程2.1,它运行良好。但我仍然坚持使用笔记本电脑:(我想我最终必须更新我的笔记本电脑,尽管我仍然非常喜欢它……这不是一个答案,而是一个有用的提示——你正在学习非常过时的OpenGL。如果你想真正学习现代图形,现在就停下来学习可编程管道。它速度更快,更灵活,尽管它有一个更陡峭的起始点阿宁曲线-但是,嘿,谁驾驶自动兰博基尼,对吗?问题相关提示:尝试绘制一个点或一个三角形,然后再绘制几个,并改变周围的颜色。这应该有助于隔离问题。是的,你是对的。我仍然想学习可编程管道。我实际上从OpenGL教程3.2+开始,但它无法在我的计算机上运行笔记本电脑(联想X60),也没有在我的桌面上运行英特尔高清图形卡。然后我切换到OpenGL教程2.1用于我的桌面,它运行良好。但我的笔记本电脑:(我想我最终将不得不更新我的笔记本电脑,尽管我仍然非常喜欢它……是的,它工作得很好!你能解释一下为什么我的旧联想X60不需要双缓冲,而我需要用intel HD graphics来做这件事吗?我们应该使用单缓冲还是双缓冲有什么条件吗?@iyl:我怀疑在你较新的系统上你是r正在运行执行窗口合成的操作系统。合成器需要双缓冲区交换作为将图片从应用程序绘制到屏幕的提示。在单缓冲窗口上,合成器必须不断拖动,或挂接一些基本的图形上下文功能(在Windows上,通常是BeginPaint/EndPaint和WM_PAINT消息)。通常的OpenGL操作完全失败。@iyl:你也可以尝试一下。我试过了,但没有成功。我认为使用doub缓冲和glutSwapBuffers是OpenGL代码在我的桌面上正常运行的唯一方法。@datenwolf:谢谢你的解释-看起来很有说服力
#include <GL/glut.h>

void display( void )
{
    GLfloat vertices[3][2]={{0.0,0.0},{25.0,50.0},{50.0,0.0}}; /* A triangle */

    int j, k;
    int rand();       /* standard random number generator */
    GLfloat p[2] ={7.5,5.0};  /* An arbitrary initial point inside traingle */

    glClearColor(1.0, 1.0, 1.0, 1.0); /* white background */
    glClear(GL_COLOR_BUFFER_BIT);  /*clear the window */

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();

    gluOrtho2D(0.0, 50.0, 0.0, 50.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();

    /* compute and plots 5000 new points */
    glColor3f(1.0, 0.0, 0.0); /* draw in red */
    glBegin(GL_POINTS);
    for( k=0; k<5000; k++)
    {
        j=rand()%3; /* pick a vertex at random */

        /* Compute point halfway between selected vertex and old point */
        p[0] = (p[0]+vertices[j][0])/2.0; 
        p[1] = (p[1]+vertices[j][1])/2.0;

        /* plot new point */
        glVertex2fv(p); 

    }
    glEnd();

    glutSwapBuffers();
}

void main(int argc, char** argv)
{
    glutInit(&argc,argv);
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB); /* default, not needed */
    glutInitWindowSize(500,500); /* 500 x 500 pixel window */
    glutInitWindowPosition(0,0); /* place window top left on display */
    glutCreateWindow("Sierpinski Gasket"); /* window title */
    glutDisplayFunc(display); /* display callback invoked when window opened */
    glutMainLoop(); /* enter event loop */
}