0

非常奇怪的问题,当我尝试绘制广告牌精灵时,它始终显示为白色块,更改 .draw color 属性仍将其绘制为白色,我使用 jpeg 或透明 png 也没关系。

[编辑]

所以我现在尝试使用 aViewport而不是基本效果来获得 x 和 y 屏幕坐标,稍后我将解决任何缩放问题,但是现在图像保持在完全相同的位置(在屏幕上,它不会'不根据相机改变位置)并且不会根据它的距离变大或变小

我的新广告牌渲染功能:

public void Draw(Camera camera, GraphicsDevice device, SpriteBatch spriteBatch, Texture2D Texture)
{
    Viewport viewport = new Viewport(new Rectangle(0, 0, 800, 480));
    Vector3 viewSpaceTextPosition = viewport.Project(this.position, camera.Projection, camera.View, camera.World);

    spriteBatch.Begin();
    spriteBatch.Draw(Texture, new Vector2(viewSpaceTextPosition.X, viewSpaceTextPosition.Y), null, Color.White, 0, new Vector2(Texture.Bounds.Center.X, Texture.Bounds.Center.Y), this.Scale, SpriteEffects.None, viewSpaceTextPosition.Z);
    spriteBatch.End();

    device.RasterizerState = RasterizerState.CullCounterClockwise;
    device.BlendState = BlendState.Opaque;
    device.DepthStencilState = DepthStencilState.Default;
}

那么我对 Viewport 的使用是错误的,还是我只需要以不同的方式使用它的信息spriteBatch.Draw()

4

2 回答 2

1

我认为这应该使用视口项目来解决问题......取两个投影点并计算它的距离,你会得到一个受深度影响的值......所以如果它更深,这个值会更小。

public void Draw(Camera camera, GraphicsDevice device, SpriteBatch spriteBatch, Texture2D Texture)
{
     Vector3 pos1= device.Viewport.Project(
          this.position, 
          camera.Projection, camera.View, camera.World);
     Vector3 pos2= device.Viewport.Project(
          this.position+ Vactor3.UnitY*10, 
          camera.Projection, camera.View, camera.World);
     Vector2 pos = new Vector2(pos1.X, pos1.Y);
     Vector2 origin = new Vector2(Texture.Bounds.Center.X, Texture.Bounds.Center.Y);
     float Scale = Vector3.Distance(pos1, pos2) * CustomRatio;

     spriteBatch.Begin();
     spriteBatch.Draw(Texture, pos, null, Color.White, 0, 
                      origin, Scale, SpriteEffects.None, 0);
     spriteBatch.End();

    device.RasterizerState = RasterizerState.CullCounterClockwise;
    device.BlendState = BlendState.Opaque;
    device.DepthStencilState = DepthStencilState.Default;
}

另一方面......您之前的代码似乎是从 Xna 背后的人制作的这篇文章中提取的源代码,该文章解释了如何使用 basiceffect 使用 spritebatch 绘制 3D 广告牌......

http://blogs.msdn.com/b/shawnhar/archive/2011/01/12/spritebatch-billboards-in-a-3d-world.aspx

希望对你有帮助

于 2013-06-24T17:25:29.630 回答
0

想通了,您必须在效果上启用纹理,然后在调用绘图函数effect.Texture之前设置为要使用的 Texture2DspriteBatch.Begin()

于 2013-07-08T20:46:28.943 回答