Articles of spritebatch

配料和表演

我想了解配料,我不知道如何去做,我可以有更多的信息吗? 这是我现在发现的: 批量信息 有很多types的配料: 雪碧配料 几何配料 ??? 雪碧配料 只有一个绘制调用绘制所有精灵是非常有用的。 要做到这一点,一个SpriteBatcher类需要获取具有相同材质和相同几何体(sprite = square geometry)的所有网格。 获取相同材质的精灵 将所有Sprite的matrix发送到Sprite着色器( http://antonholmquist.com/blog/sprite-batching-opengl-es-2-0/ ) 几何配料(使用静态几何) 合并网格的几何,所以我们可以在一个绘图调用中绘制所有的网格。 获取所有静态网格 合并网格的几何graphics,并用matrix计算它们的位置(计算一个VBO和IBO) 隐藏原始网格以避免两次绘制。 我对吗? 谢谢!

Spritebatch不能在winforms中工作

我在应用程序中心使用Winforms示例,一切工作正常,除了我的spritebatch不会绘制任何东西,除非我在Draw方法中调用Invalidate。 我有我的初始化方法: Application.Idle += delegate { Invalidate(); }; 我用了一个断点,它确实使我的程序无效,并且正在调用我的绘图方法。 我没有得到spritebatch的错误,所有的纹理加载,我只是没有看到在屏幕上的任何东西。 这是我有的代码: protected override void Draw() { GraphicsDevice.Clear(Color.CornflowerBlue); spriteBatch.Begin(); tileSheet.Draw(spriteBatch); foreach (Image img in selector) img.Draw(spriteBatch); spriteBatch.End(); } 但是当我这样做: protected override void Draw() { GraphicsDevice.Clear(Color.CornflowerBlue); spriteBatch.Begin(); tileSheet.Draw(spriteBatch); foreach (Image img in selector) img.Draw(spriteBatch); spriteBatch.End(); Invalidate(); } 那么突然之间的绘图开始工作! 但问题是它冻结了一切,只有控制得到更新。 我能做些什么来解决这个问题? 真令人沮丧。

我怎样才能做精灵在SFML批处理?

我是新的游戏开发和使用SFML。 我需要同时使用大量的精灵,所以我可能需要精灵批量。 我知道精灵批处理是用一个drawcall来绘制多个精灵,但我不知道它是如何工作的,或者如何去做。 精灵配料如何工作? (SFML的例子,将不胜感激。)

通过只有一个glDrawArray调用来绘制更多的四元组?

编辑 在最初认为我的精灵批量testing比单独调用每个精灵更快之后,看起来情况并非如此! 🙁 通过一组GL调用每个精灵,我可以获得大约90个四边形移动而不降低性能。 通过我的批量testing,我可以得到12(全部在一个电话)。 问题在于我无法在任何地方find任何示例(代码),以了解如何使用Android(Java)和OpenGL ES 2.0实现这一点。 我的方法涉及传递一个坐标集数组,而不是一组坐标,然后该方法将建立一个数组来存储这些坐标,然后渲染相关数量的顶点。 就像我说的,它的工作原理,但性能是可怕的! 这是正确的方法吗? 谁能帮忙? 谢谢! 我正在使用Android与openGLES 2.0,我不能解决如何绘制2(或更多,但为了简单起见,让暂时说2)纹理四方只使用1调用glDrawArrays。 我的着色器是相当标准的,并考虑到精灵不透明度,如下所示: //vertex shader String strVShader = "uniform mat4 uMVPMatrix;" + "attribute vec4 a_position;\n"+ "attribute vec2 a_texCoords;" + "varying vec2 v_texCoords;" + "void main()\n" + "{\n" + "gl_Position = uMVPMatrix * a_position;\n"+ "v_texCoords = a_texCoords;" + "}"; //Fragment shader String strFShader […]

Monogame / SharpDX Texture2D不具有价值

我发现的问题很可能是类之间,所以我真的没有太多的select,但发布整个代码在这里: https : //www.dropbox.com/sh/smyw9t1ap3by2vd/pBX-aJJ-Qx 我一直在使用spritebatches渲染纹理最近使用monamame的Windows 8与xaml在运行几秒后引发错误。 这个错误只发生在几秒钟之后,尽管渲染效率越低或纹理越多,崩溃的速度越快。 在完成git子模块更新后,错误信息完全消失,但纹理仍然从屏幕消失,只剩下矢车菊蓝色。 GitHub的人认为这是我的代码而不是他们的问题,这意味着我确实做错了什么。 作为参考,这里是问题线程: https : //github.com/mono/MonoGame/issues/1927 。 谢谢你的帮助! 更新:我已经确定了问题的根源。 它与声明和保持纹理有关。 protected override void LoadContent() { _spriteBatch = new SpriteBatch(GraphicsDevice); ContentManager myManager = new ContentManager(Content.ServiceProvider, Content.RootDirectory); terrainEngine.Load(myManager); } ContentManager content; public void Load(ContentManager content) { this.content = content; blockTextures = content.Load<Texture2D>("Graphics\\Blocks"); spriteFont = content.Load<SpriteFont>("Graphics\\SpriteFont1"); } 现在,如果我从terrainEngine类的Update方法中调用Load(content),那么程序将工作,否则,纹理会在一秒钟后消失。

问题在XNA 4.0游戏中调用Spritebatch

所以,我使用Microsoft Visual C#Studio Express 2010程序在XNA 4.0中创建了一个游戏。 我遇到的问题是:我已经完成了整个游戏,没有理由不能工作。 问题是每次我尝试去debugging我的游戏时,它都会告诉我我的代码中随机区域中缺less一个“Spritebatch.end”或“Spritebatch.begin”。 如果我放入一个“Spritebatch.end”,它告诉我我缺less一个“Spritebatch.begin”,反之亦然。 我重复了这个源代码,没有语法错误。 所以我的问题是:我正在使用的程序是否有问题,还是有其他原因,我的代码给了我这个相当圆形的错误? 这里是我现在所拥有的:我已经实施了其他的修复,但没有任何工作。 private void DrawEmptyPiece(int pixelX, int pixelY) { spriteBatch.Begin(); spriteBatch.Draw( playingPieces, new Rectangle(pixelX, pixelY, GamePiece.PieceWidth, GamePiece.PieceHeight), EmptyPiece, Color.White); spriteBatch.End(); } private void DrawStandardPiece(int x, int y, int pixelX, int pixelY) { spriteBatch.Draw( playingPieces, new Rectangle(pixelX, pixelY, GamePiece.PieceWidth, GamePiece.PieceHeight), gameBoard.GetSourceRect(x, y), Color.White); } private void […]

我如何正确alignment文本?

我正在使用SpriteBatch.DrawString ,这似乎没有文本alignment的重载。 我如何绘制alignment的文字?

XNA 4.0 – 使用RenderTarget2D时的奇怪行为

我的问题类似于XNA 4.0 – 为什么使用RenderTarget2d会导致模型透明? 。 我想渲染我的场景到一个Texture2D,然后绘制纹理。 如果我没有设置任何RenderTarget(直接渲染到后台缓冲区),一切都看起来不错。 我绘制我的模型/纹理: graphics.GraphicsDevice.Clear(Color.Black); spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.Opaque, SamplerState.AnisotropicClamp, DepthStencilState.Default, RasterizerState.CullCounterClockwise); […Drawing methods for models etc. are called here…] spriteBatch.End(); 如果我将该代码更改为: RenderTarget2D target = new RenderTarget2D(this.GraphicsDevice,this.GraphicsDevice.PresentationParameters.BackBufferWidth,this.GraphicsDevice.PresentationParameters.BackBufferHeight); this.GraphicsDevice.SetRenderTarget(target); graphics.GraphicsDevice.Clear(Color.Black); spriteBatch.Begin(SpriteSortMode.FrontToBack, BlendState.Opaque, SamplerState.AnisotropicClamp, DepthStencilState.Default, RasterizerState.CullCounterClockwise); […Drawing methods for models etc. are called here…] spriteBatch.End(); this.GraphicsDevice.SetRenderTarget(null); 渲染纹理/将其保存为图像文件,一些对象变得透明,绘图顺序随机变化。

批量和对象的转换

我试图在我的游戏(Sprite批处理和3D网格批处理)中实现批处理,我已经阅读了很多文档,但我不明白: 当每个对象都有自己的转换(旋转,位置,缩放)时,我怎样才能将它与其他几何体合并? 当每个对象使用混合时,我怎样才能达到配料的深度? 谢谢!

SharpDx SpriteBatch中的自定义效果

我试图将一个XNA项目的模糊效果移交给SharpDx,我得到一个“空引用exception”,我无法find原因。 private void blurShadow(RenderTarget2D to, RenderTarget2D from, int dir) { _graphicsDevice.SetRenderTargets(to); _shadowBlurEffect.CurrentTechnique.Passes[dir].Apply(); _spriteBatch.Begin(SpriteSortMode.Deferred, _shadowBlurEffect); _spriteBatch.Draw(from, Vector2.Zero, Color.White); _spriteBatch.End(); // <– Null Reference Exception here } public void Draw() { _graphicsDevice.SetRenderTargets(_graphicsDevice.DepthStencilBuffer, ShadowDepthTarget); _graphicsDevice.Clear(Color.White); // Clear the render target to 1 (infinite depth) foreach (var obj in ShadowCastingObjects) obj.Draw(Camera, DrawingReason.ShadowDepthMap, this); blurShadow(_shadowBlurTarg, ShadowDepthTarget, 0); blurShadow(ShadowDepthTarget, _shadowBlurTarg, 1); […]