1.QOpenGLWidget的早先版本
QGLWidget是遗留Qt OpenGL模块的一部分,和其他QGL类一样,应该在新的应用程序中避免使用。相反,从Qt 5.4开始,最好使用QOpenGLWidget和QOpenGL类。
如果开发XP平台,由于兼容性问题,Qt5.4(不含)之后的QtOpenglWidget 则不兼容,建议还是用QGLWidget.
 
2.QOpenGLWidget类是用于呈现OpenGL图形的部件
        QOpenGLWidget提供显示集成到Qt应用程序中的OpenGL图形的功能。使用起来非常简单:让类继承它,并像其他QWidget一样使用子类,额外可以选择使用QPainer和标准的OpenGL渲染命令。
        QOpenGLWidget提供了三个方便的虚拟函数,子类中重新实现这些函数来执行OpenGL绘制任务:
  • paintGL():渲染OpenGL场景。该函数里面主要绘制部件,比如在全屏视频上面显示滑动条
  • resizeGL ():当窗口尺寸发生变化时被调用,然后会调用paintGL()函数重新绘制一次(并且第一次显示时也会调用resizeGL() )。
  • initializeGL():用于初始化,设置OpenGL要呈现的画面,只在程序开始时运行一次,之后不会再运行。
其中在initializeGL()中初始化具体如下所示:
然后在paintGL()中,每次当我们要绘制不同的物体时,便调用bind()来绑定对象、绘制完后,解绑对象,如果还要绘制下个物体,那么就取出对应的VAO,绑定它,绘制完物体后,再解绑。
 
3.三角形示例
4.头文件代码
#ifndef MYGLWIDGET_H
#define MYGLWIDGET_H #include <QMainWindow>
#include <QObject>
#include <QWidget>
#include <QOpenGLWidget>
#include <QOpenGLFunctions>
#include <QOpenGLShaderProgram>
#include <QOpenGLBuffer>
#include <QOpenGLVertexArrayObject>
class myGlWidget : public QOpenGLWidget , protected QOpenGLFunctions
{
Q_OBJECT
public: myGlWidget(QWidget *parent = nullptr);
protected: void paintGL() ;
void initializeGL() ;
void resizeEvent(QResizeEvent *e) ; private:
QOpenGLShaderProgram *program; QOpenGLVertexArrayObject vao;
QOpenGLBuffer vbo; }; #endif // MYGLWIDGET_H

5.源文件代码

#include "myglwidget.h"
#include <QtDebug> //GLSL3.0版本后,废弃了attribute关键字(以及varying关键字),属性变量统一用in/out作为前置关键字
#define GL_VERSION "#version 330 core\n" #define GLCHA(x) #@x //加单引号,将x变为字符
#define GLSTR(x) #x //加双引号,将x变为字符串
#define GET_GLSTR(x) GL_VERSION#x const char *vsrc = GET_GLSTR(
layout (location = 0) in vec3 aPos;
void main(void)
{
gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
}
); const char *fsrc =GET_GLSTR(
out vec4 FragColor;
void main(void)
{
FragColor = vec4(1.0f, 1.0f, 0.0f, 1.0f);
}
); //fsrc 等价于 --> const char *fsrc ="#version 330 core\n"
// "out vec4 FragColor;\n"
// "void main()\n"
// "{\n"
// " FragColor = vec4(1.0f, 1.0f, 0.0f, 1.0f);\n"
// "}\n\0"; myGlWidget::myGlWidget(QWidget *parent):QOpenGLWidget(parent)
{ } void myGlWidget::paintGL()
{
// 绘制
// glViewport(0, 0, width(), height()); glClear(GL_COLOR_BUFFER_BIT); // 渲染Shader
program->bind(); //绑定激活Program对象
vao.bind(); //绑定激活vao
glDrawArrays(GL_TRIANGLES, 0, 3); //绘制3个定点,样式为三角形
vao.release(); //解绑
program->release(); //解绑 }
void myGlWidget::initializeGL()
{ // 为当前环境初始化OpenGL函数
initializeOpenGLFunctions(); glClearColor(1.0f, 1.0f, 1.0f, 1.0f); //设置背景色为白色 //1.创建顶点着色器
QOpenGLShader *vshader = new QOpenGLShader(QOpenGLShader::Vertex, this);
vshader->compileSourceCode(vsrc); //2.创建片元着色器 rgba(1.0f, 1.0f, 0.0f, 1.0f)表示黄色,而alpha值为1.0,表示完全不透明
QOpenGLShader *fshader = new QOpenGLShader(QOpenGLShader::Fragment, this);
fshader->compileSourceCode(fsrc); //3.创建着色器程序
program = new QOpenGLShaderProgram;
program->addShader(vshader);
program->addShader(fshader);
program->link();
program->bind();//激活Program对象 //4.初始化VBO,将顶点数据存储到buffer中,等待VAO激活后才能释放
float vertices[] = {
-0.5f, -0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
0.0f, 0.5f, 0.0f
}; vbo.create();
vbo.bind(); //绑定到当前的OpenGL上下文,
vbo.allocate(vertices, 9*sizeof(GLfloat));
vbo.setUsagePattern(QOpenGLBuffer::StreamDraw); //设置为一次修改,多次使用 //5.初始化VAO,设置顶点数据状态(顶点,法线,纹理坐标等)
vao.create();
vao.bind(); GLint aPos = program->attributeLocation("aPos"); //获取aPos位置
if(aPos==-1) //未找到
{
return;
}
program->setAttributeBuffer(aPos, GL_FLOAT, 0, 3, 0); //设置顶点属性
program->enableAttributeArray(aPos); //使能顶点属性 //6.解绑所有对象
vao.release();
vbo.release();
program->release(); }
void myGlWidget::resizeEvent(QResizeEvent *e)
{ }
 

2.通过QOpenGLWidget绘制三角形的更多相关文章

  1. 1.opengl绘制三角形

    顶点数组对象:Vertex Array Object,VAO,用于存储顶点状态配置信息,每当界面刷新时,则通过VAO进行绘制. 顶点缓冲对象:Vertex Buffer Object,VBO,通过VB ...

  2. 纯CCS绘制三角形箭头图案

    用CSS绘制三角形箭头.使用纯CSS,你只需要很少的代码就可以创作出各种浏览器都兼容的三角形箭头! CSS代码: /* create an arrow that points up */ div.ar ...

  3. unity 绘制三角形

    哎 该学的还是要学 参考:http://www.narkii.com/club/thread-369573-1.html unity 顶点绘制三角形 脚本绘制; 其实filter和render就是进行 ...

  4. CSS 魔法系列:纯 CSS 绘制三角形(各种角度)

    我们的网页因为 CSS 而呈现千变万化的风格.这一看似简单的样式语言在使用中非常灵活,只要你发挥创意就能实现很多比人想象不到的效果.特别是随着 CSS3 的广泛使用,更多新奇的 CSS 作品涌现出来. ...

  5. css绘制三角形原理

    1.新建一个元素,将它的宽高都设置为0:然后通过设置border属性来实现三角形效果,下面是css绘制三角形的原理: <!DOCTYPE html> <html> <he ...

  6. 【转载】理解GL_TRIANGLE_STRIP等绘制三角形序列的三种方式

    GL_TRIANGLE_STRIP绘制三角形方式很多时候令人疑惑,在这里对其运作机理进行解释. 一般情况下有三种绘制一系列三角形的方式,分别是GL_TRIANGLES.GL_TRIANGLE_STRI ...

  7. CSS - Tooltip-arrow 绘制三角形

    问题:纯CSS实现bubble的三角形部分 方法:使用border来绘制三角形:例如 .trangle { ; border-color: transparent; border-style: sol ...

  8. CSS用border绘制三角形

    使用border绘制三角形的思路,就是border尺寸设置一个较大的值,元素自身的宽高设置为0,全部由边线占据,这样每边就会显示为四分之一块的三角形.这样不借助图片,可以直接绘制出三角形了. 一个栗子 ...

  9. Android OpenGL ES(十)绘制三角形Triangle .

    三角形为OpenGL ES支持的面,同样创建一个DrawTriangle Activity,定义6个顶点使用三种不同模式来绘制三角形: float vertexArray[] = { -0.8f, - ...

随机推荐

  1. Bootstrap一周学习小结

    一.响应式布局 1.bootstrap是自适应mobile和web,会根据分辨率大小而自适应的一个代码库,Bootstrap定义了很多js和css的效果,把这些效果集成为多个API,供在使用时调用. ...

  2. Python实现GUI开发 PySide2&PyQt环境配置

    更新于2020-09-15 - 18:50:37 [前言] 关于Python开发GUI图形界面程序的问题,大概是19年十分困扰我,主要是没有经验以及缺乏高效简洁的视频或教学文档,导致在19年中秋前后花 ...

  3. python中的运动控制函数

    运动控制函数:控制海龟走直线&走曲线 海龟向前行进,海龟走直线,参数d表示行进距离,也可以为负数,单位是像素 根据半径r绘制extent角度的弧形 r : 默认圆心在海龟左侧r 距离的位置 e ...

  4. 数据库分表分区后的ID生成之雪花生成

    转自https://www.cnblogs.com/jajian/p/11101213.html 传统的单体架构的时候,我们基本是单库然后业务单表的结构.每个业务表的ID一般我们都是从1增,通过AUT ...

  5. CentOS 正在连接 127.0.0.1:8118... 失败:拒绝连接。

    今天centos使用wget下载东西的时候出现了 看下是否开启了代理 yicunyiye@yicunyiye:~/redis$ export | grep -i proxy declare -x ft ...

  6. python 进程(池)、线程(池)

    进程.多进程.进程池 进程总概述 进程 from multiprocessing import Process import os # 子进程要执行的代码 def run_proc(name): pr ...

  7. java调用matlab生成exe文件

    一.Matlab生成Java Package 1.在MATLAB的Command Window输入deploytool命令,选择Library Compiler. 2.在弹出的窗口选择Java Pac ...

  8. 在搞OSS对象存储中发现了自身的一些不足

    最近在搞OSS对象存储,发现了自身的一些不足,趁着有空在此做个总结,希望能够帮助到大家!!! 首先解释下OSS,Object Storage Service(对象存储服务),一般的云公司,都会提供OS ...

  9. Book of Shaders 00 - 使用 VS Code 编写 GLSL

    0x00 写在前面 最近在学习由 Patricio 编写的 The Book of Shaders,这是一本关于 Fragment Shaders(片段着色器)的入门指南.为了在一个相对熟悉的平台运行 ...

  10. AES加密 Pkcs7 (BCB模式) java后端版本与JS版本对接

    1.BCB模式是需要设置iv偏移量和Key值,这两个值就像账号和密码一样,当这两个值一致时才能确保加密和解密的数据一致.(ps:这两个值千万不能暴露出去哦!) 2.JAVA版本代码: 这里的iv偏移量 ...