基于Qt和GLSL的着色器例子
我的计算机换成新的了,可以支持OpenGL2.0以及以上的规范,这样我开始正式涉足OpenGL高级的内容了。目前我的OpenGL基础库是Qt,它有完备的功能,以及对OpenGL一层好的封装,所以用它来开发基于OpenGL的应用程序非常合适。下面是我就来介绍一下如何开发基于Qt和GLSL的程序。
GLSL是在OpenGL2.0时开始引入的一种语言,它可以让开发者定制自己的着色方式,而不是像原来一样走固定渲染管线。我们知道如果要达到一些色彩的渲染效果,需要一大堆以gl开头的函数,如glLightfv()、glMaterialfv()、glFogv()等等,而使用GLSL,则可以很简单地使用OpenGL的着色语言来达到上述函数的效果,有时候使用上述函数无法达到的效果,GLSL都可以做到。使用GLSL还有一个好处就是如果需要在运行时改变渲染效果,那么使用GLSL是非常方便的,而OpenGL2.0以前的那些函数可能因为需要调换次序等原因无法做到这样的效果。综上所述,GLSL对于开发现代应用程序还是非常有用的。
演示程序下载地址:这里
源代码下载地址:这里
那么该如何制作一个简单的基于Qt和GLSL的程序呢?首先从我们熟悉的GLWidget开始。
class GLWidget: public QGLWidget,
protected QOpenGLFunctions
{
Q_OBJECT
public:
GLWidget( QWidget* pParent = 0 );
void initializeGL( void );
void resizeGL( int width, int height );
void paintGL( void );
public slots:
void CompileAndLinkVertexShader( const QString& shaderText );
void CompileAndLinkFragmentShader( const QString& shaderText );
protected:
void mousePressEvent( QMouseEvent* pEvent );
void mouseReleaseEvent( QMouseEvent* pEvent );
void mouseMoveEvent( QMouseEvent* pEvent );
void wheelEvent( QWheelEvent* pEvent );
private:
void CubeVertices( GLfloat length );
void CubeColors( void );
void SetupShaders( void );
// 摄像机
Camera m_Camera;
// 鼠标事件需要
QPoint m_LastPos;
// 顶点缓存和颜色缓存
GLuint m_VertexBuffer, m_ColorBuffer;
// 着色器
QOpenGLShader *m_pVertexShader, *m_pFragmentShader;
// 着色器程序
QOpenGLShaderProgram m_ShaderProgram;
// 维持宽高比的参数
qreal m_AspectRatio;
};
为了保证OpenGL函数调用的正确性,我们需要让我们的GLWidget继承于QOpenGLFunctions,QOpenGLFunctions类的作用是用来提供有保证的OpenGL/ES2.0函数,通常使用OpenGL函数的类需要继承它。随后我们定义了两个着色器类(QOpenGLShader类)的指针m_pVertexShader和m_pFragmentShader。之所以定义为指针是有原因的,上面一篇文章讲述了这些原因。QOpenGLShaderProgram类可以为对象也可以为指针,这依大家的喜好而定。
随后是GLWidget类的实现,这里我截取了重要的SetupShaders()函数来给大家分享。
void GLWidget::SetupShaders( void )
{
m_pVertexShader = new QOpenGLShader( QOpenGLShader::Vertex,
&m_ShaderProgram );
CHECK( m_pVertexShader->compileSourceCode( g_VertexShaderText ),
m_pVertexShader->log( ) );
m_pFragmentShader = new QOpenGLShader( QOpenGLShader::Fragment,
&m_ShaderProgram );
CHECK( m_pFragmentShader->compileSourceCode( g_FragmentShaderText ),
m_pFragmentShader->log( ) );
CHECK( m_ShaderProgram.addShader( m_pVertexShader ),
m_ShaderProgram.log( ) );
CHECK( m_ShaderProgram.addShader( m_pFragmentShader ),
m_ShaderProgram.log( ) );
CHECK( m_ShaderProgram.link( ),
m_ShaderProgram.log( ) );
m_ShaderProgram.bind( );
}
如代码所示,CHECK()宏是用来检测是否出错的。这段代码,简单地说其实需要五步。首先要通过new运算符在内存中创建空间,然后调用QOpenGLShader::compileSourceCode()函数来将源代码编译成二进制格式,再使用QOpenGLShaderProgram::addShader()函数来装入shader对象,第四步是使用QOpenGLShaderProgram::link()函数来进行链接,最后一步则是将使用QOpenGLShaderProgram::bind()函数将着色器程序绑定至当前的context()中。这样的话就可以在屏幕上呈现着色的效果了。
我制作的这个小例子还带了一个着色器编辑器,像这样:
支持即时编译链接着色器,支持在GLSL规定的语法高亮,有关语法高亮的内容,感兴趣的同学可以下载一下。
最后,如果大家有好的意见和建议,可以通过程序的反馈功能将自己想说的联系我,我会及时回复的。
演示程序下载地址:这里
源代码下载地址:这里
分享到:
相关推荐
下面是我就来介绍一下如何开发基于Qt和GLSL的程序。 我制作的这个小例子还带了一个着色器编辑器。支持即时编译链接着色器,支持在GLSL规定的语法高亮,有关语法高亮的内容,感兴趣的同学可以下载一下。
下面是我就来介绍一下如何开发基于Qt和GLSL的程序。 我制作的这个小例子还带了一个着色器编辑器。支持即时编译链接着色器,支持在GLSL规定的语法高亮,有关语法高亮的内容,感兴趣的同学可以下载一下。
简单GLSL纹理着色器 需要显卡OpenGL版本在2.0以上 需要的朋友可以下载
动态重载GLSL着色器的界面
这是一个简单的GLSL着色程序的完整代码,GLSL需要显卡支持OpenGL版本2.0以上
GLSLShaderLib GLSL着色器库现代OpenGL严重依赖GLSL着色器。 您绘制的几乎所有内容都需要它们。 由于存在某些“默认”着色器效果,因此我决定创建此着色器集合,并希望它不会第n次(重新)编写着色器。着色器组织...
着色器编辑器Qt着色器编辑器,用于对GLSL着色器进行编程 阅读维基!
Mandelbrot Zoom GLSL着色器在Game Maker Studio 2(2.3之前)中实现了带有GLSL着色器的高效Mandelbrot缩放。 尽管在游戏引擎中实现了着色器代码,但它是可移植的,并且可以在Game Maker Studio 2环境之外的其他项目...
Atom-linter-glsl.zip,Atom包,它可以在运行中对glsl着色器进行lints操作。棉短绒,atom是一个用web技术构建的开源文本编辑器。
shader-school, 用于GLSL着色器和图形编程的workshopper 明暗器学校 GLSL shaders的介绍和在你的浏览器中运行的图形编程。 正在运行这个东西首先,需要使用WebGL获取浏览器,以及 node.js 插件和 git插件的拷贝。 ...
qml-glsl-coder:基于Qt QML的GLSL片段着色器的实时编辑器
这是在Processing内部运行的GLSL着色器的集合。 其中一些是通用的(亮度/饱和度/对比度滤镜,模糊,边缘检测等),而另一些则更具实验性。 其中许多是从取得的传承的修改。 在“处理”草图中,某些着色器参数被路由...
:gem_stone: vscode-glsl-canvas 通过提供Show glslCanvas命令,该扩展程序可在VSCode中打开GLSL着色器的实时WebGL预览。 它使用的改进和改进版本,版本来自 javascript库和由制造的 。 现在支持WebGL2。 只需在文件...
音乐节 使用 sonotopy 和 Qt 实时编码 GLSL 着色器。
GLSL黄皮书中砖块着色器的个demo,按键Q,W,E切换不同物体
用于GLSL着色器的Webpack加载器 用于webpack的glsl着色器加载器,包括对嵌套导入的支持,从而允许在更复杂的着色器实现中智能地重用代码。 着色器以字符串形式返回。 安装 npm install --save-dev webpack-glsl-...
GLSL着色器,用于带有附加雾效果的3D Bezier曲线(使用OpenSceneGraph) 这是一个示例项目,演示了如何在3D中绘制粗线和平滑线/曲线。 ,原生GL_LINE_STRIP_ADJACENCY在绘制折线时会产生间隙。 上述模式的另一个...
几何着色器例子 原本用5个点画出3个三角形,通过几何着色器又复制了一份变成6个三角形。
opengl编程入门,glsl语言的hello world,着色器,glsl语言简介
gpupad:灵活的GLSL着色器编辑器和IDE