当前位置: 首页 > news >正文

OpenGL笔记八之EBO和EBO绘制流程

OpenGL笔记八之EBO和EBO绘制流程

—— 2024-07-07 晚上

bilibili赵新政老师的教程看后笔记

code review!

文章目录

  • OpenGL笔记八之EBO和EBO绘制流程
    • 1.EBO
    • 2.glDrawElements:如果使用了ebo,最后一个参数可以写0
    • 3.glDrawElements:如果使用了ebo,假设最后一个参数是数字,表示ebo内偏移量
      • 3.1.count改为3,偏移量为0
      • 3.2.count改为3,偏移量为3
    • 4.glDrawElements:如果没有使用ebo,可以直接将cpu端的indices数组传输进去(不推荐这种方式)
    • 5.main.cpp

1.EBO

在这里插入图片描述

代码

void prepareVAO() {//1 准备positionsfloat positions[] = {-0.5f, -0.5f, 0.0f,0.5f, -0.5f, 0.0f,0.0f,  0.5f, 0.0f,0.5f,  0.5f, 0.0f,};unsigned int indices[] = {0, 1, 2,2, 1, 3};//2 VBO创建GLuint vbo;glGenBuffers(1, &vbo);glBindBuffer(GL_ARRAY_BUFFER, vbo);glBufferData(GL_ARRAY_BUFFER, sizeof(positions), positions, GL_STATIC_DRAW);//3 EBO创建GLuint ebo;glGenBuffers(1, &ebo);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);//4 VAO创建glGenVertexArrays(1, &vao);glBindVertexArray(vao);//5 绑定vbo ebo 加入属性描述信息//5.1 加入位置属性描述信息glBindBuffer(GL_ARRAY_BUFFER, vbo);glEnableVertexAttribArray(0);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 3, (void*)0);//5.2 加入ebo到当前的vaoglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);glBindVertexArray(0);
}

对比VAO
在这里插入图片描述

2.glDrawElements:如果使用了ebo,最后一个参数可以写0

运行
在这里插入图片描述

关键代码

//	glDrawArrays(GL_LINE_STRIP, 0, 6);
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
//  glBindVertexArray(0);

3.glDrawElements:如果使用了ebo,假设最后一个参数是数字,表示ebo内偏移量

3.1.count改为3,偏移量为0

运行
在这里插入图片描述

关键代码

glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0);

3.2.count改为3,偏移量为3

运行
在这里插入图片描述

关键代码

glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, (void*)(sizeof(int)*3));

4.glDrawElements:如果没有使用ebo,可以直接将cpu端的indices数组传输进去(不推荐这种方式)

运行
在这里插入图片描述

关键代码

//5.2 加入ebo到当前的vao
// glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo); //需要注释掉
unsigned int indices[] = {0, 1, 2,2, 1, 3
};
glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, indices);

5.main.cpp

代码

#include <iostream>#define DEBUG//注意:glad头文件必须在glfw引用之前引用
#include <glad/glad.h>
#include <GLFW/glfw3.h>
#include <string>
#include <assert.h>//断言
#include "wrapper/checkError.h"
#include "application/Application.h"/*
*┌────────────────────────────────────────────────┐
*│ 目	   标: 学习EBO进行绘制
*│ 讲    师: 赵新政(Carma Zhao)
*│ 拆分目标:
*│
*│ 		1 创建EBO,灌入数据,与vao绑定
*│ 		2 练习glDrawElements
*				-如果使用了ebo,最后一个参数可以写0;
*				-如果使用了ebo,假设最后一个参数是数字,表示ebo内偏移量
*				-如果没有使用ebo,可以直接将cpu端的indices数组传输进去
*└────────────────────────────────────────────────┘
*/GLuint vao, program;void OnResize(int width, int height) {GL_CALL(glViewport(0, 0, width, height));std::cout << "OnResize" << std::endl;
}void OnKey(int key, int action, int mods) {std::cout << key << std::endl;
}void prepareVAO() {//1 准备positionsfloat positions[] = {-0.5f, -0.5f, 0.0f,0.5f, -0.5f, 0.0f,0.0f,  0.5f, 0.0f,0.5f,  0.5f, 0.0f,};unsigned int indices[] = {0, 1, 2,2, 1, 3};//2 VBO创建GLuint vbo;glGenBuffers(1, &vbo);glBindBuffer(GL_ARRAY_BUFFER, vbo);glBufferData(GL_ARRAY_BUFFER, sizeof(positions), positions, GL_STATIC_DRAW);//3 EBO创建GLuint ebo;glGenBuffers(1, &ebo);glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);//4 VAO创建glGenVertexArrays(1, &vao);glBindVertexArray(vao);//5 绑定vbo ebo 加入属性描述信息//5.1 加入位置属性描述信息glBindBuffer(GL_ARRAY_BUFFER, vbo);glEnableVertexAttribArray(0);glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float) * 3, (void*)0);//5.2 加入ebo到当前的vaoglBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);glBindVertexArray(0);
}void prepareShader() {//1 完成vs与fs的源代码,并且装入字符串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";//2 创建Shader程序(vs、fs)GLuint vertex, fragment;vertex = glCreateShader(GL_VERTEX_SHADER);fragment = glCreateShader(GL_FRAGMENT_SHADER);//3 为shader程序输入shader代码glShaderSource(vertex, 1, &vertexShaderSource, NULL);glShaderSource(fragment, 1, &fragmentShaderSource, NULL);int success = 0;char infoLog[1024];//4 执行shader代码编译 glCompileShader(vertex);//检查vertex编译结果glGetShaderiv(vertex, GL_COMPILE_STATUS, &success);if (!success) {glGetShaderInfoLog(vertex, 1024, NULL, infoLog);std::cout << "Error: SHADER COMPILE ERROR --VERTEX" << "\n" << infoLog << std::endl;}glCompileShader(fragment);//检查fragment编译结果glGetShaderiv(fragment, GL_COMPILE_STATUS, &success);if (!success) {glGetShaderInfoLog(fragment, 1024, NULL, infoLog);std::cout << "Error: SHADER COMPILE ERROR --FRAGMENT" << "\n" << infoLog << std::endl;}//5 创建一个Program壳子program = glCreateProgram();//6 将vs与fs编译好的结果放到program这个壳子里glAttachShader(program, vertex);glAttachShader(program, fragment);//7 执行program的链接操作,形成最终可执行shader程序glLinkProgram(program);//检查链接错误glGetProgramiv(program, GL_LINK_STATUS, &success);if (!success) {glGetProgramInfoLog(program, 1024, NULL, infoLog);std::cout << "Error: SHADER LINK ERROR " << "\n" << infoLog << std::endl;}//清理glDeleteShader(vertex);glDeleteShader(fragment);
}void render() {//执行opengl画布清理操作GL_CALL(glClear(GL_COLOR_BUFFER_BIT));//1 绑定当前的programGL_CALL(glUseProgram(program));//2 绑定当前的vaoGL_CALL(glBindVertexArray(vao));//3 发出绘制指令
//	glDrawArrays(GL_LINE_STRIP, 0, 6);glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);glBindVertexArray(0);
}int main() {if (!app->init(800, 600)) {return -1;}app->setResizeCallback(OnResize);app->setKeyBoardCallback(OnKey);//设置opengl视口以及清理颜色GL_CALL(glViewport(0, 0, 800, 600));GL_CALL(glClearColor(0.2f, 0.3f, 0.3f, 1.0f));prepareShader();prepareVAO();while (app->update()) {render();}app->destroy();return 0;
}

相关文章:

OpenGL笔记八之EBO和EBO绘制流程

OpenGL笔记八之EBO和EBO绘制流程 —— 2024-07-07 晚上 bilibili赵新政老师的教程看后笔记 code review! 文章目录 OpenGL笔记八之EBO和EBO绘制流程1.EBO2.glDrawElements&#xff1a;如果使用了ebo&#xff0c;最后一个参数可以写03.glDrawElements&#xff1a;如果使用了e…...

maven——(重要)手动创建,构建项目

创建项目 手动按照maven层级建好文件夹&#xff0c;并写上java&#xff0c;测试代码和pom文件 构建项目 在dos窗口中执行如下命令 compile编译 当前maven仓库中什么都没有。 在pom所在层级下&#xff0c;执行&#xff1a; mvn compile 就开始显示下面这些&#xff0c;…...

数学建模·非线性规划

整型规划 适用于一个变量或多个变量的值只能是整型的情况 整形规划的分类 0-1背包问题 对于一个物品来说&#xff0c;只有选和不选两种情况 表现为单下标&#xff0c;单变量问题 例&#xff1a;建设学校问题 对于每个学校来说只有选和不选两种情况&#xff0c;在数学上我们用…...

SpringCloud第三篇(服务中心与OpenFeign)

p 文章目录 一、服务中心二、Nacos注册中心 一、服务中心 在上一章我们实现了微服务拆分&#xff0c;并且通过Http请求实现了跨微服务的远程调用。不过这种手动发送Http请求的方式存在一些问题。 试想一下&#xff0c;假如商品微服务被调用较多&#xff0c;为了应对更高的并发…...

Linux重要知识点

1. 命令行操作 Linux大多数操作都是通过命令行进行的。熟悉常用命令和脚本是使用Linux的基础。 基本命令&#xff1a;如 ls, cd, cp, mv, rm&#xff0c;这些命令用于文件和目录的管理。文件权限和管理&#xff1a;了解如何使用 chmod, chown, chgrp 等命令来管理文件权限和所…...

Unity宏和编辑器

宏&#xff1a;UNITY_EDITOR 等等 编辑器&#xff1a;Unity未运行时的状态 如何使用&#xff1a;#if UNITY_EDITOR 代码 #endif 什么情况下使用&#xff1a;包裹那些想要在编辑器模式下使用的代码 而在Unity运行时不会去调用的代码 AssetDatabase.LoadAssetAtPath&#xff08;路…...

计算机网络——网络层(概念及IP地址划分)

目录 网络层概念 网络层向上层提供的两种服务 虚电路 网络提供数据报服务 虚电路服务与数据报服务的对比 网络层的两个层面 分组传送到路由器的运作 对网络层进行分层 网际协议IP 虚拟互联网络 IP地址 IP地址及其表示方法 IP地址的计算方式 IP地址的结构 …...

【JVM实战篇】内存调优:内存泄露危害+内存监控工具介绍+内存泄露原因介绍

文章目录 内存调优内存溢出和内存泄漏内存泄露带来什么问题内存泄露案例演示内存泄漏的常见场景场景一场景二 解决内存溢出的方法常用内存监控工具Top命令优缺点 VisualVM软件、插件优缺点监控本地Java进程监控服务器的Java进程&#xff08;生产环境不推荐使用&#xff09; Art…...

CVE漏洞爬虫脚本

前言&#xff1a;前阵子公司非要把CVE漏洞信息拉倒本地&#xff0c;说方便安全员们查看&#xff0c;其实在莫慌看来&#xff0c;大可不必&#xff0c;90%的CVE漏洞其实不具备现实利用的可能性的&#xff08;不代表不能被利用&#xff09;&#xff0c;但是你说它没有意义也是不对…...

如何搭建互联网医院系统源码?医疗陪诊APP开发实战详解

今天&#xff0c;小编将为大家讲解如何搭建一个完整的互联网医院系统源码&#xff0c;并介绍医疗陪诊APP的开发实战。 一、互联网医院系统的架构设计 搭建一个完整的互联网医院系统&#xff0c;需要从架构设计开始。一个典型的互联网医院系统通常包含以下几个核心模块&#xf…...

高通平台android的Framework开发遇到的一些问题总结

涉及到framwork的修改一般都在QSSI文件夹下。 1、Android设备&#xff0c;发现耳机插入了设备&#xff0c;但是设备statusbar并没有显示耳机插入的状态。 frameworks/base/packages/SystemUI/res/values/config.xml 下修改&#xff1a; <string-array name"config_s…...

基于modbus tcp通讯的雷赛导轨控制器调试软件

0.前言 之前工作遇到了雷赛电机驱动器设备&#xff0c;主要是用来控制光学导轨移动。雷赛的调试软件用的时串口通讯&#xff0c;还要他们定制的串口线&#xff0c;在现场都是485转网络的接口&#xff0c;调试起来也很不方便。所以我就照着他们的说明书&#xff0c;写了一个简易…...

阿里云产品流转

本文主要记述如何使用阿里云对数据进行流转&#xff0c;这里只是以topic流转&#xff08;再发布&#xff09;为例进行说明&#xff0c;可能还会有其他类型的流转&#xff0c;不同服务器的流转也可能会不一样&#xff0c;但应该大致相同。 1 创建设备 具体细节可看&#xff1a;…...

GO语言中的接口(interface)

go 接口 interface 1、什么是接口&#xff08;interface&#xff09;&#xff1f;2、注意事项3、interface底层实现4、侵入式与非侵入式5、接口的应用场景空接口的应用场景 6、其他使用 1、什么是接口&#xff08;interface&#xff09;&#xff1f; 在Go语言中&#xff0c;接口…...

模拟电路再理解系列(2)-电源滤波电路

前言 今天梳理一下电源滤波电路&#xff0c;在大部分电路设计中&#xff0c;都有滤波电路这一块儿&#xff0c;严格地说的话除了电源滤波还有信号滤波&#xff0c;经常会看到电路里面有一些电容&#xff0c;电感等串并联在一起的模块&#xff0c;大概率就是起到滤波作用&#…...

uniapp使用多列布局显示图片,一行两列

完整代码&#xff1a; <script setup>const src "https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/shuijiao.jpg" </script><template><view class"content"><view class"img-list"><image :src"src…...

近期几首小诗汇总-生活~卷

生活 为生活飘零&#xff0c;风雨都不阻 路见盲人艰&#xff0c;为她心点灯 贺中科大家长论坛成立十五周年 科学家园有喜贺 园外丑汉翘望中 曾一学子入我科 正育科二盼长大 憧憬也能入此家 与科学家论短长 园外翘首听高论 发现有隙入此坛 竟然也能注册成 入园浏览惶然立 此贴…...

超时导致SparkContext构造失败的问题探究

文章目录 1.前言2. 基于事故现场对问题进行分析2.1 日志分析2.2 单独测试Topology代码试图重现问题 3. 源码解析3.1 Client模式和Cluster模式下客户端的提交和启动过程客户端提交时在两种模式下的处理逻辑ApplicationMaster启动时在两种模式下的处理逻辑 3.2 两种模式下的下层角…...

【人工智能】Transformers之Pipeline(一):音频分类(audio-classification)

​​​​​​​ 目录 一、引言 二、音频分类&#xff08;audio-classification&#xff09; 2.1 概述 2.2 技术原理 2.2.1 Wav2vec 2.0模型 2.2.1 HuBERT模型 2.3 pipeline参数 2.3.1 pipeline对象实例化参数 2.3.2 pipeline对象使用参数 2.4 pipeline实战 2.4.1 …...

Nginx 负载均衡详解

Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;拥有丰富的功能和模块&#xff0c;负载均衡就是其中之一。负载均衡是一种技术&#xff0c;用于在多台服务器之间分配工作负载&#xff0c;以确保高可用性和可靠性。本文将详细介绍Nginx的负载均衡算法、工作原理、配置方法…...

Unity3D开发之传送带实现

/// <summary> /// 传送带 直线传送带 /// </summary> public class ConveyerBelt : MonoBehaviour {public float Speed 1;protected float mspeed;protected Vector3 direction;protected Rigidbody rd;List<GameObject> Goods new List<GameObject&…...

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(二)-支持高分辨率视频直播应用

引言 本文是3GPP TR 22.829 V17.1.0技术报告&#xff0c;专注于无人机&#xff08;UAV&#xff09;在3GPP系统中的增强支持。文章提出了多个无人机应用场景&#xff0c;分析了相应的能力要求&#xff0c;并建议了新的服务级别要求和关键性能指标&#xff08;KPIs&#xff09;。…...

python的私有属性和数据封装

1.私有属性 在 Python 中&#xff0c;私有属性是一种编程约定&#xff0c;用于表示某些属性在类的内部使用&#xff0c;不希望被外部直接访问或修改。 私有属性的命名通常以双下划线 __ 开头。例如&#xff0c;在类中定义一个私有属性可以像这样&#xff1a; class MyClass:de…...

一文学会鉴别“套壳”ChatGPT模型

一文学会鉴别“套壳”ChatGPT模型 随着ChatGPT等明星模型的诞生&#xff0c;市场上也开始出现一些“套壳”现象&#xff0c;即部分模型表面标榜原创或先进&#xff0c;实则在核心算法上与知名模型高度相似。作为技术探索者&#xff0c;如何拨开迷雾&#xff0c;识别这些“李鬼…...

Docker基本管理1

Docker 概述 Docker是一个开源的应用容器引擎&#xff0c;基于go语言开发并遵循了apache2.0协议开源。 Docker是在Linux容器里运行应用的开源工具&#xff0c;是一种轻量级的“虚拟机”。 Docker 的容器技术可以在一台主机上轻松为任何应用创建一个轻量级的、可移植的、自给自…...

python-28-零基础自学python-json存数据、读数据,及程序合并

学习内容&#xff1a;《python编程&#xff1a;从入门到实践》第二版 知识点&#xff1a; import json引入、 try-except-else return def函数、打开文件、 练习内容&#xff1a; 练习10-11&#xff1a;喜欢的数 编写一个程序&#xff0c;提示用户输入喜欢的数&#xff…...

Excel第30享:基于辅助列的条件求和

1、需求描述 如下图所示&#xff0c;现要统计2022年YTD&#xff08;Year To Date&#xff1a;年初至今日&#xff09;各个人员的“上班工时&#xff08;a2&#xff09;”。 下图为系统直接导出的工时数据明细样例。 2、解决思路 Step1&#xff1a;确定逻辑。“从日期中提取出…...

Java查看RSA密钥的ASN1结构

背景&#xff1a;服务端使用Java开发的&#xff0c;接口需要客户端传一个RSA公钥&#xff0c;手机端使用Flutter开发的&#xff0c;然后就选择使用 pointycastle 生成密钥&#xff0c;很不巧&#xff0c;dart版本不像Java一样有个可以直接获取编码过的公钥信息的方法&#xff1…...

友思特方案 | 低延迟GigE Vision解决方案:用于红外设备、医疗和工业级探测面板

导读 维持实时视频系统软硬件的长期成本效益&#xff0c;是该系统在医疗、工业等领域广泛应用的前提。友思特低延迟GigE Vision解决方案创新性地突破了这一难题&#xff0c;提供高带宽且高可靠性的端到端网络链接&#xff0c;有效降低了开发成本、复杂性和时间。 引言 虽然实…...

网络安全策略:优先防护而非溯源的重要性

面对网络攻击&#xff0c;企业往往面临一个关键决策点&#xff1a;是立即投入资源进行攻击溯源&#xff0c;还是优先加强自身的防御体系。尽管溯源分析有助于了解攻击者的手段和动机&#xff0c;但在大多数情况下&#xff0c;优先强化防护是更为明智的选择。本文将探讨为何在遭…...