Qt+OpenGL-part3

1-4EBO画矩形_哔哩哔哩_bilibili

可以绘制两个三角形来组成一个矩形(OpenGL主要处理三角形)

直接画两个三角形:

#include "openglwidget.h"
#include <QDebug>

unsigned int VBO,VAO;
unsigned int shaderProgram;

//顶点着色器
const char* vertexShaderSource="#version 330 core\n"
        "layout(location=0) in vec3 aPos;\n"
        "void main()\n"
        "{\n"
        "gl_Position=vec4(aPos.x,aPos.y,aPos.z,1.0);\n"
        "}\0";
//片段着色器
const char* fragmentShaderSource="#version 330 core\n"
        "out vec4 FragColor;\n"
        "void main()\n"
        "{\n"
        "FragColor=vec4(0.3f,0.5f,0.2f,0.2f);\n"
        "}\0";

OpenGLWidget::OpenGLWidget(QWidget *parent) : QOpenGLWidget(parent)
{

}

void OpenGLWidget::initializeGL()
{
    initializeOpenGLFunctions();

    float vertices[]={
        0.5f, 0.5f, 0.0f,   // 右上角
        0.5f, -0.5f, 0.0f,  // 右下角
        -0.5f, 0.5f, 0.0f,  // 左上角
        // 第二个三角形
        0.5f, -0.5f, 0.0f,  // 右下角
        -0.5f, -0.5f, 0.0f, // 左下角
        -0.5f, 0.5f, 0.0f   // 左上角
    };
    //顶点数组
    glGenVertexArrays(1,&VAO);
    //顶点缓冲对象
    glGenBuffers(1,&VBO);

    //绑定顶点数组
    glBindVertexArray(VAO);
    //绑定顶点缓冲对象
    glBindBuffer(GL_ARRAY_BUFFER,VBO);

    //把三角形相关数据复制到缓冲内存中
    glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);
    //第二个参数:数据的大小(字节为单位)
    //第三个参数:数据指针


    glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,3*sizeof(float),(void *)0);
    glEnableVertexAttribArray(0);

    glBindBuffer(GL_ARRAY_BUFFER,0);
    glBindVertexArray(0);


    unsigned int vertexShader=glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShader,1,&vertexShaderSource,NULL);
    glCompileShader(vertexShader);

    int  success;
    char infoLog[512];
    glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);

    if(!success)
    {
        glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
        qDebug() << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog;
    }

    unsigned int fragmentShader=glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShader,1,&fragmentShaderSource,NULL);
    glCompileShader(fragmentShader);

    shaderProgram=glCreateProgram();
    glAttachShader(shaderProgram,vertexShader);
    glAttachShader(shaderProgram,fragmentShader);
    glLinkProgram(shaderProgram);

    glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
    if(!success) {
        glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
        qDebug() << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog;
    }

    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);

}

void OpenGLWidget::resizeGL(int w, int h)
{

}

void OpenGLWidget::paintGL()
{
    glClearColor(0.2f,0.3f,0.3f,1.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    glUseProgram(shaderProgram);

    glBindVertexArray(VAO);
    glDrawArrays(GL_TRIANGLES,0,6);
}

使用线条填充:

void OpenGLWidget::initializeGL()

{

glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);//使用线条填充

}

使用VBO,EBO,VAO来画两个三角形

#include "openglwidget.h"
#include <QDebug>

unsigned int VBO,VAO,EBO;
unsigned int shaderProgram;

//顶点着色器
const char* vertexShaderSource="#version 330 core\n"
        "layout(location=0) in vec3 aPos;\n"
        "void main()\n"
        "{\n"
        "gl_Position=vec4(aPos.x,aPos.y,aPos.z,1.0);\n"
        "}\0";
//片段着色器
const char* fragmentShaderSource="#version 330 core\n"
        "out vec4 FragColor;\n"
        "void main()\n"
        "{\n"
        "FragColor=vec4(0.3f,0.5f,0.2f,0.2f);\n"
        "}\0";

OpenGLWidget::OpenGLWidget(QWidget *parent) : QOpenGLWidget(parent)
{

}

void OpenGLWidget::initializeGL()
{
    initializeOpenGLFunctions();

    float vertices[] = {
        0.5f, 0.5f, 0.0f,   // 右上角
        0.5f, -0.5f, 0.0f,  // 右下角
        -0.5f, -0.5f, 0.0f, // 左下角
        -0.5f, 0.5f, 0.0f   // 左上角
    };

    unsigned int indices[] = {
        // 注意索引从0开始!
        // 此例的索引(0,1,2,3)就是顶点数组vertices的下标,
        // 这样可以由下标代表顶点组合成矩形

        0, 1, 3, // 第一个三角形
        1, 2, 3  // 第二个三角形
    };
    //顶点数组
    glGenVertexArrays(1,&VAO);
    //顶点缓冲对象
    glGenBuffers(1,&VBO);
    glGenBuffers(1,&EBO);

    //绑定顶点数组
    glBindVertexArray(VAO);
    //绑定顶点缓冲对象
    glBindBuffer(GL_ARRAY_BUFFER,VBO);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,EBO);

    //把相关数据复制到缓冲内存中
    glBufferData(GL_ARRAY_BUFFER,sizeof(vertices),vertices,GL_STATIC_DRAW);
    //第二个参数:数据的大小(字节为单位)
    //第三个参数:数据指针
    glBufferData(GL_ELEMENT_ARRAY_BUFFER,sizeof(indices),indices,GL_STATIC_DRAW);


    glVertexAttribPointer(0,3,GL_FLOAT,GL_FALSE,3*sizeof(float),(void *)0);
    glEnableVertexAttribArray(0);

    glBindBuffer(GL_ARRAY_BUFFER,0);
    glBindVertexArray(0);


    unsigned int vertexShader=glCreateShader(GL_VERTEX_SHADER);
    glShaderSource(vertexShader,1,&vertexShaderSource,NULL);
    glCompileShader(vertexShader);

    int  success;
    char infoLog[512];
    glGetShaderiv(vertexShader, GL_COMPILE_STATUS, &success);

    if(!success)
    {
        glGetShaderInfoLog(vertexShader, 512, NULL, infoLog);
        qDebug() << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog;
    }

    unsigned int fragmentShader=glCreateShader(GL_FRAGMENT_SHADER);
    glShaderSource(fragmentShader,1,&fragmentShaderSource,NULL);
    glCompileShader(fragmentShader);

    shaderProgram=glCreateProgram();
    glAttachShader(shaderProgram,vertexShader);
    glAttachShader(shaderProgram,fragmentShader);
    glLinkProgram(shaderProgram);

    glGetProgramiv(shaderProgram, GL_LINK_STATUS, &success);
    if(!success) {
        glGetProgramInfoLog(shaderProgram, 512, NULL, infoLog);
        qDebug() << "ERROR::SHADER::VERTEX::COMPILATION_FAILED\n" << infoLog;
    }

    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);

    glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);//使用线条填充


}

void OpenGLWidget::resizeGL(int w, int h)
{

}

void OpenGLWidget::paintGL()
{
    glClearColor(0.2f,0.3f,0.3f,1.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    glUseProgram(shaderProgram);

    glBindVertexArray(VAO);
    //VAO知道VBO和EBO的情况

    glDrawElements(GL_TRIANGLES,6,GL_UNSIGNED_INT,0);
}

VAO会记录EBO的绑定和解绑,不会记录VBO的绑定和解绑。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/522951.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GAMES Webinar 317-渲染专题-图形学 vs. 视觉大模型|Talk+Panel形式

两条路线&#xff1a;传统渲染路线&#xff0c;生成路线 两种路线的目的都是最终生成图片或者视频等在现在生成大火的情况下&#xff0c;传统路线未来该如何发展呢&#xff0c;两种路线是否能够兼容呢 严令琪 这篇工作是吸取这两条路各自优势的一篇工作 RGB是一张图&#xff…

Kubernetes学习笔记7

使用kubeadm部署Kubernetes集群方法 使用kubernetes部署单节点Master节点K8s集群。 在实际生产环境中&#xff0c;是不允许单master节点的&#xff0c;如果单master节点不可用的话&#xff0c;当导致我们的K8s集群无法访问。 可以使用kubeadm将单master节点升级为多master节点…

客户银行主数据批导

程序&#xff1a;ZSDR0005 *&---------------------------------------------------------------------* *& Report ZSDR0005 *&---------------------------------------------------------------------* *& *&----------------------------------------…

C++ //练习 11.23 11.2.1节练习(第378页)中的map以孩子的姓为关键字,保存他们的名的vector,用multimap重写此map。

C Primer&#xff08;第5版&#xff09; 练习 11.23 练习 11.23 11.2.1节练习&#xff08;第378页&#xff09;中的map以孩子的姓为关键字&#xff0c;保存他们的名的vector&#xff0c;用multimap重写此map。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09;…

使用LIMIT进行分页

SELECT employee_id, first_name, salary FROM employees LIMIT 0, 5; 0为偏移量&#xff0c; 5为条目数 每页pageSize条记录&#xff0c;显示第page页 LIMIT (page - 1) * pageSize, pageSize; # 或者 LIMIT pageSize OFFSET (page - 1) * pageSize;

主食冻干哪个牌子好?热门大牌真实实测分享,轻松避雷!

在选购主食冻干时&#xff0c;很多铲屎官都面临着选进口还是国产的难题。很多铲屎官认为进口产品在品控和配方上更优秀&#xff0c;但实际营养指标却逊于国产&#xff0c;价格也不菲。所以不免选购时会犹豫&#xff0c;最后抱着试一试的心态盲入主食冻干&#xff0c;运气好&…

如何利用GSG-721与ublox GNSS接收机实现RTK功能仿真?

作者介绍 一、前言 实时动态载波相位差分技术&#xff08;RTK&#xff09;是应用测量来纠正当前卫星导航&#xff08;GNSS&#xff09;系统的常见误差。RTK定位是基于至少两个GNSS接收机——参考站和一个或多个流动站。参考站在可视卫星中获取测量数据&#xff0c;然后将这些数…

numpy,matplotilib学习(菜鸟教程)

所有内容均来自于&#xff1a; NumPy 教程 | 菜鸟教程 Matplotlib 教程 | 菜鸟教程 numpy模块 numpy.nditer NumPy 迭代器对象 numpy.nditer 提供了一种灵活访问一个或者多个数组元素的方式。 for x in np.nditer(a, orderF):Fortran order&#xff0c;即是列序优先&#x…

离职潮下的企业信息安全挑战及防范策略

随着社会经济环境的快速变化&#xff0c;企业员工流动性加剧&#xff0c;尤其在离职潮下&#xff0c;企业不仅要关注人力资源配置与团队稳定性&#xff0c;更要重视由此引发的信息安全挑战。离职员工带走的不仅仅是职位空缺&#xff0c;更可能携带着大量内部敏感信息&#xff0…

分类预测 | Matlab实现ABC-LSSVM人工蜂群算法优化最小二乘支持向量机数据分类预测

分类预测 | Matlab实现ABC-LSSVM人工蜂群算法优化最小二乘支持向量机数据分类预测 目录 分类预测 | Matlab实现ABC-LSSVM人工蜂群算法优化最小二乘支持向量机数据分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现ABC-LSSVM人工蜂群算法优化最小二乘支…

基于单片机便携式太阳能充电器系统设计

**单片机设计介绍&#xff0c;基于单片机便携式太阳能充电器系统设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机便携式太阳能充电器系统设计概要主要涉及利用单片机作为核心控制器件&#xff0c;结合太阳能充电技术和便携式…

基于SpringBoot+微信小程序的智慧医疗线上预约问诊小程序

一、项目背景介绍&#xff1a; 近年来&#xff0c;随着互联网技术的不断发展&#xff0c;人们的生活和工作方式也在逐渐改变。其中&#xff0c;医疗行业也受到了极大的影响。由于传统医疗行业存在着很多问题&#xff0c;例如就医难、看病贵等&#xff0c;因此出现了许多新型医疗…

窜天猴AI直播软件功能列表

迎新点名&#xff1a;新进直播间的用户随机指数级自由组合话术&#xff0c;并播报出来 礼物/关注&#xff1a;用户送礼物、关注以及灯牌事件同上根据话术指数级随机组合出来评论区关键字回复&#xff1a;用户评论后&#xff0c;根据预设置的关键字进行语音回复 自动寻品&…

蓝桥杯算法心得——字典树考试(贡献度+前缀和)

大家好&#xff0c;我是晴天学长&#xff0c;贡献度的题&#xff0c;找到技巧非常重要&#xff0c;需要的小伙伴可以关注支持一下哦&#xff01;后续会继续更新的。&#x1f4aa;&#x1f4aa;&#x1f4aa; 1) .字典树考试 字典树考试 问题描述 蓝桥学院最近教学了字典树这一数…

C51_串口通信

通信协议介绍 并行通信和串口通信 并行通信的各个位同时传输&#xff0c;每一位数据都需要一条传输线。优点是传输快&#xff0c;适合短距离传输&#xff0c;但是成本高串行通信将数据分成位的形式&#xff0c;在一条传输线上逐个传输 单工、半双工和全双工数据传输 单工数…

C语言之联合体

与结构体一样&#xff0c;联合体也是由多个成员组成&#xff0c;但是编译器只为最大的成员分配足够的空间&#xff0c;联合体的所有成员共用一块空间&#xff0c;所以联合体也叫共用体。 1.声明&#xff1a;类似结构体的声明&#xff0c;只是名字是union不是struct。声明并计算…

大模型学习笔记一

前言 随着人工智能的不断发展&#xff0c;机器学习这门技术也越来越重要&#xff0c;很多人都开启了学习机器学习&#xff0c;本文就介绍了机器学习的基础内容。 一、AI是什么&#xff1f; 二、大模型能干什么 大模型&#xff0c;全称「大语言模型」&#xff0c;英文「Large…

Git 配置BCompare工具

一、Git配置BCompare工具 1、安装BCompare工具 下载BCompare安装包&#xff0c;打开安装包直接安装即可&#xff0c;如下&#xff1a; 2、禁止BCompare访问网络 网络进出站进行配置&#xff0c;限制BCompare访问网络&#xff0c;如果不进行上网限制&#xff0c;可能存在被封的…

ubuntu 23 安装maven

要在 Ubuntu 23 系统上安装 Maven&#xff0c;请遵循以下步骤&#xff1a; **1. ** 确保已安装 Java Development Kit (JDK): Maven 需要 Java 环境才能运行。确认您的系统已经安装了 JDK 8 或更高版本。如果尚未安装&#xff0c;可以通过以下命令安装 OpenJDK&#xff1a; s…

python学习笔记——类

1. 类和对象**** 类、类属性、类方法不需要实例化就可以直接访问 实例相关&#xff0c;如实例属性、实例方法必须实例化后才可以访问 1.1. 类、类属性、实例属性、私有属性**** 1.1.1. 定义**** 类就是拥有相同属性和功能对象的集合 动物&#xff1a;猫、狗、鸡 人类&…