QT+OpenGL(01)--实现三角形渲染
1.openglwidget.ui
<ui version="4.0">
<author/>
<comment/>
<exportmacro/>
<class>OpenGLWidget</class>
<widget class="QWidget" name="OpenGLWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>400</width>
<height>300</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
</widget>
<pixmapfunction/>
<connections/>
</ui>
2. openglwidget.h
#ifndef OPENGLWIDGET_H
#define OPENGLWIDGET_H #include <QWidget>
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <GL/gl.h>
#include <qopengl.h>
#include <qopenglfunctions.h>
#include <qopenglshaderprogram.h> namespace Ui {
class OpenGLWidget;
} class OpenGLWidget : public QOpenGLWidget, protected QOpenGLFunctions
{
Q_OBJECT public:
QOpenGLShaderProgram* program;
GLuint programId;
GLuint verVbo;
GLuint indexVbo;
GLuint colorVbo;
GLuint matrixLocation;
GLuint vertexLocation;
GLuint clorLocation;
QMatrix4x4 projection;
GLsizei vVerticesLen;
GLsizei triIndexLen;
GLsizei colorsLen ; GLuint triIndexs[3] = {0, 1, 2};
GLfloat vertex[6] = {
-0.5f, 0.0f,
0.5f, 0.0f,
0.0f, 0.5f,
};
GLfloat colors[12] = {1.0f, 0.0f, 0.0f, 1.0f,
0.0f, 1.0f, 0.0f, 1.0f,
0.0f, 0.0f, 1.0f, 1.0f,
}; explicit OpenGLWidget(QWidget *parent = nullptr);
~OpenGLWidget(); // //三角形顶点坐标
// GLfloat* vertex; // //三角形顶点索引
// GLuint* triIndexs; // //三角形顶点颜色
// GLfloat* colors; private:
Ui::OpenGLWidget *ui;
protected:
void initializeGL();
void paintGL();
void resizeGL(int w, int h);
void initVbo();
}; #endif // OPENGLWIDGET_H
3. openglwidget.cpp
#include "openglwidget.h"
#include "ui_openglwidget.h"
#include <GL/gl.h>
#include <qopengl.h>
#include <qopenglfunctions.h>
#include <qopenglshaderprogram.h> OpenGLWidget::OpenGLWidget(QWidget *parent) :
QOpenGLWidget(parent),
ui(new Ui::OpenGLWidget)
{
ui->setupUi(this);
} OpenGLWidget::~OpenGLWidget()
{
delete ui;
} void OpenGLWidget::initializeGL()
{
//调用内容初始化函数
initializeOpenGLFunctions(); program = new QOpenGLShaderProgram(this); if(!program->addShaderFromSourceFile(QOpenGLShader::Vertex, ":/shader/vertexshader.vect")){
printf("no found vertexshader.vert");
return;
}
if(!program->addShaderFromSourceFile(QOpenGLShader::Fragment, ":/shader/fragmentshader.frag")){
printf("no found fragmentshader.frag");
return;
}
if(!program->link()){
printf("no link");
return;
}
if(!program->bind()){
printf("no bind");
return;
} // 获取shaderprogram的id号,然后可以通过id号获取一些属性...
programId = program->programId();
printf("programId: %d", programId);
// 从shaderprogram里面获取变量标识
matrixLocation = glGetUniformLocation(programId, "matrix");
vertexLocation = glGetAttribLocation(programId, "vPosition");
clorLocation = glGetAttribLocation(programId, "vColor"); initVbo();
}
void OpenGLWidget::initVbo(){ // 计算获得数组长度
vVerticesLen = sizeof(vertex)/sizeof(GLfloat);
triIndexLen = sizeof(triIndexs)/sizeof(GLuint);
colorsLen = sizeof(colors)/sizeof(GLfloat); // 初始化顶点buffer并装载数据到显存 glGenBuffers(1, &verVbo);
glBindBuffer(GL_ARRAY_BUFFER, verVbo);
glBufferData(GL_ARRAY_BUFFER, vVerticesLen * sizeof(GLfloat), vertex, GL_STATIC_DRAW); // 初始化索引buffer并装载数据到显存
glGenBuffers(1, &indexVbo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVbo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, triIndexLen * sizeof(GLuint), triIndexs, GL_STATIC_DRAW); // 初始化颜色buffer并装载数据到显存
glGenBuffers(1, &colorVbo);
glBindBuffer(GL_ARRAY_BUFFER, colorVbo);
glBufferData(GL_ARRAY_BUFFER, colorsLen * sizeof(GLfloat), colors, GL_STATIC_DRAW);
} void OpenGLWidget::resizeGL(int w, int h)
{
//当窗口大小改变时,调整界面坐标显示高度和宽度
glViewport(0, 0, w, h); // 模型矩阵重置
projection.setToIdentity();
// 透视投影
qreal aspect = qreal(w) / qreal(h ? h : 1);
projection.perspective(60.0f, aspect, 1.0f, 100.0f);
// 增加了模型矩阵,需要做一定偏移量,保证物体刚开始渲染出来时可以被看到!
projection.translate(0.0f, 0.0f, -2.0f); } void OpenGLWidget::paintGL()
{
//清除之前图形并将背景设置为黑色(设置为黑色纯粹个人爱好!)
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glClearColor(0.0f, 0.0f, 0.0f, 0.0f); // shader传入模型视图矩阵 projection可以理解为建立了一个坐标系空间,可以再这个空间内设置图形
glUniformMatrix4fv(matrixLocation, 1, GL_FALSE, projection.data()); // shader绑定并启用颜色数组buffer
glBindBuffer(GL_ARRAY_BUFFER,colorVbo);
glVertexAttribPointer(clorLocation, 4, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(clorLocation);
// 颜色值rgba,所以每四个float值作为一个颜色值,如果只是希望rgb,取三个值作为颜色值即可! // shader绑定并启用顶点数组buffer
glBindBuffer(GL_ARRAY_BUFFER, verVbo);
glVertexAttribPointer( vertexLocation, 2, GL_FLOAT, GL_FALSE, 0, 0);
glEnableVertexAttribArray(vertexLocation); // shader绑定并顶点索引数组buffer - 索引无需启用
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,indexVbo);
glDrawElements(GL_TRIANGLES, triIndexLen, GL_UNSIGNED_INT, 0); // 解绑buffer、关闭启用顶点、颜色数组
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glDisableVertexAttribArray(vertexLocation);
glDisableVertexAttribArray(clorLocation); }
4. vertexshader.vect
//vertexshader.vert
uniform mat4 matrix;
in vec4 vPosition;
in vec4 vColor;
out vec4 fColor; void main(void)
{
fColor = vColor;
gl_Position = matrix * vPosition;
}
5. fragmentshader.frag
//fragmentshader.frag
in vec4 fColor; void main(void)
{
gl_FragColor = fColor;
}
------------------------------------------------------------------------------------------------------
QT+OpenGL(01)--实现三角形渲染的更多相关文章
- ubuntu下配置qt+opengl+opencv
原地址:http://www.cnblogs.com/aleny-liu/archive/2011/12/16/aleny-Qtnote1.html http://blog.csdn.net/jdh9 ...
- Qt OpenGL:学习现代3D图形编程之四,透视投影浅析
一.非真实的世界 与之前几篇文章不同的是,这里要画12个三角形,这个12个三角形构造一个方形棱柱(这里为长方体).棱柱的每个四边形表面由两个三角形组成.这两个三角形其中的一条边重合,而且它们的六个顶点 ...
- Linux OpenGL 实践篇-14-多实例渲染
多实例渲染 OpenGL的多实例渲染是一种连续执行多条相同的渲染命令的方法,并且每条命令产生的结果都有轻微的差异,通常用于渲染大量的几何物体. 设想一个场景,比如太空,我们需要渲染数以万记的星球,如果 ...
- [Modern OpenGL系列(三)]用OpenGL绘制一个三角形
本文已同步发表在CSDN:http://blog.csdn.net/wenxin2011/article/details/51347008 在上一篇文章中已经介绍了OpenGL窗口的创建.本文接着说如 ...
- Qt OpenGL三维绘图
简介 OpenGL是为三维绘图提供的标准应用编程接口. OpenGL处理的仅仅是三维绘图方面,而很少或是根本不提供图形用户界面编程方面的支持.OpenGL*应用程序的用户界面必须由其它工具包创建,比 ...
- OpenGL实例:三角形
OpenGL实例:三角形 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 更多请查看:计算机图形学 1. 三角形的旋转 #include <GL/ ...
- QT OpenGL中文教程在QT4版本后的错误代码更改(一)
由于教程中说的已经够可以了,这里就不对代码进行分析了,有兴趣可以自己去看看.这个教程来源于原来的NeHeOpenGL中文教程 (http://www.yakergong.net/nehe/) ,但其有 ...
- OpenGL创建一个三角形,并且颜色渐变(绿—>黑—>绿)
学习自: https://learnopengl-cn.github.io/01%20Getting%20started/05%20Shaders/#_4 #include <glad/glad ...
- QT OpenGL绘制三维图形(立方体、圆柱体、圆锥、球体、圆环等等)
本文使用QGLWidget来绘制各种三维基本图形,包括立方体.圆柱体.圆锥.球体.圆环等等,涉及包括基本绘制以及上色.纹理.旋转等操作. 使用的软件版本:QT5.12 + QT Creater4.8. ...
随机推荐
- Java日期时间API系列2-----Jdk7及以前的日期时间类在mysql数据库中的应用
1.java中与数据库相关的时间类 java提供与mysql方便交互的三种数据类型: java.sql.Date java.sql.Time java.sql.Timestamp 它们都是继承java ...
- 设置view的layer属性方法
1.需要导入QuartzCore.framewoork框架到工程2.在文件中导入#import 3.设置 必须导入的空间 #import<QuartzCore/QuartzCore.h> ...
- Angular 学习笔记(一)
什么是 Angular: Angular 是一个 JavaScript 框架,可通过 <script> 标签添加到 HTML 页面,然后通过指令扩展 HTML,且通过表达式绑定数据到 HT ...
- Python异常类型及处理、自定义异常类型、断言
异常的概念.识别报错信息 异常处理 断言的基本使用 异常类型(异常就是报错) 常见异常 NameError:名称错误 SyntaxError:语法错误 TypeError:类型错误 错误回溯 查看报错 ...
- C++学习五 const vector<int>类型的迭代器使用
一情景: 算法功能:对于传入的vector, 能够找到两个数字,使其相加之和为target,然后返回这两个数字的位置(也就是秩) 最开始是这样的一个问题: 对于一个传入的const vector< ...
- JS的节流、防抖及使用场景
前言 据说阿里有一道面试题就是谈谈函数节流和函数防抖. 糟了,这可触碰到我的知识盲区了,好像听也没听过这2个东西,痛定思痛,赶紧学习学习.here we go! 概念和例子 函数防抖(debounce ...
- RSTP基本配置
1.用四台S3700交换机,2台PC机,一台HUB,组建网络拓扑 2.测试主机间的连通性 3.配置rstp基本功能 (1)把交换机stp模式由默认的mstp变为rstp.在华为交换机上默认开启了mst ...
- Pwnable-fd
打开Ubuntu输入ssh fd@pwnable.kr -p2222,连接之后输入密码guest 之后就是ls -l看看里面的文件和权限,fd.fd.c.flag 看看fd.c的源码 #include ...
- js 构造函数中的 return
本文链接:https://blog.csdn.net/qq_36209248/article/details/89190978 默认情况下,没有return的函数的返回值为undefined(即没有定 ...
- leetcode347. 前 K 个高频元素
题目最终需要返回的是前 kk 个频率最大的元素,可以想到借助堆这种数据结构,对于 kk 频率之后的元素不用再去处理,进一步优化时间复杂度. 具体操作为: 借助 哈希表 来建立数字和其出现次数的映射,遍 ...