在没有Draw的情况下调整Texture2D的大小

时间:2012-06-23 14:14:20

标签: c# xna textures

正如标题所述,即使考虑Texture2D,我也会尝试调整SpriteBatch.Draw()的大小。我这样做的原因是我试图填充一个任意多边形,用Vector2D s定义的顶点布局,任意Texture2D

我正在考虑的是创建适合多边形的矩形,将Texture2D缩放到该矩形,然后通过Texture2D'{使多边形外部的像素透明{1}}和GetData<>()

我已经找到了适合多边形的矩形,但有没有办法调整SetData<>()的大小,或者我是以完全错误的方式进行的?谢谢!

2 个答案:

答案 0 :(得分:1)

你的方式错了。设置纹理数据很昂贵。 (而且过滤也可能存在一些问题。)

您要做的是设置您正在绘制的顶点的纹理坐标(“UV坐标”)。这将导致纹理的特定位置出现在多边形的顶点。然后,那些落在多边形之外的纹理根本就不会被绘制(它被多边形边缘“剪切”)。

纹理坐标在纹理的左上角到右下角的范围内指定为0.0到1.0(在U和V轴上 - 水平和垂直)。

如果使用顶点缓冲区绘图,XNA包含一些内置顶点结构,如VertexPositionTextureVertexPositionColorTexture,可以指定TextureCoordinate值。

如果您使用自己的顶点结构,请在指定VertexElementUsage.TextureCoordinate时使用VertexElement。如果您要创建自己的着色器,则该值将显示在TEXCOORD0中(对于使用指数0)。


如果您只是使用SpriteBatch绘制矩形,请在致电sourceRectangle时指定Draw

答案 1 :(得分:0)

听起来你应该在Draw方法上使用重载(我知道你出于某种原因不想这样做,但是出于这个原因这很好):

public void Draw (
     Texture2D texture,
     Vector2 position,
     Nullable<Rectangle> sourceRectangle,
     Color color,
     float rotation,
     Vector2 origin,
     Vector2 scale,
     SpriteEffects effects,
     float layerDepth
)

sourceRectangle,scale参数和origin应该足够了。不要在内存中修改纹理,这样做的成本相对较高(特别是每帧都要这样做!)

http://msdn.microsoft.com/en-us/library/bb196420(v=xnagamestudio.31).aspx

你能解释为什么你不想在Draw()中缩放吗?