简体   繁体   中英

Creating a Camera with OpenGL 3.3 and Qt 5.6

I'm quite new to OpenGL and Qt and I've been so far so good with it. Rendering a simple triangle with OpenGL 3.3 wasn't that hard but integrating a Camera is. For some reason my triangle dissappears!? Did I get the math wrong to calculate the matrices? I used these 2 tutorials as a starting point: http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/

https://wiki.qt.io/How_to_use_OpenGL_Core_Profile_with_Qt

My code(the most important parts only):

void GLWidget::initializeGL()
{
    QGLFormat glFormat = QGLWidget::format();
    if ( !glFormat.sampleBuffers() )
        qWarning() << "Could not enable sample buffers";

    // Set the clear color to black
    glClearColor( 0.0f, 0.0f, 0.0f, 1.0f );

    // Prepare a complete shader program…
    if ( !prepareShaderProgram( "A:/Projekte/Qt Workspace/Projects/CGOpenGL/simple.vert", "A:/Projekte/Qt Workspace/Projects/CGOpenGL/simple.frag" ) )
        return;

    /////Matrix calculations/////
    projection.perspective(45.0f, 4.0f / 3.0f, 0.1f, 100.0f);
    view.lookAt(QVector3D(4,3,3),QVector3D(0,0,0),QVector3D(0,1,0));
    model = QMatrix4x4();
    //////////


    // We need us some vertex data. Start simple with a triangle ;-)
    GLfloat points[] = {-0.5f, -0.5f, 0.0f,
                        1.0f, 0.5f, -0.5f,
                        0.0f, 1.0f, 0.0f,
                        0.5f, 0.0f, 1.0f};
    vertexBuffer.create();
    vertexBuffer.setUsagePattern( QGLBuffer::StaticDraw );
    if ( !vertexBuffer.bind() )
    {
        qWarning() << "Could not bind vertex buffer to the context";
        return;
    }
    vertexBuffer.allocate( points, 3 * 4 * sizeof( float ) );

    // Bind the shader program so that we can associate variables from
    // our application to the shaders
    if ( !shader.bind() )
    {
        qWarning() << "Could not bind shader program to context";
        return;
    }

    // Enable the "vertex" attribute to bind it to our currently bound
    // vertex buffer.
    shader.setAttributeBuffer( "vertex", GL_FLOAT, 0, 4 );
    shader.enableAttributeArray( "vertex" );
}

void GLWidget::paintGL()
{
    // Clear the buffer with the current clearing color
    glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );

    // Set the MVP variable in the shader
    shader.setUniformValue("MVP",projection * view * model);

    // Draw stuff
    glDrawArrays( GL_TRIANGLES, 0, 3 );
}

Vertex Shader:

#version 330

layout(location = 0) in vec3 vertexPosition_modelspace;
uniform mat4 MVP;

void main( void )
{
   gl_Position =  MVP * vec4(vertexPosition_modelspace,1);
}

you made a call to

shader.enableAttributeArray( "vertex" );

yet named it:

vertexPosition_modelspace

in the shader, you need to change the names to be consistent.

Try renaming the variable in the shader to "vertex"

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM