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

原创 2016年01月15日 14:19:00

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_OBJECT
public:
    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);
}

这里写图片描述

基于Qt的OpenGL可编程管线学习(1)- 绘制一个三角形

Qt下使用OpenGL Shader绘制一个三角形
  • d514200399
  • d514200399
  • 2017年05月31日 11:52
  • 1261

编写基于Qt的GLSL程序需要注意的几点

最近尝试着编写基于Qt和GLSL的小例子,遇到了一些小问题,在这里给大家分享一下,希望大家不要重蹈覆辙。...
  • jiangcaiyang123
  • jiangcaiyang123
  • 2013年08月25日 10:00
  • 4750

解读Qt OpenGL示例程序 openglwindow

QtOpenGL示例openglwindow 本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代...
  • purGlacier
  • purGlacier
  • 2017年04月02日 14:25
  • 1277

学习笔记1--在Qt5中利用OpenGL渲染一个立方体

上文介绍了如何在Qt5中嵌入一个widget来作为OpenGL的渲染窗口,本文将在上文的基础上再嵌入的OpenGL部件中进行简单的渲染,本例打算绘制一个彩色的立方体;在接下来的介绍中,我不打算介绍Op...
  • u014328804
  • u014328804
  • 2017年02月26日 08:24
  • 1391

qt5_qml_Opengl_shader 第一弹----------------------openglunderqml的简化及介绍

通过qml来显示opengl的对象
  • u010423298
  • u010423298
  • 2015年04月05日 18:21
  • 1662

[Qt和GLSL的笔记2] QGLShaderProgram类

时间:2017年4月21日(大三下学期) 作者:RyuZhihao123 (Northwest A&F; University)        前面,介绍了Qt开发GLSL的程序基本框架,并给了一个...
  • Mahabharata_
  • Mahabharata_
  • 2017年04月21日 13:12
  • 915

基于Qt和GLSL的着色器例子

基于Qt和GLSL的着色器例子          我的计算机换成新的了,可以支持OpenGL2.0以及以上的规范,这样我开始正式涉足OpenGL高级的内容了。目前我的OpenGL基础库是Qt,它有完...
  • jiangcaiyang123
  • jiangcaiyang123
  • 2013年08月25日 10:38
  • 5603

将Qt、OpenGL、GLSL以及Qt的Graphics-View框架组合

将Qt、OpenGL、GLSL以及Qt的Graphics-View框架结合 将Qt、OpenGL、GLSL以及Qt的Graphics-View框架结合   九月份都快过去了,学生们...
  • imxiangzi
  • imxiangzi
  • 2016年03月26日 12:34
  • 1118

基于Qt和GLSL的着色器例子(演示程序+源代码)

  • 2013年08月25日 10:28
  • 6.24MB
  • 下载

Qt使用GLSL开发的一个demo

  • 2017年04月21日 11:45
  • 5KB
  • 下载
收藏助手
不良信息举报
您举报文章:Qt5.5中OpenGL着色器程序编写
举报原因:
原因补充:

(最多只允许输入30个字)