Articles of spritebatch

带缩放或旋转的SpriteBatch.Draw触发一个新的批次?

我最近读到,任何转换更改将导致一个新的批次被触发。 那么,如果我有10个精灵,每个都有不同的轮换或者规模,那么会有10个批次发送吗? 或者,这是不是有限的SpriteBatch.Begin,在哪里使用matrix? 我不清楚“开始/结束”是如何与绘制调用中的缩放/旋转相关的,或者如果它们根据创建了多less批次来完成。 我很欣赏这个主题的任何信息…

使用libGDX SpriteBatch为每个精灵设置颜色

我正在使用一个SpriteBatch非常快地渲染大量的精灵。 现在我想用着色器修改它们的颜色。 问题1 :通过获取着色器并将其设置在批处理的开始/结束之间来更改统一,不仅会改变整个场景中的单个精灵。 例如: "EngineView.getShader().setUniformf("u_blue", (float) Math.random());" 问题2 :比较慢。 我也发现这似乎涵盖了相同的(没有适当的解决scheme):( 设置SpriteBatch中的不同精灵的顶点着色器的统一值 ): 你几乎肯定不想这样做。 更改每个四分之一/精灵的统一将严重影响渲染器的吞吐量。 大部分的GPU将闲置,而你一次只画一个可怕的精灵。 “精灵批处理”的全部要点是尽可能less的绘制调用或状态变化,同时绘制多个精灵。 如果在着色器中需要随机数据,请使用噪声纹理或噪声函数。 stackoverflow.com/questions/4200224/… – 肖恩·米德林德里5月23日21:22 我的问题是,如果我不想这样做,我想做什么?

我怎样才能添加一个透明的覆盖到libGDX的用户界面?

我正在尝试使用下面的代码 shapeRenderer.begin(ShapeRenderer.ShapeType.Filled); shapeRenderer.setColor(3,3,3,.3f); shapeRenderer.rect(0,0,gameWidth,gameHeight); shapeRenderer.end(); 所以当菜单被访问时,会出现一个透明的背景。 我面临的问题是,当我尝试这样做时,SpriteBatch呈现的对象似乎行为不端。 经过进一步的研究,我发现试图在SpriteBatch.begin()和SpriteBatch.end()中嵌套代码是造成这种情况的原因。 但是,如果我尝试将代码放置在SpriteBatch.end()之后,则由于SpriteBatch已结束,所以它所呈现的对象不会出现在透明矩形后面。 (我尝试将SpriteBatch和Shaperender分配给一个不同的摄像头,但是这并没有解决问题。)我该如何解决这个问题,或者find另一种方法来实现菜单的透明背景。

在滚动游戏中重复纹理

屏幕的底部区域由重复的纹理填充: grassTexture = new Texture(Gdx.files.internal("images/grass.png")); grassTexture.setWrap(TextureWrap.Repeat, TextureWrap.Repeat); grassSprite = new Sprite(grassTexture, 0, 0, width,grassTexture.getHeight()); 但是,草也应该滚动到左侧(从边到边循环纹理)。 我已经得到了这个render()方法: scrollTimer += 0.0007f; if (scrollTimer > 1.0f) scrollTimer = 0.0f; grassSprite.setU(scrollTimer); grassSprite.setU2(scrollTimer+1); grassSprite.draw(spriteBatch); 滚动部分现在工作。 但是,草地纹理不再重复。 它看起来像这样:

我应该去与SpriteBatch或只有3D与Z组件总是零?

我正在devise一个平台游戏,并开始编写游戏的查看引擎。 现在,我必须做出一个关键的决定:我应该只使用SpriteBatch绘制所有的二维的东西,因为没有3D,或者我应该去制作面向摄像头的多边形与Z设置为零? 两者的好处和缺点是什么? 性能? 可扩展性? 性能是一个关键因素,因为我将拥有大量的文本/对象/效果/animation等等,而且我将会瞄准像1920×1200这样的高分辨率(如果在客户端计算机上可用的话),所以我需要一切顺利。 另一方面,我也需要一些可扩展性,因为我想对绘图方法有很好的控制。 似乎我会用3D /多边形的方法,但我想知道是否有任何副作用?

XNA GameServices与公共静态

我刚开始学习XNA开发Windows Phone游戏。 我磕磕绊绊以不同的方式处理事物的不同样本代码。 对专家来说是一个问题……至less对于那些已经有这个专题经验的人来说: 通过游戏对象的构造函数注入SpriteBatch的实例或者将SpriteBatch对象添加到GameServices集合并从游戏对象的构造函数中检索它是更有意义的: spriteBatch = Game.Services.GetService(typeof(SpriteBatch)) as SpriteBatch;

在旋转的3D平面上绘制精灵时,我可以使用SpriteBatch吗?

我想让我的精灵飞机像这个游戏一样旋转(YouTubevideo) 。 所以基本上,所有东西都是2D绘制的,但2D平面是“3D旋转”(或旋转相机)。 旋转的时候,更远处的精灵应该看起来更远。 题: 我可以使用SpriteBatch吗? IIRC SpriteBatch使用正交视图matrix,所以可能不是? 如果可以的话,怎么样? 如果没有,你会如何建议我画出精灵? PS。 我很难解释问题,所以请随时提出任何问题。

LibGDX – SpriteBatch的.draw()方法需要float

请原谅我对LibGDX缺乏知识,因为我刚开始学习它。 我正在通过一些简单的教程,其中之一,我画一个string,如下所示: // the following code is in the main file in the core project folder: // this is in the create() method: private SpriteBatch batch; batch = new SpriteBatch(); // this is in the render() method: batch.draw(batch, "Hello world", 200, 200); 我得到一个错误说:typesSpriteBatch中的方法draw(texture,float [],int,int)不适用于参数(SpriteBatch,int,int) 那么,LibGDX想要一个浮点数组来绘制而不是一个string? 提前致谢。

SpriteBatch可以多遍渲染吗?

我正在试图实现一个盛开的效果。 这需要三个着色器通道:亮度阈值,水平模糊和垂直模糊。 这也需要resize,但这些与问题无关。 我也忽略了门槛,因为问题在于模糊。 现在,我已经读过HLSL通行证对于不同的着色器只是语法糖,并且它们之间的切换与为GraphicsDevice设置新的效果一样昂贵。 不过,我更喜欢把它们保存在一个.fx文件中。 通行证: 通过Pass0 { PixelShader =编译ps_2_0 PS_Threshold(); } 通过Pass1 { PixelShader =编译ps_2_0 PS_BlurHorizo​​ntal(); } 通过Pass2 { PixelShader =编译ps_2_0 PS_BlurVertical(); } 模糊代码: private void Blur(SpriteBatch SpriteBatch,RenderTarget2D Source,RenderTarget2D Rendertarget1,RenderTarget2D Destination) { //模糊通行证1 。Contents.BloomEffect.CurrentTechnique.Passes [ “1步”]套用(); SpriteBatch.GraphicsDevice.SetRenderTarget(Rendertarget1); SpriteBatch.GraphicsDevice.Clear(Color.Black); SpriteBatch.Begin(SpriteSortMode.BackToFront,BlendState.AlphaBlend,null,null,null,Contents.BloomEffect); SpriteBatch.Draw(Source,Rendertarget1.Bounds,Color.White); SpriteBatch.End(); //模糊通行证2 。Contents.BloomEffect.CurrentTechnique.Passes [ “2步”]套用(); SpriteBatch.GraphicsDevice.SetRenderTarget(目的地); SpriteBatch.GraphicsDevice.Clear(Color.Black); SpriteBatch.Begin(SpriteSortMode.BackToFront,BlendState.AlphaBlend,null,null,null,Contents.BloomEffect); SpriteBatch.Draw(Rendertarget1,Destination.Bounds,Color.White); SpriteBatch.End(); } 最后,Draw循环: protected […]

为SpriteBatch中的不同精灵设置顶点着色器的统一值

我正在使用libGDX,目前有一个简单的着色器,除了随机移动顶点位置之外,还有一个透视。 这个转换是我在我的代码的render()循环中设置的一个vec2统一。 它在我的顶点着色器中被声明为uniform vec2 u_random 。 我有两种不同的精灵 – 我们称之为SpriteA和SpriteB。 两者都在相同的SpriteBatch的begin()/ end()调用中绘制。 在我的场景中绘制每个精灵之前,我检查精灵的types。 如果SpriteA的 Sprite实例:我将统一的u_random值设置为Vector2.Zero ,这意味着我不希望任何顶点更改。 如果SpriteB的 Sprite实例将统一的u_random设置为Vector2(MathUtils.random(), MathUtils.random() 。 预期的行为是我场景中的所有SpriteA对象都不会经历任何抖动,而所有的SpriteB对象都会抖动他们的位置。 然而,我正在经历的是,SpriteA和SpriteB都在抖动,导致我相信u_random uniform并没有被实际设置为每个Sprite,而是被应用到所有的sprite上。 这是什么原因? 我怎样才能解决这个问题,使顶点着色器正确接受统一值设置影响每个精灵个别? passthrough.vsh attribute vec4 a_color; attribute vec3 a_position; attribute vec2 a_texCoord0; uniform mat4 u_projTrans; uniform vec2 u_random; varying vec4 v_color; varying vec2 v_texCoord; void main() { v_color = a_color; v_texCoord = a_texCoord0; […]