我们使用 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 的幂,但如果这是唯一的选择(或者有充分的理由这样做),我们会这样做。
最佳答案
通过 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
会有什么影响。
关于c# - MonoGame - Android SamplerState.LinearWrap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11763826/