C# 在不绘制的情况下调整纹理2D的大小

C# 在不绘制的情况下调整纹理2D的大小,c#,xna,textures,C#,Xna,Textures,正如标题所述,在考虑SpriteBatch.Draw()之前,我正在尝试调整Texture2D的大小。我这样做的原因是我试图用任意的Texture2D填充一个任意多边形,该多边形由Vector2Ds定义的顶点布局 我想的是创建适合多边形的矩形,将Texture2D缩放到该矩形,然后通过Texture2D的GetData()和SetData()使多边形外部的像素透明 我已经找到了适合多边形的矩形,但是有没有办法调整纹理2d的大小,或者我的方法是完全错误的?谢谢 听起来您应该在Draw方法上使用重载

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

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


我已经找到了适合多边形的矩形,但是有没有办法调整
纹理2d
的大小,或者我的方法是完全错误的?谢谢

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

public-void-Draw(
纹理2D纹理,
矢量2位置,
可为空的sourceRectangle,
颜色,
浮动旋转,
矢量2原点,
矢量2标度,
精神效应,
浮动层深度
)
sourceRectangle、scale参数和原点应该足够了。不要在内存中修改纹理,这样做的成本相对较高(尤其是每帧都要修改!)


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

你做得不对。设置纹理数据非常昂贵。(过滤可能也存在一些问题。)

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

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

如果使用顶点缓冲区绘制,XNA包含一些内置的顶点结构,如
VertexositionTexture
VertexositionColorTexture
,允许您指定
TextureCoordination

如果您使用自己的顶点结构,请在指定
顶点元素时使用
顶点元素用法.textureCoordination
。如果您正在创建自己的着色器,则该值将在
TEXCOORD0
中公开(用于使用索引0)



如果您只是使用
SpriteBatch
绘制矩形,则在调用
Draw
时指定一个
sourceRectangle

如果您正在缩放,则当您将参数传递到绘制时,纹理2D将自动缩放。您的Texture2D在内存中应该保持不变,您的绘图应该转换textureKeep,记住使用CPU缩放它(就像您打算这样做)可能是个坏主意。例如,
Draw()
方法重载使用GPU。我想也有一种方法可以使用混合遮罩来修剪多边形的外部,只需使用最少的CPU资源。我可能只是不太理解事物,但基本上我想要的是一个新的纹理。我试图裁剪出纹理中不包含在多边形中的部分,但是如果纹理小于或大于多边形,我就不能这样做。我不会每帧都这样做。我只是在构造器里做。我将试着发布一个我想要的可视化示例。我想我理解你想要什么,但你为什么要这么做?仅仅使用完整的纹理,但不绘制部分纹理,是否存在问题?将其放大到多边形边界框大小,并将原点设置为0,0,并将比例设置为“我不跟随边界框的延伸”。如何使多边形外的像素不显示。对不起,我是XNA的新手。我可能正试图用错误的方式做事。是的,对不起,我太蠢了,完全忘记了SpriteBatch只画矩形——我明白你现在想做什么了。您是否考虑过使用三维绘图平面,但在平行投影中绘图?你可以用这个画出你想要的任何形状,看看这篇论坛帖子,它也有一个来自原始文章的链接:好的,我正在尝试,但它说Effect类没有示例中的任何属性/方法。我将此标记为答案,因为尽管它没有提供我所需要的一切,结果就是我用的。不过,我不得不做了一系列的研究才能最终使它发挥作用P
public void Draw (
     Texture2D texture,
     Vector2 position,
     Nullable<Rectangle> sourceRectangle,
     Color color,
     float rotation,
     Vector2 origin,
     Vector2 scale,
     SpriteEffects effects,
     float layerDepth
)