在android上的opengles 2.0中绘制精灵的最快方法

2023-12-11

所以我试图弄清楚如何多次绘制单个纹理四边形。我的问题是,由于它们被创建和删除,并且它们中的每一个都有独特的位置和旋转。我不确定 vbo 是最好的解决方案,因为我听说在 android 上修改缓冲区非常慢,而且似乎我需要每帧创建一个新的缓冲区,因为不同的四边形可能会随机消失(与敌人碰撞)。如果我只是对每一个进行绘制调用,我会得到 100 左右的 20fps,这是无法使用的。有什么建议吗?

编辑:我正在尝试创建一个弹幕,但弄清楚如何绘制 500 多个东西让我很头疼。


我认为你正在寻找粒子系统。类似的问题在这里:在 OpenGL ES 1.1 中快速绘制许多纹理粒子.

使用点精灵相当便宜,但你必须在片段着色器中做额外的工作,我不确定 GLES2 是否支持gl_PointSize如果您需要不同尺寸的颗粒。gl_PointSize 对应世界空间大小

我的首选粒子系统将位置存储在双缓冲纹理中,然后使用单个绘制调用和静态四边形数组进行绘制。This是相关的,但我会在这里详细描述一下......

  1. 创建一个纹理(如果可以的话,使用浮点,但这可能会限制支持的设备)。每个像素保存粒子位置,也许还保存旋转信息。
  2. [编辑] 如果您需要对粒子进行动画处理,则需要更改每帧纹理中的值。为了提高速度,让 GPU 在着色器中完成它。使用 FBO,绘制全屏多边形并更新片段着色器中的值。问题是您无法读取和写入相同的纹理(或不应该)。常见的方法是在读取第一个纹理时创建第二个纹理来渲染,然后在它们之间进行乒乓操作,从而对纹理进行双缓冲。
  3. 创建一个用于绘制三角形的 VBO。位置全部相同,填充 -1 到 1 四边形。然而,使每个四边形的纹理坐标地址为上述纹理中的正确像素。
  4. 绘制VBO,绑定你的位置纹理。在顶点着色器中,读取给定顶点纹理坐标的位置。将 -1 到 1 顶点位置缩放到正确的大小,应用该位置和任何旋转。使用原始的 -1 到 1 位置作为纹理坐标传递给片段着色器以添加任何常规颜色纹理。

    如果您有 GLSL 版本gl_Vertex,我非常喜欢在顶点着色器中生成这些坐标,节省存储不必要的琐碎数据只是为了绘制简单的对象。例如这个.

  5. 要生成粒子,请使用glTexSubImage2D并将一块粒子写入位置纹理中。如果您开始存储更多粒子属性,您可能需要一些纹理。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在android上的opengles 2.0中绘制精灵的最快方法 的相关文章

随机推荐

  • 通过场景名称调用另一个功能文件中的场景

    您好 我有以下功能文件 结账功能 Scenario checkout items in basket call read classpath login feature call by scenario name Given path ch
  • 包装托管代码以供非托管使用

    我们有一个大型 C 项目 它被编译为本机非托管代码 我们需要使用托管代码中的功能 但我们不想在 clr 中编译整个项目 所以我制作了一个 DLL 有一个名为 B 的引用类 该类在导出的本机类 A 中公开 问题是我得到一个 C1190 由于包
  • 是否可以在 Google Apps 脚本中以编程方式访问单元格编辑历史记录? [复制]

    这个问题在这里已经有答案了 已安装 onEdit 触发器和 onChange 触发器 我记录传入的事件对象的内容 如下所示 function installedOnChange e var me CalleeName arguments L
  • MARS MIPS 模拟器的内置汇编器比要求的对齐程度更高?

    我有以下数据段 data a byte 0x11 align 1 b word 0x22334455 假设地址 a 为 0x10010000 则 b 处字的预期地址为 0x10010002 但 MARS 将字存储在 0x10010004 忽
  • 如何对速记 git status 的输出进行排序?

    我想对输出进行排序git status short branch 以便 索引中的文件显示在底部 在工作树中修改但不在索引中修改的文件出现在其上方 顶部未跟踪的更改 如果这需要管道到其他命令来对输出中的行进行排序 那么保留 Git 配置的输出
  • Hibernate:如果没有活动事务,createQuery 无效

    我的 Spring Hibernate 项目有一些问题 当我尝试获取数据时 我有 HTTP Status 500 请求处理失败 嵌套异常是 org hibernate HibernateException createQuery 在没有活动
  • EmbedScriptFromFile 和 RunScriptFromFile - QTP/UFT

    请帮助我使用EmbedScriptFromFile RunScriptFromFile用于在QTP UFT中执行JS文件 我正在尝试使用 JS 文件获取 N 个值 并在数组中的 QTP UFT 中接收相同的值 为此 我必须了解EmbedSc
  • 解析数学表达式

    给定一个包含数学表达式的字符串 一组函数 命令以及一组分配的变量 NET 是否提供了快速构建解析器的工具 我想构建一个简单的解析器来分析表达式并将其分解为最简单的组件 例如 d abs a b sqrt c becomes f abs a
  • Infinispan JPA 二级缓存默认值

    我正在尝试将 Infinispan 配置为休眠二级缓存 一切都很好 但我想调整默认配置 即所有缓存共享的值 会自动为带有注释的实体创建缓存 Cache 我可以在其中一一定制infinispan xml by
  • 如果我在 ReactJS 或 React Native 类的构造函数中使用 setState() 函数,会发生什么?

    出于好奇 我只是想知道如果我使用会发生什么setState React Native 或 ReactJS 中类的构造函数中的函数 例如 constructor props super props this setState title ne
  • 使用向量中的元素的 R grep 正则表达式(FOLLOW UP)

    跟进这个问题 我还有另一个例子 我无法使用已接受的答案 再说一次 我想找到每一个确切的group中的元素lab向量 labs lt c Beijing T0 BC 89 CN Beijing T24 BC 89 CN Beijing T0
  • 将 jQuery 自动完成应用于克隆元素

    我在用jQuery 自动完成它适用于现有元素 但不适用于动态添加的元素 这是我的自动完成代码 我做了一些更改 function function widget ui combobox create function var self thi
  • 为什么我不能直接引用 document.createElement?

    当创建大量 DOM 元素时 document createElement 和类似的方法可能会添加大量字节并且变得丑陋 我知道我可以制作自己的子例程 或者使用innerHTML 或其他什么 但为什么我不能这样做 var c document
  • Windows 关闭时的 Java 关闭钩子调用

    我遇到一种情况 当用户向操作系统 在我的情况下只有 Windows 发出关闭信号时 我想执行某些任务 我尝试过使用java shutdown hooks 我面临的问题是 当我使用退出程序时System exit 0 关闭挂钩被调用 但当我直
  • 如何从R中的文件读取逻辑数据

    我生成了一个文件 其中每行都包含一个 TRUE 或 FALSE 逻辑值 现在我想将文件中的逻辑数据读入R 但是读入的数据是 字符 模式而不是逻辑值 我想知道如何从文件中读取数据作为逻辑值 我的 R 代码是 cat FALSE n file
  • C++ 顺时针排序 2D 点

    i wrote a program to arrange points on a graph in clockwise manner from 12 o clock such that a vector containing these p
  • 创建一个 titleize 方法,排除“小词”。

    我正在制作一种方法来大写我的输入 除了 a an 和 等任何单词 def titleize string to titleize string to titleize split map words words capitalize joi
  • 为什么允许这些默认参数?

    我发现了this问题 我完全困惑了 答案说b无效 非静态成员不能用作默认参数 这是完全有道理的 我不明白的是为什么另外两个没问题 事实上 如果默认值不是常量表达式 我正在努力理解语义是什么 这里发生了什么 默认参数在编译时明确评估 编译器只
  • 函数体存放在系统目录的什么位置?

    我正在尝试为我的数据库构建一个文档系统 我想包含我的函数和触发器的来源 我设法找到了函数和触发器的所有元数据 但是这些函数和触发器的实际主体存储在哪里 使用功能pg get functiondef 获取完整的函数定义 SELECT pg g
  • 在android上的opengles 2.0中绘制精灵的最快方法

    所以我试图弄清楚如何多次绘制单个纹理四边形 我的问题是 由于它们被创建和删除 并且它们中的每一个都有独特的位置和旋转 我不确定 vbo 是最好的解决方案 因为我听说在 android 上修改缓冲区非常慢 而且似乎我需要每帧创建一个新的缓冲区