gpt4 book ai didi

ios - OpenGL 批处理和实例唯一性

转载 作者:行者123 更新时间:2023-11-28 20:37:43 30 4
gpt4 key购买 nike

我一直致力于通过引入批处理来提高我的 OpenGL ES 2.0 渲染性能;特别是创建一个 RenderBatch,在创建时指定纹理和着色器(目前)。这将状态设置为 VAO 以允许廉价的状态切换。我开始实现看起来像这样:

batch = RenderBatch.new "SpriteSheet" "FlatShader"
batch.begin GL_TRIANGLE_STRIP
batch.addGeometry Geometry.newFromFile "Billboard"
batch.end

batch.render renderEngine

但后来我突然想到:我的 Billboard 文件包含顶点,这些顶点旨在针对特定实例使用进行缩放和平移。所以我在 addGeometry 调用中添加了一个转换参数。

batch.addGeometry(Geometry.newFromFile("Billboard"), myObject.transform)

这解决了缩放、平移和旋转顶点的问题,但它是通过首先查找顶点信息,通过变换矩阵对其进行变换,然后将其插入到批处理数据中来实现的。虽然这行得通,但效率似乎很低;它是 CPU 密集型的,没有利用 GPU 的转换能力。但是,它有效,所以没什么大不了的。 (虽然有更好的方法来做到这一点会很好)

但是,我遇到了一个障碍:每个实例的纹理坐标可能也需要不同,这意味着我必须传入一个纹理转换矩阵,现在这感觉很麻烦。

有没有一种更简单的方法可以使用着色器处理这种对现有数据的转换,该着色器不限制给定的几何/模型,并且可以轻松扩展以使用法线贴图、UV 贴图和其他奇特的技巧?谢谢!

最佳答案

在我看来,您所说的是着色器 uniforms。通常,您会在 VBO 和 VAO 中为每个批处理设置顶点数据和属性。然后,在您的渲染方法中,切换到正确的 VAO 并设置着色器制服。这些通常包括一个模型- View -投影矩阵,用于将顶点转换为剪辑空间,这必然会改变几乎每一帧、要使用的正确纹理等。

这是高效的,因为不变的顶点数据保存在 GPU 内存中,VAO 负责廉价的状态切换,并且每次渲染调用时只有通常经常变化的制服被发送到 GPU。

如果您正在批处理需要单独模型 View 投影矩阵的多个对象,那么您有几个选择:

  1. 您必须为需要单独模型 View 投影矩阵的每个批处理执行单独的绘制调用

  2. 使用模型 View 投影矩阵数组作为统一,并为每个对象提供一个属性,提供正确的投影矩阵索引以供使用

  3. 您必须使用 CPU 转换顶点并使用更新后的数据重新填充 VBO

第一种方法是首选方案,它会高效且简单。渲染大量绘制调用的缓慢部分通常是将数据从 CPU 获取到 GPU,如果您已经在 VBO 中拥有顶点数据,那么每个对象的绘制调用开销不会有什么大不了的。这也解决了如何根据对象属性为每个对象提供不同制服的问题。在每个对象渲染方法中,相关属性在进行绘制调用之前设置为制服。如果每个对象都需要将不同的数据发送到 GPU,那么这还能如何工作?

关于ios - OpenGL 批处理和实例唯一性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9794870/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com