如何使用多个VAO和VBO在OpenGL中绘制多个对象?

2024-01-25

我正在尝试使用多个 VAO 和 VBO 在 OpenGL 中渲染多个对象。要使用相同的顶点渲染多个对象,我已经做到了,但我想做的是为每个对象使用不同的顶点,例如绘制一个正方形和一个圆形。对于正方形,我只需要 6 个顶点,但对于圆形,我需要 360 个顶点。 我在读取或创建着色器时出错。

这是顶点着色器:

#version 330 core

layout (location = 0) in vec4 position;

uniform mat4 model;
uniform mat4 view;
uniform mat4 projection;

void main()
{
    gl_Position = projection * view * model * position;
}

片段着色器:

#version 330 core

layout(location = 0) out vec4 color;

uniform vec4 u_Color;

void main()
{
    color = u_Color;
}

VAO和VBO的生成和绑定

// Circle
std::vector<VertexFormat> vertices;

for (int i = 0; i < 360; i++)
{
    GLfloat angle = i * ((2.0f * 3.14159f) / 360);
    vertices.push_back(VertexFormat(glm::vec3(cos(angle) * 100.0f, sin(angle) * 100.0f, 0.0f)));
}

// Pipette object
std::vector<VertexFormat> pipetteVertices;
pipetteVertices.push_back(VertexFormat(glm::vec3(injPipette.x + 500.0f, injPipette.y + 500.0f, 0.0f))); // 0
pipetteVertices.push_back(VertexFormat(glm::vec3(injPipette.x + 700.0f, injPipette.y + 500.0f, 0.0f))); // 1
pipetteVertices.push_back(VertexFormat(glm::vec3(injPipette.x + 700.0f, injPipette.y + 700.0f, 0.0f))); // 2
pipetteVertices.push_back(VertexFormat(glm::vec3(injPipette.x + 500.0f, injPipette.y + 700.0f, 0.0f))); // 3
pipetteVertices.push_back(VertexFormat(glm::vec3(injPipette.x + 500.0f, injPipette.y + 500.0f, 0.0f)));
pipetteVertices.push_back(VertexFormat(glm::vec3(injPipette.x + 700.0f, injPipette.y + 700.0f, 0.0f)));

GLuint vao;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(VertexFormat) * 6, &pipetteVertices[0], GL_STATIC_DRAW);

//Position attribute
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(VertexFormat), (GLvoid *)0);

GLuint vao2;
glGenVertexArrays(1, &vao2);
glBindVertexArray(vao2);

GLuint vbo2;
glGenBuffers(1, &vbo2);
glBindBuffer(GL_ARRAY_BUFFER, vbo2);
glBufferData(GL_ARRAY_BUFFER, sizeof(VertexFormat) * 360, &vertices[0], GL_STATIC_DRAW);

//Position attribute
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(VertexFormat), (GLvoid *) 0);

glBindBuffer(GL_ARRAY_BUFFER, 0);

以及渲染循环中的绘制调用:

    //Get the uniform locations of model, view and projection matrices
    modelID = glGetUniformLocation(program, "model");
    viewID = glGetUniformLocation(program, "view");
    projectionID = glGetUniformLocation(program, "projection");

    //View transform
    glm::mat4 view = glm::lookAt(glm::vec3(0, 0, 2), glm::vec3(0, 0, 0), glm::vec3(0, 1, 0));
    //Projection transform
    //glm::mat4 projection = glm::perspective(45.0f, (GLfloat)screenWidth / (GLfloat)screenHeight, 0.1f, 1000.0f);
    glm::mat4 projection = glm::ortho(0.0f, (GLfloat)screenWidth, 0.0f,  (GLfloat)screenHeight, 0.1f, 10.0f);

    {
        glUniformMatrix4fv(viewID, 1, GL_FALSE, glm::value_ptr(view));
        glUniformMatrix4fv(projectionID, 1, GL_FALSE, glm::value_ptr(projection));

        glm::mat4 translate = glm::translate(glm::mat4(1.0), glm::vec3(100.0f + move_x, 100.0f + move_y, 0.0f));
        glm::mat4 rotate = glm::rotate(glm::mat4(1.0), 0.0f, glm::vec3(0.0f, 0.0f, 1.0f));
        glm::mat4 scale = glm::scale(glm::mat4(1.0), glm::vec3(1.0f, 1.0f, 2.0f));

        glm::mat4 model = translate * rotate * scale;
        glUniformMatrix4fv(modelID, 1, GL_FALSE, glm::value_ptr(model));

        glUniform4f(color, 0.0f, 0.0f, 1.0f, 1.0f);

        //Render
        glDrawArrays(GL_TRIANGLE_FAN, 0, 360);
    }

    {
        glUniformMatrix4fv(viewID, 1, GL_FALSE, glm::value_ptr(view));
        glUniformMatrix4fv(projectionID, 1, GL_FALSE, glm::value_ptr(projection));

        glm::mat4 translate = glm::translate(glm::mat4(1.0), glm::vec3(300.0f + injPipette.x, 300.0f + injPipette.y, 0.0f));
        glm::mat4 rotate = glm::rotate(glm::mat4(1.0), 0.0f, glm::vec3(0.0f, 0.0f, 1.0f));
        glm::mat4 scale = glm::scale(glm::mat4(1.0), glm::vec3(1.0f, 1.0f, 2.0f));

        glm::mat4 model = translate * rotate * scale;
        glUniformMatrix4fv(modelID, 1, GL_FALSE, glm::value_ptr(model));

        glUniform4f(color, 1.0f, 0.0f, 0.0f, 0.5f);

        //Render
        glDrawArrays(GL_TRIANGLES, 0, 6);
    }

我重复一遍,使用我已经完成的相同顶点绘制多个对象。我需要知道如何使用相同的顶点和片段着色器但顶点数量不同来绘制多个对象。该项目很小,最多只能渲染 10 个 2D 对象。


绘图命令如glDrawArrays https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glDrawArrays.xhtml处理并绘制当前绑定中指定的通用顶点属性数据的数组顶点数组对象 https://www.khronos.org/opengl/wiki/Vertex_Specification#Vertex_Array_Object.

这意味着您需要在执行 Draw 调用之前绑定正确的顶点数组对象:

// [...]

glBindVertexArray(vao2);
glDrawArrays(GL_TRIANGLE_FAN, 0, 360);
// [...]

glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLES, 0, 6); 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用多个VAO和VBO在OpenGL中绘制多个对象? 的相关文章

  • setContextProperty 和对象的 setProperty 之间的区别

    我现在真的很困惑 有什么区别 QQmlApplicationEngine engine engine rootContext setContextProperty myObject userData and object gt setPro
  • 将 Stream 反序列化为 List 或任何其他类型

    尝试将流反序列化为List
  • 在动态事件处理程序中引用“this”

    在我的 myClass 类中 我使用 Reflection Emit 为 myClass 类成员之一动态编写事件处理程序 我已经成功地做到了这一点 现在 我想修改事件处理程序以调用 myClass 类中的实例方法之一 但是 我无法弄清楚如何
  • 起订量要求?违背了目的?

    是否需要虚拟化您想要模拟的所有属性访问器就违背了模拟的目的 我的意思是 如果我必须修改我的对象并虚拟化我想要模拟的每个访问器 我难道不能继承我的类并自己模拟它吗 你的问题非常有效 但如果你仔细想想 没有其他方法可以模拟课程 如果你采用一个接
  • 如何使用 MVVM 更新 WPF 中编辑的数据? [复制]

    这个问题在这里已经有答案了 我正在为聊天应用程序构建 UI 设计 在尝试更新所选联系人的消息时遇到问题 选择现有联系人 选择编辑选项 然后编辑其属性 例如用户名和图像 后 唯一进行的更改是联系人的用户名和图像 我仍然想更改 MessageM
  • 使用 OpenGL 着色器进行数学计算 (C++)

    我有一个矩阵 例如 100x100 尺寸 我需要对每个元素进行计算 matrix i j tt 8 5例如 我有一个巨大的矩阵 我想使用 OpenGL 着色器来实现该算法 我想使用着色器 例如 uniform float val unifo
  • 访问“if”语句之外的变量

    我怎样才能使insuranceCost以外可用if陈述 if this comboBox5 Text Third Party Fire and Theft double insuranceCost 1 在 if 语句之外定义它 double
  • 找到的程序集的清单定义与程序集引用不匹配

    我试图在 C Windows 窗体应用程序 Visual Studio 2005 中运行一些单元测试 但出现以下错误 System IO FileLoadException 无法加载文件或程序集 实用程序 版本 1 2 0 200 文化 中
  • 存储过程上的 OdbcCommand - 输出参数上出现“未提供参数”错误

    我正在尝试执行存储过程 通过 ODBC 驱动程序针对 SQL Server 2005 但收到以下错误 过程或函数 GetNodeID 需要参数 ID 但未提供该参数 ID 是我的过程的 OUTPUT 参数 在存储过程中指定了一个输入 mac
  • 在 MATLAB 中创建共享库

    一位研究人员在 MATLAB 中创建了一个小型仿真 我们希望其他人也能使用它 我的计划是进行模拟 清理一些东西并将其变成一组函数 然后我打算将其编译成C库并使用SWIG https en wikipedia org wiki SWIG创建一
  • 您可以在一个 Windows Azure 实例上部署多个 Web 应用程序吗?

    是否可以在一个 windows azure 小型计算实例中运行一堆 Web 应用程序 我正在考虑使用 Azure 作为放置一堆处于开发和非生产状态的项目 Web 应用程序 的地方 有些实际上已经被封存了 但我想在某个地方有一个活跃的实例 我
  • 防止GDB中的PLT(过程链接表)断点

    在最新版本的 GDB 中 在库函数调用上设置断点会导致多个实际断点 调用过程链接表 PLT 实际的函数调用 这意味着当调用库函数时 我们每次都会经历两次中断 在以前的 GDB 版本中 只会创建 2 因此您只能得到一次中断 那么问题来了 是否
  • dropdownlist DataTextField 由属性组成?

    有没有一种方法可以通过 C 使 asp net 中的下拉列表的 datatextfield 属性由对象的多个属性组成 public class MyObject public int Id get set public string Nam
  • 在VisualStudio DTE中,如何获取ActiveDocument的内容?

    我正在 VisualStudio 中编写脚本 并尝试获取当前 ActiveDocument 的内容 这是我当前的解决方案 var visualStudio new API VisualStudio 2010 var vsDTE visual
  • 如何用 C 语言练习 Unix 编程?

    经过五年的专业 Java 以及较小程度上的 Python 编程并慢慢感觉到我的计算机科学教育逐渐消失 我决定要拓宽我的视野 对世界的一般用处 并做一些 对我来说 感觉更重要的事情就像我真的对机器有影响一样 我选择学习 C 和 Unix 编程
  • 错误左值需要作为赋值C++的左操作数

    整个程序基本上只允许用户移动光标 如果用户位于给定的坐标范围 2 2 内 则允许用户键入输入 我刚刚提供了一些我认为足以解决问题的代码 我不知道是什么导致了这个问题 你能解释一下为什么会发生吗 void goToXY int int 创建一
  • 不兼容的类型 - 是因为数组已经是指针吗?

    在下面的代码中 我创建一个基于书籍结构的对象 并让它保存多个 书籍 我设置的是一个数组 即定义 启动的对象 然而 每当我去测试我对指针的了解 实践有帮助 并尝试创建一个指向创建的对象的指针时 它都会给我错误 C Users Justin D
  • ASP.NET Core Razor Page 多路径路由

    我正在使用 ASP NET Core 2 0 Razor Pages 不是 MVC 构建系统 但在为页面添加多个路由时遇到问题 例如 所有页面都应该能够通过 abc com language 访问segment shop mypage 或
  • 从有符号字符转换为无符号字符然后再转换回来?

    我正在使用 JNI 并有一个 jbyte 类型的数组 其中 jbyte 表示为有符号字符 即范围从 128 到 127 jbyte 表示图像像素 对于图像处理 我们通常希望像素分量的范围为0到255 因此 我想将jbyte值转换为0到255
  • C# 粘贴到文本框时检查剪贴板中的字符

    有没有一些方法可以在粘贴到文本框 C 之前仅检查剪贴板中的字符 Ctrl V 和右键单击 gt 粘贴 但不使用 MaskedTextbox 在文本框文本更改中添加规则以仅接受数字 例如 private string value privat

随机推荐

  • 如何在 puppeteer 中传递实验性 chrome 选项

    我有一个用 python 编写的应用程序selenium https www selenium dev 其中设置了一些实验选项镀铬驱动程序 https chromedriver chromium org from selenium impo
  • FFmpeg - 将最大视频尺寸调整为 320

    我正在尝试使用 FFmpeg 动态更改通过 PHP 上传到服务器的视频的分辨率 IE 我想保留纵向或横向方向 如果 Y 高于 X 我想将 Y 更改为 320 将 X 更改为相应的值 反之亦然 我在调整大小本身方面没有遇到任何问题 实际上 这
  • Python 十六进制

    如何将十进制转换为以下格式的十六进制 至少两位数字 零填充 没有 0x 前缀 Input 255输出 ff Input 2输出 02 I tried hex int 2 但它似乎显示第一个示例 但不显示第二个示例 Use the forma
  • 在没有互联网连接的情况下离线运行 Maven 和 Sonatype Nexus

    我正在尝试使用 Nexus 设置 Maven 环境 以便 Maven 从本地 Nexus 存储库下载其工件 出于安全原因 安装 Maven 和 Nexus 的计算机没有互联网连接 我的工作站上有类似的配置 但具有互联网连接 我在两台机器上安
  • 无法使用“UIImagePickerController.InfoKey”类型的索引为“[String : Any]”类型的值添加下标

    我在用着Apple 的 Swift iOS 教程 https developer apple com library archive referencelibrary GettingStarted DevelopiOSAppsSwift W
  • 用于地理编码的 ArcGIS 自定义搜索输入

    在 JHipster 生成的 Angular 项目中 我想使用ArcGIS 地理编码 REST API https developers arcgis com labs rest search for an address 通过对结果进行预
  • 为什么枚举构造函数无法访问静态字段[重复]

    这个问题在这里已经有答案了 可能的重复 为什么枚举的构造函数不能访问静态字段 https stackoverflow com questions 443980 why cant enums constructor access static
  • 如何避免引用 DLL 的引用 DLL

    我有一个 ASP Net 项目 ProjA 和一个类库项目 LibB 我在库中创建了一个自定义类 ClassC 并添加了对现有 dll DllD 的引用 我在 ProjA 中选择了 添加引用 选项 并从 解决方案 选项卡中选择了 LibB
  • 如何在 Javascript 中处理 ActiveX 事件

    这在某种程度上是答案的后续here https stackoverflow com questions 26536 active x control javascript 我有一个自定义 ActiveX 控件 它引发一个事件 带有 msg
  • 后藤这个时候出乎意料了?

    我正在尝试制作一个连接四的小游戏 每当我按下 Enter 键而不在控制台中输入任何内容时 它都会说此时 goto 是意外的 如果没有用户输入 我希望它现在返回 X 任何帮助将不胜感激 X cls echo echo Connect Four
  • Wagtail 为 MyPage 设置附加权限

    这里是鹡鸰新手 我试图为特定模型添加一些额外的权限 但 wagtail admin 中没有显示任何内容 我可以用 django 方式做到这一点 但我的印象是 wagtail 可以处理这种类型的权限 我在 wagtail 文档中找不到任何提示
  • postgres 中的动态表分区

    例如 我正在寻找将 postgres 数据分区到基于时间戳的表中的方法 但无需手动添加相关子表 我看到这篇博文就是这样做的 https blog engineyard com 2013 scaling postgresql performa
  • 无法读取 null 的属性“样式”

    由于某种奇怪的原因 我收到了一个奇怪的错误 我有一个元素 用 PHP 定义 最终看起来像这样 span style display inline some html inputs and stuff span 我通过 Chrome 的 In
  • 使用 Protractor 访问 JS 范围元素/变量

    我有一个量角器测试 输入登录数据并单击登录按钮 我希望检查 Angular 变量的值 被单击元素的 ng click 是 doLogin 它在控制器文件中定义为 scope doLogin function console log logi
  • 在 MarkLogic 中处理禁运内容场景

    我有一个 MarkLogic 7 数据库 其中插入了多个文档 每个文档都有自己的created on and released on 举例来说 如果将文档插入到数据库中1400小时及其released on值为1700小时然后我需要将此文档
  • 无法单击打开文件附件对话框的按钮

    我在用着硒2 我正在尝试单击打开文件附件对话框的按钮 但是当我点击它时什么也没有发生
  • $q 承诺 - 对象不是函数

    我想运行承诺样本https docs angularjs org api ng service q https docs angularjs org api ng service 24q 这是我的代码 angular module test
  • 在所需文件夹中安装 python 包

    我已经下载了一个 python 包安装在我的 ubuntu 机器上 该包已经有一个 setup py 文件可供使用 但我想将默认的 python 安装地址更改为其他地址 专门用于该包 并且不是很好 所以我尝试的是 首先在终端中 我导出新文件
  • RabbitMQ 更改生产系统上的队列参数

    我在面向服务的架构中使用 RabbitMQ 作为消息队列 其中许多单独的 Web 服务发布绑定到 RabbitMQ 队列的消息 这些队列依次被不同的消费者订阅 这些消费者执行后台工作 RabbitMQ 的一个非常普通的用例 现在我想更改一些
  • 如何使用多个VAO和VBO在OpenGL中绘制多个对象?

    我正在尝试使用多个 VAO 和 VBO 在 OpenGL 中渲染多个对象 要使用相同的顶点渲染多个对象 我已经做到了 但我想做的是为每个对象使用不同的顶点 例如绘制一个正方形和一个圆形 对于正方形 我只需要 6 个顶点 但对于圆形 我需要