【OpenGL】OpenGL学习笔记(一):绘制三角形、初识VAO和VBO

news2024/12/24 9:37:58

文章目录

  • 前言
  • 绘制目标


前言

最近开始研究用 QT 做开发来学习 OpenGL ,想着别学完了就忘了,所以准备新开一个 OpenGL 专栏。开发环境已经搭好了,但是没弄教程,最近比较忙,暂时先把核心代码放过来,先开个草率的头儿,后面有时间出个专栏《前传》把搭环境的内容讲讲。

这一篇的主要内容是先展现一下代码,关于 VAO、VBO 还有 EBO 等其他基础知识我会在下一篇好好梳理一下,有兴趣的请关注我的文章目录:【Unity】Unity学习笔记目录整理

绘制目标

在 Qt 中使用 OpenGL 绘制三角形。结果如下:
在这里插入图片描述

代码如下:

#include "testopenglwidget.h"

unsigned int VBO, VAO;

unsigned int shaderProgram;

float vertices[] = {
    -0.5f, -0.5f, 0.0f,
    0.5f, -0.5f, 0.0f,
    0.0f, 0.5f, 0.0f
};

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(1.0f, 0.5f, 0.2f, 1.0f);\n" "}\n\0";

TestOpenGLWidget::TestOpenGLWidget(QWidget *parent) : QOpenGLWidget{parent}
{

}

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

    // 创建VBO和VAO对象,并赋予id
    glGenVertexArrays(1, &VAO);
    glGenBuffers(1, &VBO);

    // 绑定VBO和VAO
    glBindVertexArray(VAO);
    glBindBuffer(GL_ARRAY_BUFFER, VBO);

    // 为当前绑定到target的缓冲区对象创建一个新的数据存储
    // 如果data不是null,则使用来自此指针的数据初始化数据存储
    glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);

    // 告知显卡如何解析缓冲里的属性值
    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);

    // 开启VAO管理的第一个属性值
    glEnableVertexAttribArray(0);

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

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

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

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

    glDeleteShader(vertexShader);
    glDeleteShader(fragmentShader);
}


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

}

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

    glUseProgram(shaderProgram);

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


更多内容请查看总目录【Unity】Unity学习笔记目录整理

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信支付开发-需求整理及需求设计

一、客户要求 1、通过唤醒机器人参与答题项,机器人自动获取题目,用户进行答题; 2、用户答对题数与后台设置的一样或者更多,则提醒用户可以领取奖品,但是需要用户支付邮费; 3、用户在几天之内不能重复领取奖…

分布式新能源的能量管理

在新能源的概念下,可以将其定义为:新能源是指具有一定能量的清洁的可再生能源,它是一种新型的可持续发展的资源和能源。生物质能是借助各类绿色植物的光合作用实现能量转换。地热能主要来源于地球熔岩内部存在的天然热能,海洋能通…

Vue3项目打包报错-内存溢出解决方法

错误:FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory 1、安装cross-env和increase-memory-limit 命令行:npm install cross-env increase-memory-limit 2、package.json添加如下内容&a…

胤娲科技:一场前所未有的运维革命

嘿,朋友们,你们有没有想过,如果电信网络里突然来了位“超级大脑”,我们的生活会是啥样? 以前啊,网络一有点小情绪,运维小哥就得像侦探一样,层层抽丝剥茧找问题。但现在,大…

CMU 10423 Generative AI:HW1(编程部分:在GPT-2模型中实现RoPE、GQA)

完整代码和PDF笔记:https://github.com/YM2025/CMU_10423_2024S 文章目录 1 概述Rotary Positional Embeddings (RoPE)Grouped Query Attention (GQA)实验任务 2 项目文件1. requirements.txt2. input.txt3. chargpt.py4. mingpt/a. model.pyb. trainer.pyc. utils.…

从 Postgres 到 ClickHouse:数据建模指南

本文字数:7149;估计阅读时间:18 分钟 作者:Sai Srirampur 本文在公众号【ClickHouseInc】首发 上个月,我们收购了专注于 Postgres CDC 的 PeerDB。PeerDB 使得数据从 Postgres 复制到 ClickHouse 变得既快速又简单。Pe…

iceoryx共享内存通信

共享内存原理 当POSIX系统中的进程启动时,它会被赋予自己的虚拟地址空间。 虚拟地址空间跨越的范围对于不同的进程可能是相同的,但是在特定地址可访问的数据对于每个进程可能是不同的。 在进程的虚拟地址空间内,有许多“内存区域”用于加载或映射数据。这些内存区域通常是…

内存魔术师:精通内存函数的艺术

嘿嘿,家人们,今天咱们来详细剖析C语言中的内存函数,好啦,废话不多讲,开干! 目录 1.memcpy使用与模拟实现 1.1:memcpy的使用 1.2:memcpy的模拟实现 2:memmove的使用与模拟实现 2.1:memmove的使用 2.1.1:memcpy处理重叠空间 2.1.2:memmove处理重叠空间 2.2:memove的模拟实…

【机器学习随笔】基于kmeans的车牌类型分类注意点

kmeans是无监督的聚类算法,可用于数据的分类。本文尝试用kmeans对车牌类型进行分类,记录使用过程中的注意点。 kmeans使用过程中涉及两个大部分,模型与分析。模型部分包括训练模型和使用模型,分析部分主要为可视化分析。两部分的主…

这东西有点上头,不小心刷到天亮了。。。

相信很多每天勤奋刷题的小伙伴已经发现了,面试鸭又又又升级更新了! 打开首页就让人眼前一亮,优化了岗位分类导航栏,找起目标题库更轻松了。毕竟鸭鸭目前已经有 6000 道面试题、上百个题库,一不小心就会淹没在浩瀚题海…

如何优化MySql的性能

优化MySQL的性能是一个复杂但至关重要的任务,它涉及到多个层面的调整和优化。以下是一些关键的步骤和策略,可以帮助你提高MySQL数据库的性能: 1. 优化数据库设计 选择合适的数据类型:确保你使用的数据类型是适合你的数据的&#…

Three.js 实战【4】—— 3D地图渲染

初始化场景&准备工作 在vue3threejs当中,初始化场景的代码基本上是一样的,可以参考前面几篇文章的初始化场景代码。在这里进行渲染3D地图还需要用到d3这个库,所以需要安装一下d3,直接npm i即可。 再从阿里云这里提供的全国各…

SQL server 6.5升级到SQL server 2019的方法

背景: 对日项目,客户的旧系统的数据库用的是SQL server 6.5,操作系统是windows NT。新系统要求升级到SQL server 2019,查了下资料发现旧系统的版本实在是太久远了,90年代的。 数据库部分的升级思路是这样的&#xff…

git 更新LingDongGui问题解决

今天重新更新灵动gui的代码,以便使用最新的arm-2d,本来以为是比较简单的一件事情(因为以前已经更新过一次),却搞了大半天,折腾不易啊,简单记录下来,有同样遇到问题的同学参考&#x…

AI算法部署方式对比分析:哪种方案性价比最高?

随着人工智能技术的飞速发展,AI算法在各个领域的应用日益广泛。AI算法的部署方式直接关系到系统的性能、实时性、成本及安全性等多个方面。本文将探讨AI算法分析的三种主要部署方式:本地计算、边缘计算和云计算,并详细分析它们的优劣性。 一、…

基于vue框架的宠物交流平台1n2n3(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能:会员,宠物信息,宠物类型,团队信息,申请领养,团队申请,领养宠物 开题报告内容 基于Vue框架的宠物交流平台开题报告 一、项目背景 随着现代生活节奏的加快与人们情感需求的日益增长,宠物已成为众多家庭不可或缺的重要成员。…

基于Python的影视数据可视化---附源码75141

摘 要 本文基于Python语言,设计并实现了一个影视数据可视化系统,包括首页、公告通知、新闻资讯和电影信息等功能模块。通过对影视数据的采集、处理和可视化展示,该系统旨在为用户提供全面的影视信息和数据分析服务。在研究背景中&#xff0c…

编译运行 webAssembly(wasm)

环境准备&#xff1a; lunix下docker 参考https://hub.docker.com/r/emscripten/emsdk 拉编译环境 docker pull emscripten/emsdk 编译 随便找个目录&#xff0c;敲下面命令&#xff0c;编译一个webAssembly 程序 # create helloworld.cpp cat << EOF > hellowo…

Android Studio 新生成key store 打包apk报 Invalid keystore format

Android Studio 新生成key store 打包apk报错 Execution failed for task :app:packageDebug. > A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade > com.android.ide.common.signing.KeytoolException: Failed …

充电宝什么品牌比较好用?2024年最值得推荐充电宝品牌!

近年来&#xff0c;随着电子设备使用需求的增加&#xff0c;充电宝市场呈现出蓬勃发展的态势。优秀的充电宝产品不仅能够提供稳定的充电速度&#xff0c;还具备方便携带的体验&#xff0c;深受用户喜爱。然而&#xff0c;面对市场上众多品牌和型号的选择&#xff0c;如何找到最…