Articles of spritebatch

在XNA 4中,如何在我的着色器中访问SpriteBatch的transformMatrix?

我想使用常规的XNA SpriteBatch的自定义效果。 我有一个计算变换matrix的2D相机,所以我需要着色器将其考虑在内。 我把一个世界matrix属性放到我的着色器中: float4x4 World; 但是,它不会被SpriteBatch设置: spriteBatch.Begin(spriteSortMode, blendState, samplerState, depthStencilState, rasterizerState, effect, camera.WorldToScreen); 如果我在绘制循环中手动设置,所有东西都能正确渲染: effect.Parameters["World"].SetValue(camera.WorldToScreen); 我如何设置我的着色器参数来使SpriteBatch正确设置它们?

为什么我的精灵不能在XNA的正确位置上绘制?

对不起,如果这之前已经问过,但我似乎无法在这里find它。 我试图在XNA中做一个小行星克隆。 我参加了“游戏状态管理”项目,并为玩家制作了新的类,并将其放置在GameplayScreen类中。 出于某种原因,我的船没有被正确绘制。 GameplayScreen的绘制方法: public override void Draw(GameTime gameTime) { ScreenManager.GraphicsDevice.Clear(ClearOptions.Target, Color.CornflowerBlue, 0, 0); SpriteBatch spriteBatch = ScreenManager.SpriteBatch; spriteBatch.Begin(); //draw fps if(showFPS) spriteBatch.DrawString(framerateFont, "FPS: " + frameRate, new Vector2(15, 15), Color.White); player.Draw(spriteBatch); spriteBatch.End(); // If the game is transitioning on or off, fade it out to black. if (TransitionPosition > 0 || pauseAlpha > […]

为什么Spritebatch不按顺序绘制我的纹理?

我刚开始使用Java编程2D游戏后,与XNA Studio合作。 因此,我绝对没有Spritebatch和spritesorting的经验。 在Java中,我可以通过按顺序调用绘制方法来对图像进行分层。 有一段时间,我的Spritebatch在延迟sorting模式下工作正常,但是当我对其中一个纹理进行更改时,它突然开始将它们乱序排列。 我已经寻找解决这个问题的办法,但似乎没有任何工作。 我已经尝试添加图层深度的精灵和改变sorting模式为BackToFront或FrontToBack甚至直接,但似乎没有任何工作。 这是我的绘图代码: protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.Gray); Game1.spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null); for (int x = 0; x < 5; x++) { for (int y = 0; y < 5; y++) { region[x, y].draw(((float)w / aw)); // Draws the Tile-Based background } } player.draw(spriteBatch, ((float)w / aw));//draws […]

旋转期间XNA雪碧剪切不正确

我在XNA的精灵画面靠近屏幕边缘时遇到了一些麻烦。 貌似如果你使用SpriteBatch绘制,那么XNA不会绘制它,例如(mPosition.X + mSpriteTexture.Width <0),因为它假定它是离屏的。 但是,它似乎在应用轮换之前做出这个决定。 这种旋转可能意味着即使(mPosition.X + mSpriteTexture.Width <0),一些精灵在屏幕上仍然可见。 编辑:旋转是问题的一部分只是一个假设,但澄清,因为精灵以稳定的速度(以一个小的恒定速度)向屏幕边缘移动,它会突然消失时,它仍然是部分(通常大约一半的精灵)在屏幕上。 我的问题是,是否有办法让它进一步绘制在视口之外或临时禁用spriteBatch.draw(…)期间的精灵剪辑? sb.Draw(mSpriteTexture, mPosition, new Rectangle(0, 0, mSpriteTexture.Width, mSpriteTexture.Height), Color.White, Globals.VectorToAngle(mOrientation), new Vector2(halfWidth, halfHeight), scale, SpriteEffects.None, 0);

在3D世界中进行Alpha混合的批量和Z顺序

我正在一个只有2D精灵的3D世界里进行游戏(就像Do not Starve游戏一样)。 (使用C ++的OpenGL ES2) 目前,我没有批量绘制元素前sorting元素(所以1元素= 1 drawcall)。 我想在我的框架中实施批处理,以减less绘制调用。 这是我现在所拥有的: 将我的场景的所有元素排列在前面。 向渲染器发送元素的顺序列表。 渲染器在批处理管理器中查看批处理是否存在给定元素和他的材质。 批次不存在:创建一个新的。 该材质的元素存在批次:将精灵添加到批次中。 用每个批次的所有精灵计算大网格(1个物料types= 1批次)。 当所有批处理都正常时,批处理管理器为渲染器计算绘制命令。 渲染器进程绘制命令(绑定着色器,绑定纹理,绑定缓冲区,绘制元素) 图片与我的问题在这里: 但是我遇到了一些问题,因为对象可能在另一批次内的另一个对象的后面。 我怎么能这样做?

失败的屏幕调整方法

所以我希望我的游戏能够绘制到一个特定的“最佳”尺寸,然后拉伸以适应不同尺寸的屏幕。 我使用LibGDX,并认为我可以将所有内容绘制到FrameBuffer,然后在将其绘制到实际显示时将其调整为适当的大小。 但是,我的方法不起作用,它只是在屏幕的右上角四分之一的黑屏。 中介是FBO,interMatrix是Matrix4对象,相机是OrthographicCamera。 @Override public void render() { // update actors currentStage.act(); //render to intermediary buffer batch.setProjectionMatrix(interMatrix); intermediary.begin(); batch.begin(); currentStage.draw(); batch.flush(); intermediary.end(); //resize to actual width and height Sprite s = new Sprite(intermediary.getColorBufferTexture()); s.flip(true, false); batch.setProjectionMatrix(camera.combined); batch.draw(s.getTexture(), 0, 0, width, height); batch.end(); } 这些是上述对象的构造函数(GAME_WIDTH和HEIGHT是“最优”设置,宽度和高度是实际大小,在桌面上运行时是相同的)。 intermediary = new FrameBuffer(Format.RGBA8888,GAME_WIDTH,GAME_HEIGHT,false); interMatrix = new Matrix4(); camera = […]

2D精灵不能在正确的深度绘制?

我一直在让我的精灵按照正确的顺序绘制一些问题。 现在有两种types的对象:节点和path。 我总是希望节点绘制path,所以我已经将节点的深度设置为0,path的深度设置为1.它们被绘制在同一个SpriteBatch调用中,并使用SpriteSortMode.Deferredpath仍然在节点的顶部绘制。 我尝试调换这些的深度,他们仍然错误的顺序。 我也尝试将sorting模式切换到BackToFront和FrontToBack,但是这两者都会让游戏其余部分的graphics变得混乱,因此切换到其中的任何一个都不值得。 有什么显而易见的,我做错了吗? 是否改变绘制顺序(path总是绘制在节点之后)才能使节点绘制在path之上? 谢谢!

XNA 4.0 SpriteFont不显示所有的字符

我正在寻找一些帮助,并尝试在我的XNA 4.0游戏中使用SpriteFont,但问题是显示为string “这是一个testing”,但屏幕上显示的是“This is st”,因此屏幕上缺less“a te”。 字符的空间在那里,但字母不是。 我正在使用的代码是: spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.AlphaBlend); spriteBatch.DrawString(font,"this is a test",new Vector2(692,372),Color.White); spriteBatch.Draw(texture,new Rectangle(0,0,100,100),Color.White); spriteBatch.End(); 任何帮助,这将是伟大的!

XNA C#:如何防止从RenderTarget2D绘图时模糊?

我正在做一个游戏,我希望最终的graphics看起来矮胖和像素化,所以我从spritebatch绘制到一个RenderTarget2D这是实际backbuffer的大小的四分之一,然后从那里绘制到backbuffer。 起初精灵被抗锯齿弄糊涂了,我读到在spritebatch Begin调用中使用SamplerState.PointWrap会缓解这一点,所以我做了这个改变。 一切似乎都比较好,但最终的屏幕上的图像仍然是模糊的,我想这是因为它从rendertarget2D到backbuffer。 这里的图像是一个比较 – 左边是输出看起来如何,右边是我希望它看起来。

monogame是否有spritebatch绘图限制?

我已经达到了一个观点,看起来当我在屏幕上画得太多,monogame开始做奇怪的事情。 当我在Draw方法中调用这个代码时 public void drawDialogBox() { if (dialogueBoxOn == 1) { spriteBatch.Begin(SpriteSortMode.BackToFront, BlendState.NonPremultiplied, SamplerState.PointClamp, DepthStencilState.Default, RasterizerState.CullNone, null, Matrix.CreateScale(GameGlobals.zoom)); spriteBatch.Draw(dialogBoxChara, new Vector2(89, 18), Color.White); spriteBatch.Draw(dialogBoxTexture, new Vector2(0, 108), Color.White); spriteBatch.DrawString(font, "àéùaDASASCZadhkjashdash", new Vector2(4, 108), Color.White); spriteBatch.End(); } } 有时候是这样的: 这个代码应该显示字符,文本框本身和文本。 但是文字不正确。 如果我评论一条画线,它是有效的。 或者这个(如果我只评论字符行) 有什么想法发生在这里? 我以为这是一些SpriteBatch的限制,但我不知道… 编辑:继@Jon的建议后,我已经达到了这个状态 现在它正确地显示了角色和对话框,但是现在不显示背景和墙壁。 我拥有这样的所有墙壁: spriteBatch.Draw(leftcenterright4, new Vector2(0, 53), null, Color.White, 0, Vector2.Zero, […]