Qt5.5中OpenGL着色器程序编写

来源:互联网 发布:安卓秒变iphone软件 编辑:程序博客网 时间:2024/06/03 20:55

Qt5中包含了OpenGL模块,并且对其进行了一些封装,下面就Qt5中OpenGL的程序写法举例:
Qt5中虽然包含了OpenGL,但是没有添加“glu.h>”库,所以有些以前在Qt4中的写法会不太成功,比如设置投影矩阵等,具体方法可以参考:http://blog.csdn.net/ccf19881030/article/details/17842981中的做法。
但是在下面的例子中没有加入glu库,是完全基于Qt中OpenGL写的。

实验平台

VS2010+Qt5.5;

实验步骤

  1. 新建Qt工程,包含QOpenGL模块

在控件中可以加入QOpenGLWidget控件,但是也可以对其做提升。代码如下:

class OpenGLWidget : public QOpenGLWidget , protected QOpenGLFunctions{    Q_OBJECTpublic:    OpenGLWidget(QWidget *parent=0);    ~OpenGLWidget();    void initializeGL();    void resizeGL(int w, int h);    void paintGL();

2.初始化工作

OpenGLWidget::OpenGLWidget(QWidget *parent)    : QOpenGLWidget(parent){    QSurfaceFormat format;    format.setDepthBufferSize(24);    setFormat(format);    setMouseTracking(false);}

3.设置视图模型投影矩阵
Qt5中OpenGL的视图-投影矩阵是要自己设置的,不再免费提供。故:

QMatrix4x4 mModelMatrix;//模型矩阵  QMatrix4x4 mViewMatrix; //视图矩阵  QMatrix4x4 mProjectionMatrix; //投影矩阵  QMatrix4x4 mMVPMatrix; //MVP矩阵

最后mMVPMatrix = mProjectionMatrix * mViewMatrix * mModelMatrix;
4.着色器
GLSL是OpenGL着色语言的统称,是一种编程语言,在应用程序中使用顶点或片段着色器,按照如下步骤:
对于每个着色器对象:

  1. 创建着色器对象;
  2. 把着色器源代码编译为目标代码;
  3. 验证;
    然后将多个着色器对象链接到一个着色器程序中,需要:

  4. 创建一个着色器程序;

  5. 将着色器对象链接到程序;
  6. 链接着色器程序;
  7. 验证;
    着色器代码解读:
const GLchar *vshader_source =        "attribute vec4 posAttr;\n"        "uniform mat4 matrix;\n"        "void main() {\n"        "   gl_Position = matrix * posAttr;\n"        "}\n";    const GLchar *cshader_source =        "uniform vec4 color;\n"        "void main(){\n"        "   gl_FragColor= color;\n"        "}\n";

“attribute”表示输入变量,输出为”varying”。”uniform”限定一个变量的值由应用程序在着色器执行之前指定,并且在图圆的处理过程中不会变化。
“vec4”是类似于QVector4D,”mat4”类似QMatrix4x4;

5.代码工作

void OpenGLWidget::resizeGL(int w, int h){    mProjectionMatrix.setToIdentity();    mProjectionMatrix.perspective(60.0f, w / float(h), 0.01f, 1000.0f);//投影矩阵}void OpenGLWidget::initializeGL(){    initializeOpenGLFunctions();    shadercode();}void OpenGLWidget::paintGL(){     glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);     mModelMatrix.setToIdentity();     mModelMatrix.rotate(angles, 0.0f, 1.0f, 0.0f);    drawelem();    OpenGLWidget::update();//刷新}void OpenGLWidget::shadercode(){    const GLchar *vshader_source =        "attribute vec4 posAttr;\n"        "uniform mat4 matrix;\n"        "void main() {\n"        "   gl_Position = matrix * posAttr;\n"        "}\n";    const GLchar *cshader_source =        "uniform vec4 color;\n"        "void main(){\n"        "   gl_FragColor= color;\n"        "}\n";    angles=0.0;    m_shaderprogram=new QOpenGLShaderProgram(this);    QOpenGLShader vecShader(QOpenGLShader::Vertex);    vecShader.compileSourceCode(vshader_source);    QOpenGLShader colShader(QOpenGLShader::Fragment);    //vec_handl=m_shaderprogram->addShaderFromSourceCode(QOpenGLShader::Vertex,vshader_source);    //col_handl=m_shaderprogram->addShaderFromSourceCode(QOpenGLShader::Fragment,cshader_source);    colShader.compileSourceCode(cshader_source);    m_shaderprogram->addShader(&vecShader);    m_shaderprogram->addShader(&colShader);    m_shaderprogram->link();    vec_handl=m_shaderprogram->attributeLocation("posAttr");    col_handl=m_shaderprogram->uniformLocation("color");    mvp_handl=m_shaderprogram->uniformLocation("matrix");    mViewMatrix.lookAt(QVector3D(0.0f, 0.0f, -3.0f), QVector3D(0.0f, 0.0f, 1.0f), QVector3D(0.0f, 1.0f, 0.0f));}void OpenGLWidget::drawelem(){    static GLfloat const triangleVertices[] = {        1.0f,  0.0f,  0.0f,        0.0f, 1.0f, 0.0f,        -1.0f,  0.0f, 0.0f    };    QVector4D colors(1.0f, 1.0f, 0.0f, 1.0f) ;    mMVPMatrix = mProjectionMatrix  * mViewMatrix * mModelMatrix;     m_shaderprogram->enableAttributeArray(vec_handl);    m_shaderprogram->setAttributeArray(vec_handl,triangleVertices,3);    m_shaderprogram->setUniformValue(mvp_handl,mMVPMatrix);    m_shaderprogram->setUniformValue("color",colors);    glDrawArrays(GL_TRIANGLES, 0, 3);    m_shaderprogram->bind();    m_shaderprogram->disableAttributeArray(vec_handl);    m_shaderprogram->disableAttributeArray(col_handl);}

这里写图片描述

0 0
原创粉丝点击