正如标题所述,即使考虑Texture2D
,我也会尝试调整SpriteBatch.Draw()
的大小。我这样做的原因是我试图填充一个任意多边形,用Vector2D
s定义的顶点布局,任意Texture2D
。
我正在考虑的是创建适合多边形的矩形,将Texture2D
缩放到该矩形,然后通过Texture2D
'{使多边形外部的像素透明{1}}和GetData<>()
。
我已经找到了适合多边形的矩形,但有没有办法调整SetData<>()
的大小,或者我是以完全错误的方式进行的?谢谢!
答案 0 :(得分:1)
你的方式错了。设置纹理数据很昂贵。 (而且过滤也可能存在一些问题。)
您要做的是设置您正在绘制的顶点的纹理坐标(“UV坐标”)。这将导致纹理的特定位置出现在多边形的顶点。然后,那些落在多边形之外的纹理根本就不会被绘制(它被多边形边缘“剪切”)。
纹理坐标在纹理的左上角到右下角的范围内指定为0.0到1.0(在U和V轴上 - 水平和垂直)。
如果使用顶点缓冲区绘图,XNA包含一些内置顶点结构,如VertexPositionTexture
和VertexPositionColorTexture
,可以指定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()中缩放吗?