我正在使用XNA / MonoGame为我绘制一些2D多边形。我想要一个纹理我必须在多个多边形上重复,基于它们的X和Y坐标。
这是我的意思的一个例子:
我曾经认为做这样的事情会起作用(假设256x256像素纹理)
verticies[0].TextureCoordinate = new Vector2(blockX / 256f, (blockY + blockHeight) / 256f);
verticies[1].TextureCoordinate = new Vector2(blockX / 256f, blockY / 256f);
verticies[2].TextureCoordinate = new Vector2((blockX + blockWidth) / 256f, (blockY + blockHeight) / 256f);
verticies[3].TextureCoordinate = new Vector2((blockX + blockWidth) / 256f, blockY / 256f);
// each block is draw with a TriangleStrip, hence the odd ordering of coordinates.
// the blocks I'm drawing are not on a fixed grid; their coordinates and dimensions are in pixels.
但是这些块最终会“纹理化”,长水平线看起来像纹理已经非常拉伸。
(为了检查问题是否与TriangleStrips有关,我尝试删除最后一个顶点并绘制一个TriangleList为1 - 这在纹理上有相同的结果,并且只绘制了一半块的预期结果。 )
实现这种效果的正确方法是什么?
答案 0 :(得分:0)
我的数学是正确的,但似乎其他代码错了,我至少缺少一件重要的事情。
对于试图达到这种效果并遇到麻烦的其他人来说,也许是有用的提示:GraphicsDevice.SamplerStates[0] = SamplerState.LinearWrap;
^你需要那个代码。但重要的是,当您绘制精灵(SpriteBatch的Begin())时,您的SamplerState和其他设置将被重置,所以特别是如果您将多边形渲染代码抽象为小辅助函数,请注意您何时何地调用它们!例如:
spriteBatch.Begin();
// drawing sprites
MyFilledPolygonDrawer(args);
// drawing sprites
spriteBatch.End();
如果您这样做(假设MyFilledPolygonDrawer使用3D方法),您需要在绘制3D之前更改所有设置(例如SamplerState),并且可能之后(取决于您用于2D渲染的设置),所有这些都带来一点开销(并使你的代码更脆弱 - 你更可能搞砸了:P)
避免这种情况的一种方法是分别绘制所有3D内容和2D内容(所有内容,然后是所有其他内容)。
(在我的情况下,我没有以这种方式完全分离我的代码,但我能够通过使用2D方法绘制纯色矩形来至少减少2D和3D之间的某些切换 - {{3只有较不规则和/或纹理形状的3D东西。)