<qt5.5 problems =“”> QOpenGLWidget在Mac OS X中无法渲染任何内容

时间:2015-10-02 05:08:48

标签: c++ opengl qt5

这是我的问题,任何人都可以帮助我吗?

我正在尝试使用QOpenGLWidget来渲染一个简单的例子,一个三角形。但问题是小部件是完全黑色的,不能渲染任何东西。

在main.cpp中:

int main(int argc, char **argv)
{
    QApplication app(argc, argv);        

    QSurfaceFormat format;
    format.setProfile (QSurfaceFormat::CoreProfile);
    format.setVersion (4 , 3);
    format.setSwapBehavior (QSurfaceFormat::DoubleBuffer);
    format.setRenderableType (QSurfaceFormat::OpenGL);
    QSurfaceFormat::setDefaultFormat (format);

    MyViewer.show();

    return app.exec();
}

在MyViewer.cpp中:

namespace {
    static const char VertexShaderCode[] =
        "#version 410\n"
        "layout(location=0) in vec2 position;"
        "layout(location=1) in vec3 color;"
        ""
        ""
        "void main()"
        "{"
        "   gl_Position = vec4(position, 0.0, 1.0);"
        "}\0";

    static const char FragmentShaderCode[] =
        "#version 410\n"
        ""
        "out vec4 output_color;"
        ""
        "void main()"
        "{"
        "   output_color = vec4(1.0, 0.0, 0.0, 1.0);"
        "}\0";

    void InstallShaders () {
        QOpenGLShader vertex_shader (QOpenGLShader::Vertex , 0);
        QOpenGLShader fragment_shader (QOpenGLShader::Fragment , 0);

        vertex_shader.compileSourceCode (::VertexShaderCode);
        fragment_shader.compileSourceCode (::FragmentShaderCode);

        assert(vertex_shader.isCompiled () and fragment_shader.isCompiled ());

        QOpenGLShaderProgram program;

        program.addShader (& vertex_shader);
        program.addShader (& fragment_shader);

        program.link ();

        assert(program.isLinked ());

        assert(program.bind ());
        // glUseProgram (program.programId ());
    }
};

...

void MyViewer::InitializeGL() {
    initializeOpenGLFunctions();
    InistallShaders();
    GLuint buffer_id;
    glGenBuffers (1 , & buffer_id);
    glBindBuffer (GL_ARRAY_BUFFER , buffer_id);

    GLfloat vertices[] = {
        +0.0f , +0.8f , // top
        +1.0f , +0.0f , +0.0f , // red
        -0.8f , -0.8f , // left
        +0.0f , +1.0f , +0.0f , // blue
        +0.8f , -0.8f , // right
        +0.0f , +0.0f , +1.0f , // green
    };

    glBufferData (GL_ARRAY_BUFFER , sizeof (vertices) , vertices , GL_STATIC_DRAW);
    glEnableVertexAttribArray (0);
    glEnableVertexAttribArray (1);

    glVertexAttribPointer (0 , 2 , GL_FLOAT , GL_FALSE , sizeof (float) * 5 , 0);
    glVertexAttribPointer (1 , 3 , GL_FLOAT , GL_FALSE , sizeof (float) * 5 , (char *) (sizeof (float) * 2));
}

void MyViewer::paintGL () {
    glDrawArrays (GL_TRIANGLES , 0 , 3);
}

但没有渲染,我只有一个黑色的窗口。

我尝试渲染没有着色器的三角形,然后删除

glVertexAttribPointer(1);

glVertexAttribPointer (1 , 3 , GL_FLOAT , GL_FALSE , sizeof (float) * 5 , (char *) (sizeof (float) * 2));

为了在黑色平面上渲染一个白色三角形,但它也不起作用。顺便说一下,构建和所有assert(...)都成功了,我认为着色器编译工作正常。

0 个答案:

没有答案