gpt4 book ai didi

c# - MonoGame - Android SamplerState.LinearWrap

转载 作者:太空宇宙 更新时间:2023-11-03 21:57:10 31 4
gpt4 key购买 nike

我们使用 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))));
}

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

这解决了我的问题,但我不确定是否对 MonoGame 有效。我不知道如果您使用 SamplerState.LinearClamp 会有什么影响。

关于c# - MonoGame - Android SamplerState.LinearWrap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11763826/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com