Qt5.5中OpenGL着色器程序编写
2016-01-15 14:19
513 查看
Qt5中包含了OpenGL模块,并且对其进行了一些封装,下面就Qt5中OpenGL的程序写法举例:
Qt5中虽然包含了OpenGL,但是没有添加“glu.h>”库,所以有些以前在Qt4中的写法会不太成功,比如设置投影矩阵等,具体方法可以参考:/article/1809016.html中的做法。
但是在下面的例子中没有加入glu库,是完全基于Qt中OpenGL写的。
在控件中可以加入QOpenGLWidget控件,但是也可以对其做提升。代码如下:
2.初始化工作
3.设置视图模型投影矩阵
Qt5中OpenGL的视图-投影矩阵是要自己设置的,不再免费提供。故:
最后mMVPMatrix = mProjectionMatrix * mViewMatrix * mModelMatrix;
4.着色器
GLSL是OpenGL着色语言的统称,是一种编程语言,在应用程序中使用顶点或片段着色器,按照如下步骤:
对于每个着色器对象:
创建着色器对象;
把着色器源代码编译为目标代码;
验证;
然后将多个着色器对象链接到一个着色器程序中,需要:
创建一个着色器程序;
将着色器对象链接到程序;
链接着色器程序;
验证;
着色器代码解读:
“attribute”表示输入变量,输出为”varying”。”uniform”限定一个变量的值由应用程序在着色器执行之前指定,并且在图圆的处理过程中不会变化。
“vec4”是类似于QVector4D,”mat4”类似QMatrix4x4;
5.代码工作
Qt5中虽然包含了OpenGL,但是没有添加“glu.h>”库,所以有些以前在Qt4中的写法会不太成功,比如设置投影矩阵等,具体方法可以参考:/article/1809016.html中的做法。
但是在下面的例子中没有加入glu库,是完全基于Qt中OpenGL写的。
实验平台
VS2010+Qt5.5;实验步骤
新建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着色语言的统称,是一种编程语言,在应用程序中使用顶点或片段着色器,按照如下步骤:
对于每个着色器对象:
创建着色器对象;
把着色器源代码编译为目标代码;
验证;
然后将多个着色器对象链接到一个着色器程序中,需要:
创建一个着色器程序;
将着色器对象链接到程序;
链接着色器程序;
验证;
着色器代码解读:
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);
}
相关文章推荐
- Ubuntu,QT5连接MySQL
- Qt的.pro工程文件语法学习
- QT子线程与主线程的信号槽通信
- osg3.4.0+Qt5.5.0 vs2013 64位编译成功
- Qt中项目一栏配置说明
- Qt5链接Mysql的驱动命令
- QT 常用设置
- qt 信号槽(connect)失效,【多线程使用信号槽】
- Node.js 搭建mqttServer 及 mqttClient
- QT子窗体占用系统资源的释放问题 .
- QT之QSetting类
- qtcreator cannot find -lts
- QTP WebBrowser &Page控件
- 自学QT之UDP发送数据
- Qt(安装及首次体验)
- QT错误处理汇总
- Lepus经历收获杂谈(二)——QT
- QSettings读写注册表、配置文件
- QT CREATOR 编辑器配色
- Qt编译增加FLAG