1

我们SamplerState.LinearWrap过去常常在游戏中平铺很多东西。我们的游戏共享一个SpriteBatch对象,调用Begin()如下:

_spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.LinearWrap, DepthStencilState.None, _rasterState);

这适用于 Windows 上的 XNA 以及 iOS 上的 MonoGame。

问题是,在 Android 上,如果打开 LinearWrap,任何非二次幂大小的纹理都会呈现为黑色矩形,即使它是以不需要包裹的方式绘制的。如果我们切换到SamplerState.LinearClamp(默认),这些纹理在 Android 上不再呈现黑色。通常,如果您尝试平铺它们(在其他平台上),两个纹理的非幂次方会留下空白空间,直到下一个最大的二次方幂。

这是 Android 上 OpenGL 的限制,还是 MonoGame 中的问题?我不想将每个纹理的大小调整为 2 的幂,但如果这是唯一的选择(或者有充分的理由),我们会这样做。

4

2 回答 2

2

通过 MonoGame 挖掘,我在 ESTexture2D.cs 中发现了这个:

                _width = imageSource.Width;
                _height = imageSource.Height;

                // There are rules for npot textures that we must abide by (wrap = ClampToEdge and filter = Nearest or Linear)
                if (!MathHelper.IsPowerOfTwo(_width) || !MathHelper.IsPowerOfTwo(_height))
                {
                    //filter = ALL11.Linear;
                    //wrap = ALL11.ClampToEdge;
                    _width = (int)Math.Pow(2, Math.Min(10, Math.Ceiling(Math.Log10(imageSource.Width) / Math.Log10(2))));
                    _height = (int)Math.Pow(2, Math.Min(10, Math.Ceiling(Math.Log10(imageSource.Height) / Math.Log10(2))));
                }

我注释掉了 和 的更改,filter并将wrap大小调整为 2 的幂。

这解决了我的问题,但我不确定是否是 MonoGame 的有效修复。不知道你用了会有什么效果SamplerState.LinearClamp

于 2012-08-01T18:43:59.210 回答
2

我相信这已在develop3d 分支中修复。

D.

于 2012-08-06T17:21:27.337 回答