Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android上使用OpenGL ES 2.0对多个实体进行纹理处理_Android_Entity Framework_Opengl Es_Textures - Fatal编程技术网

在Android上使用OpenGL ES 2.0对多个实体进行纹理处理

在Android上使用OpenGL ES 2.0对多个实体进行纹理处理,android,entity-framework,opengl-es,textures,Android,Entity Framework,Opengl Es,Textures,我需要解释一下如何将纹理应用于不同的实体。我的理解是一次只能有一个绑定纹理。因此,如果有许多实体都使用不同的纹理,那么如何将纹理应用于实体,渲染实体,然后绑定下一个实体以应用于下一个实体 我想我对将纹理应用于实体并使用正确的纹理渲染它的时机感到困惑。我计划使用纹理地图集为类似的精灵和动画和东西。但我不知道如何在渲染之前将纹理或纹理的一部分(纹理图集)保存到实体中,以便继续将下一个纹理应用到其他实体 类似地,如果我加载了一个纹理图集并使用它来制作一个实体的动画,但也需要另一个实体来制作动画,即使用

我需要解释一下如何将纹理应用于不同的实体。我的理解是一次只能有一个绑定纹理。因此,如果有许多实体都使用不同的纹理,那么如何将纹理应用于实体,渲染实体,然后绑定下一个实体以应用于下一个实体

我想我对将纹理应用于实体并使用正确的纹理渲染它的时机感到困惑。我计划使用纹理地图集为类似的精灵和动画和东西。但我不知道如何在渲染之前将纹理或纹理的一部分(纹理图集)保存到实体中,以便继续将下一个纹理应用到其他实体

类似地,如果我加载了一个纹理图集并使用它来制作一个实体的动画,但也需要另一个实体来制作动画,即使用不同的纹理图集,那么我是否需要让游戏加载另一个图集并应用它来实现另一个动画


我熟悉OpenGLES2.0API。我只需要如何应用它的帮助。

如果我理解正确,您正在寻找一个好的应用程序结构,使用atlas纹理实现精灵动画。我知道有很多好的方法可以做到这一点,所以我将尝试只解释一种

最好在一些控制纹理和模型的类中处理您的情况

在底部,您应该创建一个处理纹理的类,它包含一个纹理ID,如果它是从文件加载的,则应该包含一个文件名(或一些自定义ID)。此类应包含的公共内容包括:

  • 所需构造函数:大小(FBO)、名称(来自文件)
  • 绑定(绑定纹理)
  • 纹理大小
  • 纹理上的图像大小(在将非盆栽图像应用于盆栽纹理时)
  • 显式清理(删除纹理)
在这之后,因为您正在谈论动画,它建议您有一个包含多个子图像的图像(例如,一个行走角色)。最好将纹理类子类化,使其包含获取特定帧坐标时的所有附加方法

如果级别更高,则需要一个表示纹理池的类。此类将缓存纹理,以便可以重用它们。它应该具有当前加载的所有纹理类的数组,并具有以下方法:

  • 名为的纹理(从缓存返回具有特定名称的纹理,或使用此名称创建新的纹理类并将其存储)
  • 显式清理(只需删除所有纹理并清空缓存)
然后生成一个模型类,其中包含需要绘制的所有数据。它要么具有顶点缓冲区ID,要么可以动态生成所有顶点数据。除此之外,它还包含从纹理池类获取的纹理(链接)。在这一点上,绘制此模型基本上有两种方法。一种是用你的主要绘画方法来完成这一切,我不鼓励这种方法,但很快就可以做到。另一个是在模型类上实现一个方法,如“使用着色器绘制”中所述,将自定义着色器类传递给该类,并且模型本身包含绘制自身的代码。其管道类似于:

  • 绑定链接纹理
  • 从纹理(或atlas子类)获取并绑定纹理坐标
  • 从模型中获取并绑定位置坐标
  • 对着色器执行所需的任何其他设置
通过这种方式,您将对正在发生的事情拥有最终控制权,并且您可以在很大程度上优化系统。例如,当您在要绘制的模型中进行迭代时,您可能会按纹理对其进行排序,从而丢失不必要的绑定纹理切换,您可能会创建一个较大的顶点缓冲区以在单个调用中刷新它们,您可以自动检查是否不再需要特定纹理

除此之外,这种方法在应用程序上的内存占用最小,直到纹理数据消失为止。就模型本身而言,它们的资源很少,例如,每个模型都包含一些具有4个浮动值的帧结构和指向池中纹理的指针


我希望这个解释能对您有所帮助。

非常感谢您的回复。在发布我的原始帖子后,我尝试了一种方法,但没有成功。我一次只能画一个物体。你的回答应该让我朝着正确的方向前进。再次感谢!我正在尝试应用您的建议,但我在找出如何创建纹理类时遇到了困难。是否有一种获取纹理/图像大小的方法?这取决于您使用的是什么。如果使用某种库加载纹理,则应在该库中搜索这些值。如果没有,并且您正在将原始数据推送到GPU,那么这些值将在glTexImage2D和GLTEXISubImage2D中使用。