Articles of spritebatch

为什么绘制到RenderTarget的3D模型与直接绘制的模型相比显得扭曲?

我在XNA 4中绘制3D模型到RenderTarget2D遇到了一个问题。当模型被绘制到渲染目标,然后渲染目标被绘制到屏幕上时,它会出现扭曲。 (见右图) 但是,如果我直接画到后缓冲器,那么一切都显示正确(见左图) 在进行3D绘图之前,我正在重置所有的状态。 (BlendState,DepthStencilState,SamplerStates和RasterizerState) 这是我的绘制方法。 我首先绘制到渲染目标。 然后我使用spritebatch将其绘制到屏幕上(这个例子右边偏移)。 最后,为了直接比较,我重新设置了状态,再次将3d模型直接绘制到后台缓冲区(使用完全相同的DrawModel()方法),并且工作正常。 protected override void Draw(GameTime gameTime) { // First set to use a render target. GraphicsDevice.SetRenderTarget(_playerBufferRenderTarget); GraphicsDevice.Clear(Color.Black); // Reset all the states as appropriate for 3d drawing. GraphicsDevice.BlendState = BlendState.Opaque; GraphicsDevice.DepthStencilState = DepthStencilState.Default; GraphicsDevice.SamplerStates[0] = SamplerState.LinearClamp; GraphicsDevice.RasterizerState = RasterizerState.CullCounterClockwise; // Draw the model (to the rendertarget) […]

嵌套雪碧批量和背景绘制

我的代码看起来像这样: graphicsDevice.Clear(Color.Black); spriteBatch.Begin(); spriteBatch.Draw(contentLoader.VerticalGradient, tileSafe, null, Color.DarkGreen, 0, Vector2.Zero, SpriteEffects.None, 0.5f); // snip a lot, including drawing stuff on the sprite batch. // create a new sprite batch (for snipping) var initialViewport = InitialBatch.GraphicsDevice.Viewport; InitialBatch.GraphicsDevice.Viewport = new Viewport(displayRectangle); var newBatch = new SpriteBatch(InitialBatch.GraphicsDevice); newBatch.Begin(); // draw stuff on the new batch newBatch.End(); InitialBatch.GraphicsDevice.Viewport = initialViewport; […]

SpriteBatch.Draw()矩形与传入的destinationRectangle不同

当我要求SpriteBatch在下面的方法中绘制一个矩形: public static void DrawSolidRectangle(Rectangle rectangle, Color color) { // the output from this is shown in the screenshot System.Console.WriteLine(rectangle.ToString()); spriteBatch.Draw(pixel, rectangle, color); } 我正在为我提供的矩形获取不同大小的矩形。 调整窗口大小后,这是一个问题。 正如你在截图中看到的,两个矩形的宽度差只有2个像素,有1个像素的偏移量,而两个灰色的矩形绘制结果显然宽度大于3个像素的差异。 问题的屏幕截图http://users.tpg.com.au/gavinw77//SpriteBatchIssue.jpg 有谁知道发生了什么事? 这是SpriteBatch或BackBuffer在resize或什么后的已知问题?

在较小的显示器上加载纹理太大

我有一个XNA游戏,当我运行游戏的纹理加载我的电脑和我的电视都好,他们都把绘制在正确的位置。 但是在我的笔记本电脑上,哪个屏幕比较小,那么我的电脑显示器和我的电视屏幕,所有的纹理都被拉大了。 例如:我有一个只是草地和石路的背景,图像尺寸是1920×1080。 它加载得很好,以我的另一台电脑和电视机为中心,但是在我的笔记本电脑上,它的绘制方式太大,中心应该在笔记本电脑屏幕的右下角。 是否有可能编辑代码,使其在较小的屏幕上更好地resize,还是只是我的笔记本电脑,我的笔记本电脑的屏幕大小是搞砸了。 我相信我的笔记本电脑的宽高比是16:9。 更新1 我注意到,当窗口不是全屏时纹理加载正常,但全屏时纹理有问题。 我应该如何改变这个绘制方法来解决这个问题,并在全屏1920×1080窗口中的正确位置画这个? spriteBatch.Draw(backgroundTexture, Vector.Zero, Color.White); (请记住backgroundTexture是1920×1080)

使用SpriteBatch与BasicEffects和layerDepth创建负Z值?

简单地说:为什么这些精灵不是全部绘制的? 我需要做些什么才能使他们画画? 我正在尝试使用带有layerDepth参数的SpriteBatch.Draw来帮助减less透支。 但是我不能让它正常工作。 当我尝试与AlphaTestEffect一起使用时,它始终输出负Z值! 我在下面创建了一个基本的testing用例来显示问题。 创建效果和matrix的代码基于这个:XNA博客中的“XNA Game Studio 4.0中的SpriteBatch和自定义着色器” 。 我认为给出的投影matrix应该是有意义的,查看CreateOrthographicOffCenter的文档。 但由于某种原因,它不是! 有谁能弄清楚为什么要告诉我? using System; using System.Collections.Generic; using System.Linq; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Audio; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.GamerServices; using Microsoft.Xna.Framework.Graphics; using Microsoft.Xna.Framework.Input; using Microsoft.Xna.Framework.Media; namespace SpriteBatchTest { public class Game1 : Microsoft.Xna.Framework.Game { GraphicsDeviceManager graphics; SpriteBatch spriteBatch; BasicEffect basicEffect; AlphaTestEffect alphaTestEffect; Texture2D mysprite; public Game1() […]

使用OpenGL ES 2.0批量处理2D纹理

我有一个纹理地图集和Sprite批处理的OpenGLES 2.0 2D游戏我正在开发哪个工作正常,但我有深度sorting问题。 我使用地图集来减less纹理绑定操作的数量,而精灵批量可以减less绘制调用的次数,而且一切都很好,但是在如何在游戏中安排精灵时,我遇到了合理的问题。 因为与批处理一起使用图集的全部要点是保存绑定/绘制调用,所以我inheritance了一个限制,我无法在跨多个地图集的纹理相同的批处理中绘制精灵。 这意味着我必须仔细思考2D精灵的zsorting。 如果精灵“A”应该位于精灵“B”的后面,那么我必须首先绘制精灵A的批处理。 当有三个精灵,A,B和C,其中A在B之后,而B在C之后,但是A和C在同一个地图集时,问题就出现了。 那是, Atlas 1 ——— | A | C | ——— Atlas 2 —– | B | —– Scene ———————– [CAMERA] -> C -> B -> A 现在很明显,我可以通过多个绑定/批量操作来实现这一点,但是这样做首先会破坏它的目的。 理想情况下,我不想考虑哪个精灵在哪个地图集上,只是改变精灵的“z”值。 我尝试了启用GL_DEPTH_TEST,但我的大部分精灵都使用具有一定透明度的纹理,所以这对我不起作用。 有没有一个“标准”的方法呢? 还是我把自己画到了一个我不应该拥有的角落?

SpriteBatch,试图减less绘制调用

这是我的主要提示: Matrix Camera_transformation = player_camera_.GetTransformation(); // Background – AlphaBlend spritebatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, null, null, null, null, Camera_transformation); background_.Draw(spritebatch); spritebatch.End(); // Particles (of a player power, I want them behind him!) – Additive spritebatch.Begin(SpriteSortMode.Deferred, BlendState.Additive, null, null, null, null, Camera_transformation); player_.DrawParticles(spritebatch); spritebatch.End(); // Player – Alpha Blend spritebatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, null, null, null, null, Camera_transformation); player_.Draw(spritebatch); spritebatch.End(); // […]

在Mali-400 MP设备上渲染精灵

我开始使用OpenGL开发一个小型的跨平台游戏引擎,实际上我正在开发一个sprite批处理渲染器。 在OS X,iOS,Win32和一些Android设备上一切正常。 结果如下: 左边的图片显示了正确的结果,并在三星Galaxy S1,Galaxy J5,Galaxy S3,Galaxy Tab 3上进行了testing。右边给出这些奇怪结果的设备是三星Galaxy Core 2,配有Mali-400 MP渲染器。 当我使用多个纹理时,我开始得到奇怪的结果。 这是我的雪碧批处理类: Glyph::Glyph(const maths::vec2 &position, const maths::vec2 &dimensions, const maths::vec4 &uvRect, GLuint texture, unsigned int color, float zOrder) : textureID(texture) { a_zOrder = zOrder; topLeft.m_color = color; topLeft.setPosition(position.x, position.y + dimensions.y); topLeft.setUV(uvRect.x, uvRect.y + uvRect.w); bottomLeft.m_color = color; bottomLeft.setPosition(position.x, position.y); bottomLeft.setUV(uvRect.x, uvRect.y); […]

取消一个SpriteBatch我已经开始绘制了

背景: 我正在为XNA开发一个控制库,以用于我编写的一些游戏客户端。 我已经实现对话框的方式是让他们从基地XNAControl类派生。 XNAControl对象遵循游戏组件模型,都是从DrawableGameComponent派生的。 XNAControl调用基类XNAControl构造函数,就会将它们添加到Game.Components列表中。 问题: 通过实例化一个XNADialog对象,在游戏中popup对话框,与使用静态方法的MessageBox.Show()不同。 XNADialog的构造函数反过来实例化了父对话框控件的“子”控件。 儿童被对话框跟踪,并在closures对话框时自动从Game.Components列表中删除。 我创建的模型的问题是子控件在构建时添加到游戏的组件中,所以它们开始更新和绘图,并在完全构造对话框之前显示在屏幕上。 我试图debugging的情况是,对话框的标签将出现在左上角,然后在构建对话框之后的一秒钟之后移动到屏幕的中心。 我试过了: 用于基类XNAControl的单独构造函数,它在构造时不会将控件添加到组件。 相反,它依赖于子控件(在这种情况下是对话框)将其自身添加到Game.Components集合中。 这是我到目前为止的地方,它不工作,这是有道理的,因为无论如何,标签被添加到组件集合。 XNAControl的Initialized属性。 该属性在XNAControl.Initialize()方法中设置,如果它为false,则基类XNAControl.Update和XNAControl.Draw自动返回。 但是,这也不起作用,因为子控件在执行自己的绘图逻辑之后必须调用更新的基本方法并绘制,否则有些东西会以错误的顺序绘制。 我也不想在每一个孩子class上检查Initialized属性,因为它们有很多,我正在寻找更优雅的东西 将控件添加到组件集合的Initialize方法。 这不起作用,因为控件的初始化方法没有被自动调用,因为控件不在组件集合中。 题: 在父母控制的建设之前,保持儿童控制措施不被更新和绘制的最好办法是什么? 我唯一的想法是: 使用一个前导同步对象,但这似乎是矫枉过正/不必要的(或者正是我所需要的?)。 我想不出一个优雅的方式来做到这一点。 在XNAControl.Drawfind一种方法来取消子类中SpriteBatch所做的任何绘图。 我不认为这是可能的,但我找不到任何search。

我的2D OpenGL渲染器是否需要优化?

为了学习的目的,我开始了一个游戏引擎。 我已经成功地得到了一个opengl渲染器的工作,我可以在屏幕上绘制不同大小的纹理。 我这样做的方式是通过创建一个硬编码顶点的数组,只是一个盒子。 float Renderer2D::vertices[30] = { 0.f, 1.f, 0.0f, 0.0f, 0.0f, // Top-left 0.f, 0.f, 0.0f, 0.0f, 1.0f, // Bottom-left 1.f, 1.f, 0.0f, 1.0f, 0.0f, // Top-right 1.f, 1.f, 0.0f, 1.0f, 0.0f, // Top-right 0.f, 0.f, 0.0f, 0.0f, 1.0f, // Bottom-left 1.f, 0.f, 0.0f, 1.0f, 1.0f // Bottom-right }; (前三个是xyz – 第四个和第五个花车是纹理坐标) 我在程序开始的时候把它发送给GPU。 对于我绘制的每个精灵,我都会创建一个像这样的变换matrix: […]