1

非常に単純な opengl/glut/glew プログラムを起動して実行しようとしています。現在、display()渡された関数は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()関数は次のとおりです。

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()ですか?それとも、私は何かひどく間違ったことをしていますか?

4

1 に答える 1

2

GLUT は複数のウィンドウを作成できます。glutDisplayFunc は現在アクティブなウィンドウで動作するため、glut…Func 関数の前に glutCreateWindow を呼び出す必要があります。

于 2012-10-13T09:59:33.933 に答える