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

Posted

技术标签:

【中文标题】什么可能导致 glutMainLoop() 不调用传递给 glutDisplayFunc() 的函数?【英文标题】:What could cause glutMainLoop() to not call the function passed to glutDisplayFunc()? 【发布时间】:2012-10-13 07:30:29 【问题描述】:

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

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() 函数:

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;

在 MinGW 中使用 eclipse CDT C/C++。调试表明 glutMainLoop 确实被调用了,但我无法超越它。会不会是着色器问题?据报道他们正在编译和链接,但他们在这里

vshader.glsl

#version 150

in vec4 vPosition;

void main() 
    gl_Position = vPosition;

.

fshader.glsl

#version 150

out vec4 fColor;

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

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

【问题讨论】:

想通了。 glutDisplayFunc() 必须在 init() 之后调用。尴尬。 【参考方案1】:

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

【讨论】:

以上是关于什么可能导致 glutMainLoop() 不调用传递给 glutDisplayFunc() 的函数?的主要内容,如果未能解决你的问题,请参考以下文章

从 glutMainLoop() 中调用函数

如何在 glfw 中 glutDisplayFunc、glutMainLoop?

OpenGL Ubuntu 13.10 QtCreator - 未定义对“glutMainLoop”的引用

围绕 glutMainLoop 执行我的程序的其余部分?

什么可能导致 React Native 组件不断地卸载和重新安装?

函数调用导致堆栈不对称。原因可能是托管的 PInvoke 签名与非托管的目标签名不匹配。