首页 > 其他分享 >QT+OpenGL通过两个VAO来管理两个三角形

QT+OpenGL通过两个VAO来管理两个三角形

时间:2024-08-22 15:50:28浏览次数:9  
标签:VAOs OpenGL 0.0 void 0.5 GL VAO QT

一、概述

  需求:通过两个VAO来管理VBO,从而控制两个三角形

  此需求和单独通过VAO绘制一个三角形有较大的不同,此处创建两个VAO,同时需要管理两个VBO。在绘制图形的时候需要分别绑定这两个VAO才能正确的绘制出三角形。

  效果:

  

二、代码示例

  1.定义顶点数据(两个三角形的顶点)

float firstTriangle[] = {
    -0.9f, -0.5f, 0.0f,  // left 
    -0.0f, -0.5f, 0.0f,  // right
    -0.45f, 0.5f, 0.0f,  // top 
};
float secondTriangle[] = {
    0.0f, -0.5f, 0.0f,  // left
    0.9f, -0.5f, 0.0f,  // right
    0.45f, 0.5f, 0.0f   // top 
};

  2.定义shader字符串

  a.顶点shader字符串

#version 330 core
layout (location = 0) in vec3 aPos;
void main()
{
    gl_Position = vec4(aPos.x, aPos.y, aPos.z, 1.0);
}

  b.片元字符串

#version 330 core
out vec4 FragColor;
void main(void)
{
    FragColor = vec4(1.0f, 0.0f, 0.0f, 1.0f);
}

  3.定义两个VAO、和VBO分别进行管理

unsigned int VBOs[2], VAOs[2];
glGenBuffers(2, VBOs);
glGenVertexArrays(2, VAOs); // we can also generate multiple VAOs or buffers at the same time
// first triangle setup
// --------------------
glBindVertexArray(VAOs[0]);
glBindBuffer(GL_ARRAY_BUFFER, VBOs[0]);
glBufferData(GL_ARRAY_BUFFER, sizeof(firstTriangle), firstTriangle, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);    // Vertex attributes stay the same
glEnableVertexAttribArray(0);

glBindVertexArray(VAOs[1]);    // note that we bind to a different VAO now
glBindBuffer(GL_ARRAY_BUFFER, VBOs[1]);    // and a different VBO
glBufferData(GL_ARRAY_BUFFER, sizeof(secondTriangle), secondTriangle, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, (void*)0); // because the vertex data is tightly packed we can also specify 0 as the vertex attribute's stride to let OpenGL figure it out
glEnableVertexAttribArray(0);

  4.分别绘制出两个三角形

glUseProgram(programId);

glBindVertexArray(VAOs[0]);
glDrawArrays(GL_TRIANGLES, 0, 3);

glBindVertexArray(VAOs[1]);
glDrawArrays(GL_TRIANGLES, 0, 3);

 

标签:VAOs,OpenGL,0.0,void,0.5,GL,VAO,QT
From: https://www.cnblogs.com/tony-yang-flutter/p/18374017

相关文章

  • QT+OpenGL使用一组顶点绘制两个三角形
    一、概述需求:使用一组顶点坐标绘制两个三角形。ps:此需求和绘制一个三角形并没有什么不同,只是把顶点坐标由三个改成了6个。依次类推,如果想要绘制多边形或者更多的三角形,只需要定义不同的顶点就行了。效果:二、代码示例1.定义顶点floatvertices[18]={......
  • QT自定义结构体的传递
    方法1:使用Q_DECLARE_METATYPE(TestResult)进行声明1.1声明#ifndefTESTRESULT_H#defineTESTRESULT_H#include<QDateTime>#include<QString>#include<QMetaType>//用于测试时更新内容,作为结果导出的依据classTestResult{public:int_nid=0;int_coun......
  • 【python】PyQt5中的QFrame控件,控制图形的边框样式、阴影效果、形状等属性
    ✨✨欢迎大家来到景天科技苑✨✨......
  • qt静态编译 全自动编译qt静态库 qt5 windows安装qt (2024.2.23)
    全自动编译qt5静态库(2024.2.23)本教程是从无到有配置qt.io和vcpkg实现全自动编译qt5的静态库,使得您可以静态编译qt项目0.安装VisualStudio2022这个我就不多解释了,直接去官网下载社区版本,勾选使用C++的桌面开发安装好就行1.安装qt.io的开发环境1.1下载在线安装包并且配......
  • 【嵌入式裸机开发】智能家居入门7:最新ONENET,MQTT协议接入,最全最新(微信小程序、MQTT协
    智能家居入门7前言一、ONENET云平台创建产品与设备二、STM32端连接服务器前的准备三、STM32端实现四、微信小程序端连接服务器前的准备五、微信小程序端实现六、最终测试前言本篇文章介绍最新ONENET云平台的MQTT协议接入方法,在STM32上实现数据上云与服务器下发数据......
  • VS2022+QT6.7.2 定时器的使用(两种方法)
    目录一、继承QObject定时器事件二、QTimer类三、具体实现一、继承QObject定时器事件  所有继承自QObject的类,都会有一个timerEvent(QTimerEvent*event)的纯虚函数,startTimer()设定定时间隔并启动,再重载这个函数以处理自己的定时任务,多个定时任务用timeId区分,结束后......
  • 解决lazarus 3.xx后在linux编译为Qt出错方法
    今天用lazarus3.4在银河麒麟将应用编译为Qt5出现以下错误信息:Warning:linker:/usr/bin/ld.bfd:/home/lb/fpcupdeluxe34/lazarus/lcl/units/aarch64-linux/qt5/qtint.o:infunction`QTINT$_$TQTWIDGETSET_$__$$_CREATE$$TQTWIDGETSET':Error:qtint.pp:(.text.n_qtint$_$t......
  • PyQt5实现置顶、位置固定、透明度设置
    在PyQt5中,要实现一个始终置顶、位置固定、透明度设置、去除关闭按钮且无法通过常规方式关闭的对话框窗口,需要对QDialog进行一系列的自定义设置。以下是一个详细的示例代码,展示了如何实现这些功能:importsysfromPyQt5.QtWidgetsimportQApplication,QDialog,QVBoxLayou......
  • Qt Quick 消息列表视图组件
    目录开发环境简介预览图代码main.qmlMessageQueueView.qml开发环境Qt版本:6.5.3构建:cmake+minGW64-bit简介这是一个纯QML程序,功能是一个消息列表的功能,可以进行插入,删除,清空等操作预览图![2024-08-2114-28-39_converted](images/2024-08-2114-28-39_converted.gif)......
  • QT+OpenGL 使用VAO、VBO、EBO结合绘制一个正方形
    一、概述需求:绘制一个正方形,可以控制正方形的颜色、可以切换正方形为线框模式/填充模式绘制流程:1.定义一个顶点着色器和片元着色器shader2.Qt创建一个Widget并继承QOpenGLWidget、QOpenGLFunctions,并重写initializeGL()、resizeGL(w,h)、pai......