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;
实验步骤
- 新建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着色语言的统称,是一种编程语言,在应用程序中使用顶点或片段着色器,按照如下步骤:
对于每个着色器对象:
- 创建着色器对象;
- 把着色器源代码编译为目标代码;
验证;
然后将多个着色器对象链接到一个着色器程序中,需要:创建一个着色器程序;
- 将着色器对象链接到程序;
- 链接着色器程序;
- 验证;
着色器代码解读:
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
- Qt5.5中OpenGL着色器程序编写
- OpenGL编译着色器程序
- OpenGL着色器程序解析--初识着色器
- OpenGL着色器程序解析--着色器基础
- opengl es 3:程序使用着色器
- OpenGL着色器程序解析--keypress
- 用着色器编写第一个程序
- OpenGL ES 着色器中问题解决技巧
- OpenGL中使用GLSL着色器
- OpenGL中使用着色器的步骤
- OpenGL学习笔记5:着色器
- OpenGL学习笔记5:着色器2
- OpenGL 着色器语言
- OpenGL着色器语言
- opengl顶点着色器
- OpenGL ES 着色器
- OpenGL着色器介绍
- 【OpenGL】着色器 Shader
- 支付 平台连接
- java 发送html格式邮件 样式混乱解决
- Android TextWatcher使用详解
- java特种兵读书笔记(3-6)——java程序员的OS之JAVA常用工具
- 正则表达式(简洁版)
- Qt5.5中OpenGL着色器程序编写
- (2)html学习笔记(粗略几笔)
- java 接口学习任务
- Android tips(五)-->android系统设置中的应用详情
- 1.15-学习概况
- iOS 开发 设置网络请求允许使用http
- bitmapfactory.options 优化内存小问题
- exe4j生成 根据jar包生成exe文件
- Cocos2dx个人笔记之屏幕适配