gpt4 book ai didi

android - 动态添加 Opengl 形状

转载 作者:塔克拉玛干 更新时间:2023-11-02 18:55:40 26 4
gpt4 key购买 nike

我正在按照本教程将 Opengl 添加到我的 Android 应用程序中。 https://www3.ntu.edu.sg/home/ehchua/programming/android/Android_3D.html .在所有示例中,形状都是在 MyGLRenderer 构造函数中创建的,但我想知道如何在创建渲染器后动态添加 Opengl 形状。如何才能做到这一点?

最佳答案

您创建一个名为 Shape 的接口(interface)或类。这将包含渲染 3D 形状所需的数据(顶点、索引、颜色数据等)。或者,用于渲染的 VAO/VBO/纹理 ID/其他 ID。
使用类的优点是您可以初始化方法并将所有内容保存在单个类中,同时保持扩展它和创建更多类(Cube、Pyramid、Model 等)以自定义对象的能力。或者只是使用加载了不同数据的不同实例。这里有很多方法可以做同样的事情。
您可以在渲染器初始化后添加更多数据,但通过存储您的数据,您可以在以后重用它。假设原始模型数据以可以重用的方式存储(为了您的目的,要清楚。所有数据都可以重用,但如果您不能将其应用于您的用例,则重用毫无意义),您 can apply matrices 到获取同一对象的不同位置和“实例”。关键是,您可以随时创建新的形状; OpenGL 不关心是在渲染器初始化时还是事后一段时间,只要在您尝试使用它时所有数据都已就位。
创建类及其相关实例后,创建一个新列表或映射:

public List<Shape> shapes = new ArrayList<>();
//add whatever shapes you want. Create them at runtime (generate)
// or keep them static. It is up to you
在您创建的这个类中,您还可以实现一个渲染方法。在那里你绘制对象。使用类的一个优点是您可以将绘图添加到这个类中。如果在类中没有定义特定的绘制方法,则必须在主渲染方法中手动绘制每个对象。

就我个人而言,我将原始模型数据(即顶点、UV 坐标等)分离在一个类中,该类来源于抽象树。对于纹理模型,我目前有一个 Renderable Entity(其中 Renderable 是一个包含 draw(Shader) 函数的接口(interface) - 基本上是从 Shape 开始的一个抽象级别)。 Entity 包含一个 TexturedModel ,其中包含一个 Texture 和一个 ModelModel 包含原始数据,Texture 包含相关纹理(因为它必须在渲染之前应用)。
可能有比这更有效的设计选项,但有很多方法可以抽象对象渲染。就像我提到的,OpenGL 不关心你何时初始化你的数据,只要你不希望它渲染你还没有给出的数据。将你的模型、形状或任何你想渲染的东西抽象到类中意味着你有一个单一的、可管理的、
可渲染单元。您也可以即时添加更多内容——这一点也已被每一个场景或场景中角色/实体不断变化的游戏所证明。
要将其连接回您提供的链接,您已经有两个类。如果添加父类(super class)并添加单个列表,则可以渲染任意数量的列表。通过使用矩阵( C++/general OpenGLAndroid ),您可以在不同的位置绘制它们,如果这就是您添加更多的意思。
严格来说,有了链接中的代码,你甚至不需要担心可重用性。您需要矩阵才能在不同位置获得多个单一形状。如果你想要不同的颜色,你也可以使用统一变量,但这是你没有问过的不同的蠕虫(又名这是读者的练习;统一是着色器的关键部分,你必须学习无论如何,他们在某个时候)。

在这种情况下,您所说的“动态”是什么意思有些不清楚。如果您只是想要更多带有手动生成数据的对象,并且只是随机添加任何对象,那么 Shape 类/接口(interface)就是您要走的路。
如果需要动态位置,则需要着色器中的矩阵。
如果你想要一个预制的抽象树,老实说,没有。您必须根据您的项目需要制作一个。在只有几个简单几何形状的情况下, Shape 类是有意义的,可能与上一行的建议结合使用。当谈到在 OpenGL 中渲染对象时,委婉地说,有很多方法可以到达罗马,这取决于您需要什么以及您打算渲染什么。
如果此答案不直接适用于您的情况(您是 OP,还是您,偶然发现此问题的随机读者),我不建议进行足够高的试验。当你离开教程和/或书籍和/或类(class)的世界,进入你自己的项目世界时,有效的东西会有很大的不同。尽管如此,这个答案的关键要点( TL;DR ):
  • 抽象到一个类或接口(interface),它描述了你想要渲染的任何东西的最小单位;无论是 RenderableShapeModel3D 还是完全不同的东西,都完全取决于您正在制作的内容
  • 在这种情况下,继承和实例重用是您的 friend
  • 如果需要,可以在渲染器启动后创建其他模型; OpenGL 不关心数据的来源,只要您在尝试使用它之前获取它。
  • 使用着色器和统一值和矩阵可以轻松地对模型数据(例如位置或颜色)进行动态更改。不要忘记:如果您使用 VBO,您可以重用相同的模型,并具有不同的位置或其他属性,并通过统一变量等方式改变模型的呈现方式。

  • 进一步阅读/观看
  • ThinMatrix' series(LWJGL,但解释了很多理论)
  • opengl-tutorial.org(C++,一些 API 匹配,但 OpenGL 和 OpenGL ES 不同 - 主要推荐理论位而不是代码位)
  • Android developer documentation(涵盖 Android 上的实现以及理论)
  • LWJGL GitBook(同样是 LWJGL,但也包含了大量推广到 OpenGL ES 的理论)
  • docs.gl - OpenGL ES 2 和 3 以及 OpenGL 2-4 的 API 文档
  • 关于android - 动态添加 Opengl 形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43710907/

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