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

时间:2012-10-13 07:30:30

标签: eclipse opengl mingw glut glew

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

glutMainLoop()

以下是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()

使用带有MinGW的eclipse CDT C / C ++。调试显示glutMainLoop确实被调用但我无法遵循它。它可能是着色器问题吗?据报道他们编译和链接很好,但在这里他们是

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;
}

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()的函数?或者我做了一件非常糟糕的事情?

1 个答案:

答案 0 :(得分:2)

GLUT可以创建多个窗口。 glutDisplayFunc在当前活动的窗口上运行,所以你必须在glut ... Func函数之前调用glutCreateWindow。