首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么会导致glutMainLoop()不调用传递给glutDisplayFunc()的函数?

什么会导致glutMainLoop()不调用传递给glutDisplayFunc()的函数?
EN

Stack Overflow用户
提问于 2012-10-13 15:30:30
回答 1查看 755关注 0票数 1

尝试让一个非常简单的opengl/glut/glew程序启动并运行。当前未调用传递给glutDisplayFunc()display()函数。执行时,init()设置所有内容,并给我一个空白的白色窗口,但display从不用生成的点填充它。下面是在进入glutMainLoop()之前调用的init()函数

代码语言:javascript
复制
void init()
{

    //generate points
    const int NumPoints = 5000;
    point3 points[NumPoints];

    point3 vertices[3] = {point3(-1.0, -1.0, 0.0),
                          point3(0.0, 1.0, 0.0),
                          point3(1.0, -1.0, 0.0)};


    points[0] = point3(0.25, 0.5, 0.0);

    for(int k = 1; k < NumPoints; k++)
    {
        int j = rand() % 3;
        points[k] = (points[k-1]+vertices[j])/2.0;
    }

    //load shaders and use the resulting shader program
    GLuint program = InitShader("shaders/vshader.glsl", "shaders/fshader.glsl");

    GLint linked;
    glGetProgramiv( program, GL_LINK_STATUS, &linked );
    if( !linked ){
        std::cerr << "Shader program failed to link" << std::endl;
        GLint logSize;
        glGetProgramiv( program, GL_INFO_LOG_LENGTH, &logSize);
        char *logMsg = new char[logSize];
        glGetProgramInfoLog( program, logSize, NULL, logMsg);
        std::cerr << logMsg << std::endl;
        delete [] logMsg;

        exit( EXIT_FAILURE );
    }

    glUseProgram( program );

    //create Vertex-Array object
    GLuint aBuffer;

    glGenVertexArrays(1, &aBuffer);
    glBindVertexArray((GLuint)&aBuffer);

    //create Buffer object
    GLuint buffer;

    //glGenBuffers(1, &buffer);
    glGenBuffers(1, &buffer);
    glBindBuffer(GL_ARRAY_BUFFER, buffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(points),
                 points, GL_STATIC_DRAW);

    //initialize the vertex position attribute from the vertex shader
    GLuint loc = glGetAttribLocation( program, "vPosition");
    glEnableVertexAttribArray( loc );
    glVertexAttribPointer( loc, 3, GL_FLOAT, GL_FALSE, 0, 0);

    glClearColor( 1.0, 1.0, 1.0, 1.0);  // white background


}

下面是main()display()函数:

代码语言:javascript
复制
void display()
{
    fprintf(stderr, "display called!\n");
    glClear(GL_COLOR_BUFFER_BIT);
    glDrawArrays(GL_POINTS, 0, 5000);
    glFlush();
}

int main(int argc, char **argv)
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
    glutInitWindowSize(500, 500);
    glutInitWindowPosition(100, 100);
    glutDisplayFunc(display);
    glutCreateWindow("Program 1");
    glewInit();

    init();

    glutMainLoop();
    return 0;
}

使用eclipse CDT C/C++和MinGW。调试显示glutMainLoop确实被调用了,但我不能超过这个范围。会不会是着色器的问题?据报道,它们的编译和链接都很好,但在这里

代码语言:javascript
复制
vshader.glsl

#version 150

in vec4 vPosition;

void main() {
    gl_Position = vPosition;
}

代码语言:javascript
复制
fshader.glsl

#version 150

out vec4 fColor;

void main() {
    fColor = vec4(1.0, 0.0, 0.0, 1.0);
}

编辑:着色器肯定可以工作。通过将glutIdleFunc(display);插入到main()中,程序可以正确执行并绘制所有预期的点。就像我最初想的那样,出于某种原因,glutMainLoop()只是不想调用传递给glutDisplayFunc()的函数?还是我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-13 17:59:34

GLUT可以创建多个窗口。glutDisplayFunc在当前活动窗口上操作,因此您必须在调用glut…之前调用glutCreateWindowFunc函数。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12870994

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档