基于Qt的OpenGL编程(3.x以上GLSL可编程管线版)---(二十四)高级GLSL技巧

Vries的教程是我看过的最好的可编程管线OpenGL教程,没有之一其原地址如下,https://learnopengl-cn.github.io/04%20Advanced%20OpenGL/08%20Advanced%20GLSL/关于高级GLSL技巧的详细知识了解请看原教程,本篇旨在对Vires基于visual studio平台的编程思想与c++代码做纯Qt平台的移植,代码移植顺序基本按照原教程顺序,并附加一些学习心得,重在记录自身学习之用

Tip1Joey De Vries的教程写的真是非常好呢,他本人可能想不到,他的中文版教程在中国的CSDN上有N多的“备份”,为什么有的人通篇转载他的教程时不能加上“转载”两个字呢。

Tip2: 博客最后的“Uniform缓冲对象”特别有用,特别推荐看Vries原教程的解析,强推!!!

Tip3: 这节的Qt代码移植没有值得注意的地方,可直接将Vries的代码直接复制进来使用。

 

程序源代码链接:https://pan.baidu.com/s/1stvBQWxAI6Pu_GznF4Jc7Q 提取码:juh9 

编译环境:Qt5.9.4

编译器:Desktop Qt5.9.4 MSVC2017 64bit

IDE:QtCreator

 

一. 这篇博客要讲什么

    这节的内容在讲,关于着色器shader本身,一些有趣且有用的内建变量,比如gl_Position就是着色器的一个内建变量,负责在顶点着色器中,向其他着色器传递空间中点的坐标。因为这些内建变量都是着色器本身就具有的,所以在移植到Qt时,不需要结合Qt本身平台做一些函数的特殊化处理,直接粗暴复制代码即可。

 

. 顶点着色器变量

  2.1 gl_PointSize

  当以GL_POINTS格式进行绘制点时,默认的点非常小,如左下图所示。

  core->glDrawArrays(GL_POINTS, 0, 36);

而顶点着色器中的内建变量gl_PointSize就可以改变绘制的点的大小。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Qt中使用OpenGL 3.3或更高本来渲染一个OBJ文件,您需要完成以下步骤: 1. 在Qt中创建一个OpenGL窗口: ```c++ class GLWidget : public QOpenGLWidget { public: GLWidget(QWidget *parent = 0); ~GLWidget(); protected: void initializeGL() override; void paintGL() override; void resizeGL(int w, int h) override; }; ``` 2. 在initializeGL函数中初始化OpenGL环境,并编译和链接您的着色器程序: ```c++ void GLWidget::initializeGL() { initializeOpenGLFunctions(); // Create and compile your shader program QOpenGLShaderProgram* shaderProgram = new QOpenGLShaderProgram(this); shaderProgram->addShaderFromSourceFile(QOpenGLShader::Vertex, "vertexShader.glsl"); shaderProgram->addShaderFromSourceFile(QOpenGLShader::Fragment, "fragmentShader.glsl"); shaderProgram->link(); shaderProgram->bind(); } ``` 3. 在paintGL函数中使用您的着色器程序和OBJ文件中的数据绘制场景: ```c++ void GLWidget::paintGL() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Set up your shader uniforms and attributes shaderProgram->setUniformValue("projection", projection); shaderProgram->setUniformValue("view", view); shaderProgram->setUniformValue("model", model); shaderProgram->setAttributeArray("position", vertices.constData(), 3, sizeof(Vertex)); shaderProgram->setAttributeArray("normal", normals.constData(), 3, sizeof(Vertex)); shaderProgram->setAttributeArray("texCoord", texCoords.constData(), 2, sizeof(Vertex)); shaderProgram->enableAttributeArray("position"); shaderProgram->enableAttributeArray("normal"); shaderProgram->enableAttributeArray("texCoord"); // Draw your OBJ file glDrawArrays(GL_TRIANGLES, 0, vertices.size()); shaderProgram->disableAttributeArray("position"); shaderProgram->disableAttributeArray("normal"); shaderProgram->disableAttributeArray("texCoord"); } ``` 4. 在resizeGL函数中更新OpenGL视口: ```c++ void GLWidget::resizeGL(int w, int h) { glViewport(0, 0, w, h); } ``` 5. 确保您的OBJ文件中包含顶点位置、法线和纹理坐标数据,并且您可以正确地解析和加载它们。 这只是一个基本的框架,您需要根据您的项目需求进行修改和扩展。您可以使用第三方库,如Assimp,来加载和解析OBJ文件中的数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值