0

正如标题所述,我Texture2D什至在考虑SpriteBatch.Draw(). 我这样做的原因是我试图填充一个任意多边形,该多边形由Vector2Ds 定义的顶点布置,具有任意Texture2D.

我在想的是创建适合多边形的矩形,将 缩放Texture2D到该矩形,然后通过Texture2D'sGetData<>()和使多边形外部的像素透明SetData<>()

我已经到了找到适合多边形的矩形的地步,但是有没有办法调整Texture2D它的大小,或者我是在完全错误的方式?谢谢!

4

2 回答 2

1

你的做法是错误的。设置纹理数据是昂贵的。(过滤也可能存在一些问题。)

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

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

如果您使用顶点缓冲区进行绘图,XNA 包含一些内置的顶点结构,例如VertexPositionTexture允许VertexPositionColorTexture您指定一个TextureCoordinate值。

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


如果您只是用 绘制矩形,则在调用时SpriteBatch指定 a 。sourceRectangleDraw

于 2012-06-24T00:39:53.123 回答
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() 中进行缩放吗?

于 2012-06-23T14:21:16.860 回答