【问题标题】:MonoGame - Android SamplerState.LinearWrapMonoGame - Android SamplerState.LinearWrap
【发布时间】:2012-08-01 16:43:25
【问题描述】:

我们使用SamplerState.LinearWrap 来平铺我们游戏中的很多东西。我们的游戏共享一个SpriteBatch 对象,并像这样调用Begin()

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

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

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

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

【问题讨论】:

    标签: c# android .net xamarin.android monogame


    【解决方案1】:

    通过 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))));
                    }
    

    我注释掉了对filterwrap 的更改,并将大小调整为2 的幂。

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

    【讨论】:

      【解决方案2】:

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

      D.

      【讨论】:

      • 谢谢,Dominique,我们很快就会开始切换到develop3d。
      猜你喜欢
      • 1970-01-01
      • 2014-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多