Libgdx 如何在3d模型中设置纹理动画?

Libgdx 如何在3d模型中设置纹理动画?,libgdx,textures,bytebuffer,Libgdx,Textures,Bytebuffer,我希望在我的LibGDX代码中有一个动画3d纹理,但我正在努力找到如何做到这一点 我认为这“应该”是如何做到的: a) 直接访问和修改模型上的纹理。(通过pixmap?ByteBuffer?) 或 b) 预渲染包含所有帧(例如20帧)的大图像,然后移动UV坐标以创建动画的错觉。(类似于2d/webdesign中的ImageStrips) 我确实想办法每次都完全替换材料,但这似乎是一种更糟糕的方法。因此,如果有人能显示我需要执行a)或b)(或类似的优化方法)的命令,我会非常高兴。 我对数学很在行。

我希望在我的LibGDX代码中有一个动画3d纹理,但我正在努力找到如何做到这一点

我认为这“应该”是如何做到的:

a) 直接访问和修改模型上的纹理。(通过pixmap?ByteBuffer?)

b) 预渲染包含所有帧(例如20帧)的大图像,然后移动UV坐标以创建动画的错觉。(类似于2d/webdesign中的ImageStrips)

我确实想办法每次都完全替换材料,但这似乎是一种更糟糕的方法。因此,如果有人能显示我需要执行a)或b)(或类似的优化方法)的命令,我会非常高兴。 我对数学很在行。OpenGLES或GDX的复杂性我不是:)


(该解决方案至少可以在HTML/Android编译环境下运行,理想情况下是所有内容)

如果您有足够的内存,我会选择b),在处理器上更容易。此外,您将只更改制服的值。但是,由于预处理,打开应用程序可能需要一些时间

获取统一变量,在这里编译着色器,animationPos应该是全局的

Gluint animationPos = glGetUniformLocation(shaderProgram, "nameoftheuniform");
主循环应将animationPos值传递给着色器:

Gluniform1i ( animationPos, curentAnimationIndex);
将此选项添加到片段着色器变量中:

uniform int animationPos;
片段着色器主:

float texCoordY = texCoord.y; //texture coordinates should be passed from vertex shader
float texCoordX = texCoord.x/20.0f; //we are dividing it with 20 since it is the amount of textures that we have and if we use it directly it would try to use all the texture. Whereas the texture stores at 20 different textures.

float textureIndex = 1.0f*animationPos/20.0f; //Pointer to the start of the animation texture.
gl_fragColor = texture2D ( yourTexture, vec2( textureIndex + texCoordX, texCoordY));
上面的代码假设您在x方向上展开了纹理,您也可以尝试将其像矩阵一样展开,然后您需要更改texCoord计算部分。另外,我们使用了20种纹理

选项a)在处理器上更为繁重,您每次都会更改纹理,因此它将更多地使用pci,但在内存上更容易。这个问题更像是一个设计决策,但我想20张图片可以处理,所以选择b)


编辑:添加代码。

自最新版本以来,在3d曲面上播放2d动画非常容易。首先确保熟悉2d动画的概念,如下所述:。然后,您可以使用
TextureRegion
(该
动画#getKeyFrame
返回)来设置曲面的材质,而不是使用spritebatch,如下所示:。因此,基本上您可以使用渲染方法:

attribute.set(animation.getKeyFrame(stateTime, true));
或者,如果您想要更通用的方法:

instance.getMaterial("<name of material>").get(TextureAttribute.class, TextureAttribute.Diffuse).set(animation.getKeyFrame(stateTime, true));

你指的是1.4.1?或者是晚上什么的?该方法看起来确实很简单,但我似乎没有在TextureAttribute.TextureAttribute属性=instance3.materials.get(0.get)(TextureAttribute.class,TextureAttribute.Diffuse)上使用“Set”方法;“attribute”将没有“set”方法。最新版本是1.4.1,其中存在TextureAttribute#set(TextureRegion)。看:啊,那我还没更新好。就像我想的那样。我的.gradle文件显示“gdxVersion='1.4.1'”,但可能是其他地方出了问题。Libgdxdidnt refresh Graddle>_
instance.materials.get(0).get(TextureAttribute.class, TextureAttribute.Diffuse).set(animation.getKeyFrame(stateTime, true));