使用 OpenGL 3.3 和 Qt 5.6 创建相机
Creating a Camera with OpenGL 3.3 and Qt 5.6
我对 OpenGL 和 Qt 还很陌生,但到目前为止我对它们都非常熟悉。使用 OpenGL 3.3 渲染一个简单的三角形并不难,但集成相机就难了。出于某种原因,我的三角形消失了!?我计算矩阵的数学错误吗?我使用这两个教程作为起点:http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/
https://wiki.qt.io/How_to_use_OpenGL_Core_Profile_with_Qt
我的代码(只有最重要的部分):
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 );
}
顶点着色器:
#version 330
layout(location = 0) in vec3 vertexPosition_modelspace;
uniform mat4 MVP;
void main( void )
{
gl_Position = MVP * vec4(vertexPosition_modelspace,1);
}
你给
打了电话
shader.enableAttributeArray( "vertex" );
尚未命名:
vertexPosition_modelspace
在着色器中,您需要将名称更改为一致。
尝试将着色器中的变量重命名为 "vertex"
我对 OpenGL 和 Qt 还很陌生,但到目前为止我对它们都非常熟悉。使用 OpenGL 3.3 渲染一个简单的三角形并不难,但集成相机就难了。出于某种原因,我的三角形消失了!?我计算矩阵的数学错误吗?我使用这两个教程作为起点:http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/
https://wiki.qt.io/How_to_use_OpenGL_Core_Profile_with_Qt
我的代码(只有最重要的部分):
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 );
}
顶点着色器:
#version 330
layout(location = 0) in vec3 vertexPosition_modelspace;
uniform mat4 MVP;
void main( void )
{
gl_Position = MVP * vec4(vertexPosition_modelspace,1);
}
你给
打了电话shader.enableAttributeArray( "vertex" );
尚未命名:
vertexPosition_modelspace
在着色器中,您需要将名称更改为一致。
尝试将着色器中的变量重命名为 "vertex"