Articles of spritebatch

Libgdx精灵旋转(图像质量)

这一个可能很简单,但我没有find一个解决scheme。 我正在试图用libgdx创建一个widget(速度计)。 对于我正在使用setRotation()函数的箭头。 但是当图像旋转时,质量下降。 结果如下所示: 我怎样才能提高箭的质量?

SDL2雪碧批量和纹理地图集

我一直使用C ++编写2D游戏,使用SDL2graphicsAPI进行渲染。 目前我的游戏概念的特点是可能导致成千上万的精灵同时被画到屏幕上。 如果需要,我想知道如何提高渲染效率,最好只使用SDL2 API。 我之前已经简要介绍了基于OpenGL的2D渲染,并注意到SDL2缺less类似的命令 int SDL_RenderCopyMulti(SDL_Renderer* renderer, SDL_Texture* texture, const SDL_Rect* srcrects, SDL_Rect* dstrects, int count) 这将允许SDL受益于用于高效2Dgraphics的两种常用技术: 纹理批量:使用所使用的纹理对精灵进行sorting,然后同时渲染尽可能多的使用相同纹理的精灵,只改变纹理上的源区域和精灵之间渲染目标上的目标区域。 这允许将整个操作封装在单个GPU命令中,从而减less了来自多个不同调用的急剧的开销。 纹理图集:不是为每个精灵的每个animation的每个帧创建一个纹理,而是将多个animation甚至多个精灵组合成一个大的纹理。 这减less了在精灵之间切换时更改当前纹理的影响,因为正确的纹理通常可以在之前的绘制调用中使用。 此外,GPU对于处理大型纹理进行了优化,与通常用于精灵的许多微小纹理形成鲜明对比。 我的问题:由于自动video驱动程序的优化,SDL2是否能够从任何基本的精灵分类或将多个图像合并为一个纹理中获得更快的速度? 如果将来遇到与二维渲染相关的性能问题,我是否会被迫切换到OpenGL以便在GPU上进行较低级别的控制? 编辑:有没有计划在不久的将来包括这样的function?

SpriteBatch.Begin()使我的模型不能正确渲染

我试图用DrawString输出一些debugging信息,当我注意到我的模型突然被渲染像是从内到外(如剔除已禁用或某事),纹理贴图未应用 我注释了DrawString方法,直到我只有SpriteBatch.Begin()和.End(),这足以导致模型渲染损坏 – 当我评论这些调用模型正确渲染 这可能是什么症状? 我已经把它分解到最简单的代码来隔离问题,这就是我注意到的。 在下面画代码(尽可能简化) GraphicsDevice.Clear(Color.LightGray); foreach (ModelMesh mesh in TIEAdvanced.Meshes) { foreach (Effect effect in mesh.Effects) { if (effect is BasicEffect) ((BasicEffect)effect).EnableDefaultLighting(); effect.CurrentTechnique.Passes[0].Apply(); } } spriteBatch.Begin(); spriteBatch.DrawString(spriteFont, "Camera Position: " + cameraPosition.ToString(), new Vector2(10, 10), Color.Blue); spriteBatch.End(); GraphicsDevice.DepthStencilState = DepthStencilState.Default; TIEAdvanced.Draw(Matrix.CreateScale(0.025f), viewMatrix, projectionMatrix);

在OpenGL中进行Sprite批处理

我已经有了一个基于JAVA的游戏,OpenGL渲染前端每帧都会画出大量的精灵(testing期间它在700处达到峰值)。 现在这个游戏完全没有优化。 没有空间分区(所以即使不在屏幕上也会绘制一个精灵),每个精灵都是这样分开绘制的: graphics.glPushMatrix(); { graphics.glTranslated(x, y, 0.0); graphics.glRotated(degrees, 0, 0, 1); graphics.glBegin(GL2.GL_QUADS); graphics.glTexCoord2f (1.0f, 0.0f); graphics.glVertex2d(half_size , half_size); // upper right // same for upper left, lower left, lower right graphics.glEnd(); } graphics.glPopMatrix(); 目前游戏运行在+ -25FPS,并受CPU限制。 我想通过添加空间分区(我知道该怎么做)和精灵批量来提高性能。 不画屏幕上的精灵将会有很大帮助,但是由于玩家可以放大缩小,所以不会有足够的帮助,因此需要进行批量处理。 然而,OpenGL中的精灵分批对我来说有点神秘。 我通常和XNA一起工作,在这里有几个类来完成这个任务。但是在OpenGL中,我不知道该怎么做。 至于进一步的优化,我正在做的一些有趣的特点的游戏。 很多精灵都具有相同的纹理,所有的精灵都是方形的。 也许这些特征将有助于确定高效的配料技术?

为什么在试图用libgdx绘制精灵的时候会得到这个文件加载exception?

我在libgdx教程的“绘图图像”部分遇到问题。 我完全建立了文件,我input的代码如下: public class Game implements ApplicationListener { public static final String LOG = Game.class.getSimpleName(); private FPSLogger fpsLogger; private SpriteBatch batch; private Texture texture; private Sprite sprite; private TextureRegion region; //removed irrelevant code for this question… @Override public void render() { texture = new Texture(Gdx.files.internal("android.png")); region = new TextureRegion(texture, 20, 20, 50, 50); sprite = […]

如何使用spritebatch的旋转和缩放参数实现类似3D的效果

我正在开发一个类似于魔法秘密和2D最终幻想游戏的自上而下的2D游戏,其中一个很大的区别就是它是一个使用三维物理引擎的动作RPG。 当我瞄准远程武器时,我正在试图在我的角色脚上绘制一个瞄准器graphics(基本上是一个箭头)。 起初我只是将角色的目标vector转换为弧度,并将其传递给spritebatch,但是出现了问题。 当我的世界中的每一个对象的位置被绘制到屏幕上时,都会被放大。 所以如果物理引擎坐标是(1,0,1),屏幕坐标实际上是(1,.707) – Y轴和Z轴以0.707的透视因子缩放,然后加在一起得到屏幕坐标。 这意味着瞄准器graphics指向的方向(归功于它的旋转值传递给spritebatch)与弹丸实际随时间移动的方向不匹配。 当角色向左,向右,向上或向下发射时,情况看起来很好,但是如果在对角线上发射,物理引擎的视角与简单化的方式不匹配,我将角色的目标方向转换为屏幕旋转。 好吧,快进到现在:我已经把瞄准器的旋转与射弹实际上要做的path相匹配,我正在通过分解一个变换matrix来完成这个matrix,我从两个旋转matrix(一个代表瞄准器的旋转,一个代表相机在x轴上旋转45度)。 我的问题是,有没有办法从一系列matrix转换中获得旋转,还有一个Vector2的缩放比例,这个缩放比例会让3D看起来像一个3d对象,被视角扭曲了? 正确的角度来看是我要去的,我想。 所以,瞄准器箭头朝向侧面会变长,而朝向南面则会因为视角而缩短。 与此同时,面对南北方向会变宽,向左或向右方向变宽。 我想避免实际上在3D中绘制瞄准纹理,因为我仍然在我的项目中使用spritebatch的layerdepth参数,我不想要弄清楚如何在深度sorting中绘制3D对象系统我已经有了。 如果这个问题太模糊,我可以提供代码和更多的细节…这是我第一次在堆栈交换。 非常感谢您的阅读! 注意:(我认为)我意识到它不可能是一个技术上正确的3D透视图,因为spritebatch的vector2缩放参数不允许对象以实际的方式倾斜。 我真正感兴趣的是,是否有一个很好的方法来伪造效果呢,还是应该放弃它,而不是缩放呢? 编辑澄清没有图片的帮助(显然我不能发布他们): 我想让瞄准器的箭头看起来像在地面上画在角色的脚上,所以它应该看起来像是在地平面(在我的情况下是XZ平面)上画的,它应该以45度的角度倾斜X轴)。 亚历克斯

在libgdx中重复纹理

如何用重复的纹理填充区域? 现在我正在使用下一个方法: spriteBatch.begin(); final int tWidth = texture.getWidth(); final int tHeight = texture.getHeight(); for (int i = 0; i < regionWidth / tWidth; i++) { for (int k = 0; k < regionHeight / tHeight; k++) { spriteBatch.draw(texture, i*tWidth, k); } } spriteBatch.end(); 这是非常明显的。 也许有没有内置的方法?

“精灵配料”的技术定义是什么?

平台和语言在agnostically,如何定义精灵批处理? 看起来好像有很多不同的技术可以减less绘图时的工作量,而且往往是“批量”的。 我觉得可能没有真正的答案,但也许这里有人find了我没有的东西。

XNA的SpriteBatch究竟如何工作?

更确切地说,如果我需要从另一个API(例如OpenGL)重新创建这个function,那么它需要做些什么? 我对一些步骤有一个总体的了解,例如如何准备一个正交投影matrix,并为每个绘制调用创建一个四边形。 然而,我不太熟悉批处理过程本身。 所有的四边形都存储在同一个顶点缓冲区中吗? 它需要一个索引缓冲区吗? 如何处理不同的纹理? 如果可能的话,如果能够引导我完成从SpriteBatch.Begin()被调用直到SpriteBatch.End()的过程,至less在使用默认的Deferred模式时,我将不胜感激。