opengl绘制三角形

news2024/12/22 20:40:07

1.绘制两个三角形
GLfloat vertices1[] = {
0.5f, 0.5f, 0.0f,
0.5f, -0.5f, 0.0f,
-0.5f, 0.5f, 0.0f
}
GLfloat vertices2[] = {
0.5f, -0.5f, 0.0f,
-0.5f, 0.5f, 0.0f,
-0.5f, -0.5f, 0.0f
}
也可以用索引的方式:
GLfloat 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
};
GLuint indices[] = {
0,1,3,
1,3,2
};

若使用方式一:

initializeGL():
	core->glGenVertexArrays(1, &vao1);
    core->glBindVertexArray(vao1); //所有跟GL_ARRAY_BUFFER相关的操作状态都会被记录
    //用vbo管理内存中的数据,尽量一次将大量数据传给gpu,cpu-gpu速度很慢
    core->glGenBuffers(1, &vbo1);//1.要生成的缓冲对象的数量,2.用来存储缓冲对象名称的数组
   // core->glGenBuffers(1, &ebo);
    core->glBindBuffer(GL_ARRAY_BUFFER, vbo1);//绑定缓冲对象到状态机上
    core->glBufferData(GL_ARRAY_BUFFER, sizeof(vertices1), vertices1, GL_STATIC_DRAW);//将当前绑定在某种类型的缓冲所指向的内存传输到gpu的缓冲区
    core->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
    core->glEnableVertexAttribArray(0);
    core->glBindBuffer(GL_ARRAY_BUFFER, 0);
    core->glBindVertexArray(0);
    core->glGenVertexArrays(1, &vao2);
    core->glBindVertexArray(vao2); //所有跟GL_ARRAY_BUFFER相关的操作状态都会被记录
    //用vbo管理内存中的数据,尽量一次将大量数据传给gpu,cpu-gpu速度很慢
    core->glGenBuffers(1, &vbo2);//1.要生成的缓冲对象的数量,2.用来存储缓冲对象名称的数组
   // core->glGenBuffers(1, &ebo);
    core->glBindBuffer(GL_ARRAY_BUFFER, vbo2);//绑定缓冲对象到状态机上
    core->glBufferData(GL_ARRAY_BUFFER, sizeof(vertices2), vertices2, GL_STATIC_DRAW);//将当前绑定在某种类型的缓冲所指向的内存传输到gpu的缓冲区
    core->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
    core->glEnableVertexAttribArray(0);
    core->glBindBuffer(GL_ARRAY_BUFFER, 0);
    core->glBindVertexArray(0);
paintGL():
	core->glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
    core->glClear(GL_COLOR_BUFFER_BIT);
    shaderProgram.bind();
    core->glBindVertexArray(vao1);
    core->glDrawArrays(GL_TRIANGLES, 0, 3);
    core->glBindVertexArray(vao2);
    core->glDrawArrays(GL_TRIANGLES, 0, 3);

若使用方式二:

initializeGL() :
	core->glGenVertexArrays(1, &vao);
	core->glBindVertexArray(vao); //所有跟GL_ARRAY_BUFFER相关的操作状态都会被记录
	//用vbo管理内存中的数据,尽量一次将大量数据传给gpu,cpu-gpu速度很慢
	core->glGenBuffers(1, &vbo);//1.要生成的缓冲对象的数量,2.用来存储缓冲对象名称的数组
	core->glBindBuffer(GL_ARRAY_BUFFER, vbo);//绑定缓冲对象到状态机上
	core->glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);//将当前绑定在某种类型的缓冲所指向的	内存传输到gpu的缓冲区
	core->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
	core->glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW);
	core->glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
	core->glEnableVertexAttribArray(0);//启用顶点属性,让着色器能够访问这些数据  多个vbo便于控制
paintGL():
	core->glClearColor(1.0f, 0.0f, 0.0f, 1.0f);
    core->glClear(GL_COLOR_BUFFER_BIT);
    shaderProgram.bind();
    core->glBindVertexArray(vao);
    core->glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);//0代表起始位置 ,(GLvoid*)indices[3] 从第三个位置画

着色器编写代码:

QOpenGLShader vertexShader(QOpenGLShader::Vertex);//顶点着色器
	QOpenGLShader fragmentShader(QOpenGLShader::Fragment);//片段着色器
	//解析文件
	bool flag = vertexShader.compileSourceFile("shader/triangle.vert");
	qDebug() << "vertexShader flag---------------------------------" << flag;
	flag = fragmentShader.compileSourceFile("shader/triangle.frag");
	qDebug() << "fragmentShader flag---------------------------------" << flag;
	 //生成着色器程序
	shaderProgram.addShader(&vertexShader);
	shaderProgram.addShader(&fragmentShader);
	shaderProgram.link();
  	//绑定空缓冲区
	core->glBindVertexArray(0);
	core->glBindBuffer(GL_ARRAY_BUFFER, 0);
	core->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

运行效果图:
在这里插入图片描述

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

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

相关文章

并发编程常见问题复盘

并发编程常见问题复盘 大家好&#xff0c;我是易安&#xff01; 并发编程在计算机科学领域占有举足轻重的地位&#xff0c;它使得程序能够在多个处理器核心上同时执行&#xff0c;从而显著提升程序的性能。然而&#xff0c;并发编程也伴随着许多挑战和问题。这些年来&#xff0…

eacharjs饼状图带百分比

var myChart1 echarts.init(document.getElementById(main1)); myChart1.setOption({title:{text:近30天异常停机的类型TOP5,x:center,y:10px,// textStyle:{// fontSize:12// }},tooltip: {trigger: item//提示 鼠标移动上去},// legend: { // 上面的提示// top: 25%…

端口映射工具PortTunnel

PortTunnel应该是目前最好的端口转发器、端口映射工具(它解决了内外网访问的问题) 可以在我的资源中下载&#xff1a;https://download.csdn.net/download/qq_39569480/87717704 使用该工具前应该保证双方机器网络互通 下面我们模拟一下环境 比如现在有三台机器 A&#xff1a…

Mac环境SpringBoot项目Docker部署(独家完整版)

一、Docker 简介 Docker 是一种开源的容器化平台&#xff0c;允许开发人员将应用程序和所有其依赖项打包成轻量级、可移植的容器&#xff0c;以便在任何地方运行。Docker 的优势和劣势分析如下&#xff1a; 优势: 轻量级:Docker 容器仅包含应用程序及其依赖项&#xff0c;因…

家庭智能吸顶灯一Homekit智能

买灯要看什么因素 好灯具的灯光可以说是家居的“魔术师”&#xff0c;除了实用的照明功能外&#xff0c;对细节的把控也非常到位。那么该如何选到一款各方面合适的灯呢&#xff1f; 照度 可以简单理解为清晰度&#xff0c;复杂点套公式来说照度光通量&#xff08;亮度&#x…

【社区图书馆】二、LED子系统——硬件驱动层

个人主页&#xff1a;董哥聊技术 我是董哥&#xff0c;嵌入式领域新星创作者 创作理念&#xff1a;专注分享高质量嵌入式文章&#xff0c;让大家读有所得&#xff01; 文章目录 1、gpio_led_probe分析1.1 相关数据结构1.1.1 gpio_led_platform_data1.1.2 gpio_leds_priv 1.2 实…

Nextjs 处理 css3 前缀兼容

Nextjs 处理 css3 前缀兼容 虽然css3现在浏览器支持率已经很高了, 但有时候需要兼容一些低版本浏览器,需要给css3加前缀,可以借助插件来自动加前缀, postcss-loader就是来给css3加浏览器前缀的,安装依赖&#xff1a; npm i postcss-loader autoprefixer -Dpostcss-loader&…

前端使用国密SM4进行加密、解密

目录 需求【方法1】 - 使用 sm4util 依赖【方法2】sm4.js引入1. /public/sm4.js2. body 标签上引入该文件3. 使用 - ECB 模式加密 【方法3】1. 本地写 js 文件2. 使用 - ECB 模式加解密 需求 前端/后端使用 国密SM4 进行加密/解密&#xff0c; 【注意】前后端配合加解密时&…

06期:使用 OPTIMIZER_TRACE 窥探 MySQL 索引选择的秘密

这里记录的是学习分享内容&#xff0c;文章维护在 Github&#xff1a;studeyang/leanrning-share。 优化查询语句的性能是 MySQL 数据库管理中的一个重要方面。在优化查询性能时&#xff0c;选择正确的索引对于减少查询的响应时间和提高系统性能至关重要。但是&#xff0c;如何…

scrapy框架爬取某壁纸网站美女壁纸 + MySQL持久化存储

文章目录 准备工作创建项目&#xff1a;设置&#xff08;settings&#xff09; 主程序入口meinv.py思路源代码 items 配置管道pipelines源代码 效果图总结 准备工作 创建项目&#xff1a; scraoy startproject bizhi cd bizhi scrapy genspider meinv bizhi360.com 设置&#…

ROS学习第二十九节——URDF之joint

此处留疑问&#xff0c;link,joint的origin子标签到底是怎么样的一种位置关系&#xff1f;&#xff1f;&#xff1f; https://download.csdn.net/download/qq_45685327/87717336 urdf 中的 joint 标签用于描述机器人关节的运动学和动力学属性&#xff0c;还可以指定关节运动的…

大数据-玩转数据-IDEA创建Maven工程

一、 IDEA集成Maven插件 打开IDEA&#xff0c;进入主界面后点击 file&#xff0c;然后点击 settings,在上面的快捷查找框中输入maven&#xff0c;查找与maven相关的设置&#xff0c;然后点击maven 修改maven的路径&#xff08;使用本地的Maven&#xff09;&#xff0c;以及修…

【流畅的Python学习笔记】2023.4.22

此栏目记录我学习《流畅的Python》一书的学习笔记&#xff0c;这是一个自用笔记&#xff0c;所以写的比较随意 元组 元组其实是对数据的记录&#xff1a;元组中的每个元素都存放了记录中一个字段的数据&#xff0c;外加这个字段的位置。简单试试元组的特性&#xff1a; char…

kong(1):Kong介绍

Kong是一款基于OpenResty&#xff08;Nginx Lua模块&#xff09;编写的高可用、易扩展的&#xff0c;由Mashape公司开源的API Gateway项目。Kong是基于NGINX和Apache Cassandra或PostgreSQL构建的&#xff0c;能提供易于使用的RESTful API来操作和配置API管理系统&#xff0c;…

复旦大学郁喆隽:网络制造出人的“幻象”,深度思考如何可能?

“人是什么?”这是亘古以来人们反复追问的一个古老命题。从元宇宙到ChatGPT&#xff0c;这个人人都在讨论、理解和实践互联网的时代&#xff0c;对“人”的自我定义和认知产生了哪些影响&#xff1f;    在3月12日复旦大学-华盛顿大学EMBA项目主办的“复调艺文沙龙”上&am…

计算长方形、三角形、圆形的面积和周长

系统设计框图&#xff1a; 图形模块的 概要设计&#xff08;设计数据结构和接口&#xff09;&#xff1a; 数据结构&#xff1a; float 表示面积和周长 长方形的数据&#xff08;一般typedef都是定义在对应模块的头文件中&#xff09; typedef struct{ float width; float he…

三菱GX Works2梯形图程序分段显示设置的具体方法示例

三菱GX Works2梯形图程序分段显示设置的具体方法示例 大家平时在使用GX Works2进行梯形图程序编辑时,默认是一整段在一起,程序步数较多时查看起来不是那么方便,下面就和大家分享如何通过声明编辑来实现程序分段显示。 具体方法可参考以下内容: 如下图所示,打开GX Works2编…

数据结构与算法(一):基础数据结构 算法概念、数组、链表、栈、队列

判断一个数是否是2的N次方&#xff1f; N & (N-1) 0 (N > 0)算题&#xff1a; 力扣 https://leetcode.cn/POJ http://poj.org/ 算法 算法概念 算法代表&#xff1a; 高效率和低存储 内存占用小、CPU占用小、运算速度快 算法的高效率与低存储&#xff1a;内存 C…

Oracle 定时任务job实际应用

Oracle 定时任务job实际应用 一、Oracle定时任务简介二、dbms_job涉及到的知识点三、初始化相关参数job_queue_processes四、实际创建一个定时任务&#xff08;一分钟执行一次&#xff09;&#xff0c;实现定时一分钟往表中插入数据4.1 创建需要定时插入数据的目标表4.2 创建定…

如何为Google Play的应用制作宣传视频

在用户打开我们的应用页面时&#xff0c;最先看到的是宣传视频&#xff0c;这是吸引潜在用户注意力的绝好机会&#xff0c;所以这对于 Google Play 来说是一件大事。 宣传视频和屏幕截图一起&#xff0c;都是引导用户去使用我们应用程序的第一步&#xff0c;能够让他们一打开应…