Articles of spritebatch

在XNA中使用原始顶点信息而不是SpriteBatch

我一直在想是否使用SpriteBatch是最好的select。 很明显,对于原型或小型游戏,它运作良好。 不过,我一直想要将诸如着色器和灯光之类的技术应用到我的游戏中。 我知道你可以在一定程度上使用着色器SpriteSortMode.Immediate ,但我不知道你是否失去了权力使用。 另一个主要的问题是,你不能用缓冲区把你的顶点数据存储在graphics内存中。 总之,是否有使用VertexTextureNormal (或其他称为)的2D VertexTextureNormal的顶点数据结构的优势,还是应该坚持使用SpriteBatch,只要我希望使用着色器?

如何在XNA中绘制简单的2D线,而不使用3D图元和阴影

我希望能够在我的精灵2D XNA游戏中画出任意的线条。 如何在XNA屏幕上绘制一条简单的线条,而无需处理顶点数组或着色器。

使用XNA的SpriteBatch绘图时,如何configuration剪贴区域?

我有一个SpriteBatch被设置为绘制到高度和宽度都是500像素的RenderTarget2D 。 每当我绘制到物理屏幕尺寸以外的点时,它都不会绘制对象。 我正在对纹理进行一些3D转换,所以我需要绘制屏幕外的区域。 我试图设置扑灭到None ,这没有任何效果。

OpenGL ES 1.1 – 如何批量绘制具有不同翻译的粒子?

假设我已将所有顶点数据组合到一个数组中,我将如何以保留其独特转换的方式批量绘制所有这些粒子? 任何代码示例将不胜感激。

如何优化SpriteBatch的使用?

据我所知,SpriteBatch的目的是将许多绘制操作批量发送到GPU。 每个批处理可以同时处理一个纹理,并且更改SpriteBatch上下文/纹理的开销很大,所以当您需要在一个帧中绘制多个不同的纹理时,您可以使用纹理图集,将最有可能由同一个组件绘制的精灵在同一页面。 所以我的问题是: 假设有很多组件使用相同的纹理页面,我该如何将它们组合在一起并发布它们的绘图方法? 什么是处理使用来自两个不同纹理页面的精灵的组件的有效方法? 我应该为每个纹理页面处理两种不同的绘图方法吗? 或者可能将上下文纹理页面作为参数,只绘制与之相关的内容? 那么dynamic生成的纹理呢? 如果您不知道某个组件需要哪个纹理页,该怎么办? (例如,一个自定义的视觉设备,你不可能把所有的装备都放在同一个纹理页面上,因为可能有成千上万的em,而且只能在运行时确定) 我已经看过很多关于SpriteBatches如何在技术上工作的文章,但是对于如何最好地利用它们没有任何意义。 一个好的解决scheme是以某种方式排队我的绘制操作按纹理sorting? 如果是这样的话,那么通过什么方式来实现呢?

Spritebatch顶点着色器世界matrix在每次绘制之后改变

我有一个spritebatch,我画了一些纹理在三维空间转换。 简单的方法就是从变换matrix开始,绘制,然后结束。 但是,这是愚蠢的,所以我想用顶点着色器。 然而我的结果并不是我们想要的结果。 第一次绘制和转换之后,其余的纹理停止了欣赏,这暗示我不能改变绘制之间的世界matrix。 我应该如何处理这个? 在sp.Begin之前,我设置了像这样的投影matrix: shader.Parameters["Projection"].SetValue(Matrix.CreateOrthographicOffCenter( 0, sp.GraphicsDevice.Viewport.Width, sp.GraphicsDevice.Viewport.Height, 0, 0, 1) ); sp.Begin(SpriteSortMode.Deferred, null, null, null, null, shader); 之后: rotM = Matrix.CreateFromYawPitchRoll(MathHelper.ToRadians(startRotations.Y), MathHelper.ToRadians(startRotations.X), MathHelper.ToRadians(startRotations.Z)) //scale after rotation so I can destroy the z value after rotation * Matrix.CreateScale(endScale.X, endScale.Y, 0) * Matrix.CreateTranslation((Origin.X + PositionRec.X + Offset.X) * endScale.X, (Origin.Y + PositionRec.Y + […]

OpenGL ES 2.0。 雪碧表animation

我已经find了一些关于如何在Open GL 1和1.1上进行这个工作的教程,但是我找不到它。 我会加载纹理,并使用顶点着色器上的一个matrix来移动通过精灵表。 我正在寻找最有效的方法来做到这一点。 我已经读过,当你提出你正在提议的事情时,你会不断地改变这个VBO,那样做不好。 编辑:自己做了一些研究。 来到这两个更新纹理 ,指的是前一个PBO的 。 我不能使用PBO的,因为我使用的ES版本的OpenGL,所以我想最好的办法是使FBO的,但是,我还是得不到,是如果我应该创建一个雪碧地图集/批处理,并作出一个FBO / loadtexture为每帧如果我应该加载到缓冲区的每一帧,只改变纹理的方向。

多个SpriteSheets破坏批处理

问题是:我无法在1个spritesheet中为所有单位和环境适合我所有的2Danimation精灵。 一切都很好,直到我使用两个spritesheet …我注意到了以下内容:从spritesheet的所有单位一批罚款,直到东西需要被呈现从spritesheet乙所以让我们从背面说:50单元 – 树50单位 – 相机将导致3 drawcalls …不是那么糟糕,但如果你有:单位树 – 单位 – 树 – 单位 – 树…就像这可能是大多数时间…这将导致100 + drawcalls即使你有只有两个spritesheet … 你怎么解决这个问题? 或者更好,我怎样才能使用两个spritesheets,并且只有两个drawcalls,即使这些sprite是在不同的距离到相机 希望这个图像有助于理解这个问题: 1:树上的图片B和批次罚款2:配料被打破,因为单位prrite坐在spritesheet A,并被放在树木之间…

在许多不同的地方调用SpriteBatch.Begin / End的性能/架构影响?

我注意到一些代码示例只能在游戏的主要绘制方法中调用SpriteBatch.Begin和SpriteBatch.End ,然后通过直接SpriteBatch.Draw调用或通过其他存储对SpriteBatch对象的引用的其他类的方法调用来绘制该方法内的所有内容然后使用其Draw方法。 我看到的另一种方法是,在这些单独的类中,它们在每个类中的绘图代码之前调用SpriteBatch.Begin和SpriteBatch.End ,并且不依赖于已经包含在绘图会话中(在开始和结束调用之间)。 我的问题是双重的。 首先,如标题所示,在所有这些单独的类中经常调用SpriteBatch.Begin/End (每个图更新每个类一次),而不是每调用一次就调用一次。 其次,这个问题有点更主观,但是哪种devise通常更可取? 谢谢。

如何剪切文本框中的截止文本?

我正在为我的XNA游戏编写一个文本框类,并使用SpriteFont绘制文本。 这只是一个单行文本框,所以当文本宽度超过矩形框的大小,它目前只是继续前进。 在Windows文本框中,额外的文本被切断,以便您只能看到半个字母。 我想用我的自定义控件来模拟这个。 但是,我发现没有使用SpriteBatch.DrawString重载,这将允许任何可能切断不符合特定范围的文本。 有谁知道一个方法,将允许这个? 我对XNA API还是比较陌生的,所以我不确定这种东西存在什么东西。谢谢