小编bat*_*tle的帖子

透明度问题从Monogame中的PNG加载纹理

我试图在Windows上的MonoGame GL中完成我认为非常简单的事情.那就是从PNG文件加载纹理并将其作为精灵渲染到屏幕上.到目前为止,我遇到了很多麻烦.我正在使用以下代码(F#)将PNG加载到Texture2D:

    use file = System.IO.File.OpenRead("testTexture.png")
    this.texture <- Texture2D.FromStream(this.GraphicsDevice, file)
Run Code Online (Sandbox Code Playgroud)

然后渲染:

    this.spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.NonPremultiplied);
    this.spriteBatch.Draw(this.texture, Vector2.Zero, Color.White)
    this.spriteBatch.End()
Run Code Online (Sandbox Code Playgroud)

这个问题是对alpha通道有一些奇怪的影响,好像有些东西没有通过alpha预乘或某些东西,但我无法准确确定发生了什么.值得注意的是,完全相同的代码使用官方XNA库完美呈现.这个问题只出现在MonoGame中,我使用3.0和3.2版进行了测试,两者都有相同的问题.

这是在MonoGame中渲染测试PNG来说明问题:

http://i.imgur.com/Dny26gI.png

每个图像中的背景是矢车菊蓝色,然后分别是纯红色,绿色和蓝色.请注意,在带有红色背景的图像中,您可以看到纹理中红色线条周围的黑色轮廓.由于线条和背景都是纯红色,因此不应该出现此轮廓.请注意,具有蓝色背景的图像中的蓝线周围会出现相同的情况,但绿色背景的图像中则不会出现相同的情况.在该图像中,绿线与绿色背景融为一体.

下面是使用官方XNA库完全相同的文件呈现方式.

http://i.imgur.com/2Rtqhuk.png

注意当背景颜色相同时,蓝色,绿色和红色线如何融入背景.这是正确的行为.

鉴于相同的代码在XNA和MonoGame中表现不同,我相信框架中必定存在错误.任何人都可以对这个错误的位置和性质有什么好的猜测吗?如果这是一个简单的解决方案,那么最好的解决方案可能就是自己解决这个问题.

除此之外,我真的只是想学习一种方法,我可以简单地加载PNG并将其正确地渲染到MonoGame的屏幕上.我敢肯定,我不能成为第一个想要这样做的人.我想尽可能避免使用内容管道,只是为了简单起见.

更新

我已经做了一些挖掘,试图弄清楚这个问题的本质.我已经更改了testTexture.png文件,以便更多地揭示alpha混合问题.使用这个新的纹理文件后,我拍摄了不正确的MonoGame渲染的截图,并在其单独的颜色通道中查看.发生的事情让我非常困惑.我最初虽然可能是一个BlendState.NonPremultiplied被忽略的简单案例,但我所看到的看起来更复杂.除此之外,绿色通道似乎与蓝色和红色通道的混合方式不同.这是一个相当大的PNG图像,它是关于我正在谈论的截图和解释的汇编:

i.imgur.com/CEUQqm0.png

显然,MonoGame for Windows GL中存在某种错误,可能还有其他版本我没试过这个版本(虽然我有兴趣看看已经验证过).如果有人认为他们知道这里可能会发生什么,请告诉我.

最后,这是重现我遇到的问题的项目文件:

mega.co.nz/#!llFxBbrb!OrpPIn4Tu2UaHHuoSPL03nqOtAJFK59cfxI5TDzLyYI

graphics rendering sprite monogame

2
推荐指数
1
解决办法
2658
查看次数

从单声道的android上读取本地存储的图像文件

在用于Android的单声道中,我有一个应用程序,可以将图像保存到本地存储以进行缓存.当应用程序启动时,它会尝试从缓存中加载图像,然后再尝试从Web加载它们.

我目前很难找到一种从本地存储中读取和加载它们的好方法.

我目前正在使用与此类似的东西:

        List<byte> byteList = new List<byte>();
        using (System.IO.BinaryReader binaryReader = new System.IO.BinaryReader(context.OpenFileInput("filename.jpg")))
        {
            while (binaryReader.BaseStream.IsDataAvailable())
            {
                byteList.Add(binaryReader.ReadByte());
            }
        }
        return byteList.toArray();
Run Code Online (Sandbox Code Playgroud)

OpenFileInput()返回一个不给我一个长度的流,所以我必须一次读取一个字节.它也无法寻求.这似乎导致图像加载速度比它们的速度慢得多.通过比较,从Resrouce.Drawable加载图像几乎是即时的,但是我的方法有一个非常明显的暂停,可能是300毫秒,用于加载8kb文件.这似乎是一项非常明显的任务,但是我已经尝试了许多解决方案并且搜索了很多建议,但无济于事.

我还注意到,当没有在UI线程上运行时,此代码似乎会因EndOfStream异常而崩溃.

任何帮助将非常感激

c# android xamarin.android

0
推荐指数
1
解决办法
4629
查看次数

标签 统计

android ×1

c# ×1

graphics ×1

monogame ×1

rendering ×1

sprite ×1

xamarin.android ×1