- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我们使用 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/
如果我将两个纹理传递给 HLSL 着色器,我还需要两个 SamplerState 吗?我对 SamplerStates 的实际工作方式有些困惑。我从不实例化它们或任何东西,我只是调用 Tex.Samp
我的像素着色器有问题,它编译但不渲染任何东西,而是 Directx 给出了这个错误: D3D11 错误:ID3D11DeviceContext::DrawIndexed:像素着色器单元期望将配置为默认
我们使用 SamplerState.LinearWrap 来平铺我们游戏中的很多东西。我们的游戏共享一个 SpriteBatch 对象,并像这样调用 Begin(): _spriteBatch.Beg
我想知道是否可以获取 Texture2D 和 SamplerState 的变量名称。我知道我可以通过效果框架获得这些。但我正在寻找一种没有这个框架的方法。就像使用 Constantbuffers (S
我是一名优秀的程序员,十分优秀!