私は、Windows の MonoGame GL で非常に単純なはずのことを達成しようとしています。つまり、PNG ファイルからテクスチャをロードし、それをスプライトとして画面にレンダリングします。これまでのところ、私はこれに多くの問題を抱えています。次のコード (F#) を使用して PNG を Texture2D にロードしています。
use file = System.IO.File.OpenRead("testTexture.png")
this.texture <- Texture2D.FromStream(this.GraphicsDevice, file)
次に、次を使用してレンダリングします。
this.spriteBatch.Begin(SpriteSortMode.Immediate, BlendState.NonPremultiplied);
this.spriteBatch.Draw(this.texture, Vector2.Zero, Color.White)
this.spriteBatch.End()
問題は、アルファ チャネルでのある種の奇妙な効果です。チャネルが事前に乗算されていないかのように見えますが、正確に何が起こっているのかを確認することはできません。ただし、公式の XNA ライブラリを使用すると、まったく同じコードが完全にレンダリングされることは注目に値します。この問題は、バージョン 3.0 と 3.2 でテストした MonoGame でのみ発生し、どちらも同じ問題を抱えています。
問題を説明するために、MonoGame でテスト用の PNG をレンダリングすると、次のようになります。
各画像の背景は、コーンフラワー ブルー、そしてそれぞれ純粋な赤、緑、青です。赤い背景の画像で、テクスチャの赤い線の周りに暗い輪郭が表示されていることに注意してください。線と背景は両方とも純粋な赤であるため、このアウトラインは存在しないはずです。青色の背景の画像の青色の線の周りで同じことが発生しますが、緑色の背景の画像では発生しないことに注意してください。その画像では、緑色の線が緑色の背景に溶け込んでいます。
以下は、公式の XNA ライブラリを使用してまったく同じファイルをレンダリングする方法です。
背景が同じ色の場合、青、緑、赤の線がどのように背景に溶け込んでいるかに注目してください。これは正しい動作です。
同じコードが XNA と MonoGame の両方で異なる動作をすることを考えると、フレームワークにバグがあるに違いないと思います。バグがどこにあり、どのような性質のものであるかについて、誰かが推測できますか? 簡単に修正できる場合は、そのバグを自分で修正するのが最善の解決策かもしれません。
それに加えて、PNGをロードしてMonoGameの画面に正しくレンダリングする方法を本当に学びたいだけです。これをやりたいと思ったのは私が最初ではないはずです。シンプルにするために、可能な限りコンテンツ パイプラインは避けたいと思います。
アップデート
この問題の性質を理解しようとして、さらに掘り下げました。testTexture.png ファイルを変更して、アルファ ブレンディングの問題がより明確になるようにしました。この新しいテクスチャ ファイルを使用した後、不適切な MonoGame レンダリングのスクリーンショットを撮り、それを別のカラー チャネルで表示しました。何が起こっているのか、私はかなり困惑しています。最初は無視された単純なケースかもしれないとBlendState.NonPremultiplied
思っていましたが、私が見ているのはそれよりも複雑に見えます. 特に、緑のカラー チャネルは、青と赤のチャネルとは異なる方法でブレンドされているように見えます。これは、私が話していることに関するスクリーンショットと説明をまとめたかなり大きな PNG 画像です。
i.imgur.com/CEUQqm0.png
明らかに、MonoGame for Windows GL にある種のバグがあり、おそらく私がこれを試していない他のエディションにも何らかのバグがあります (ただし、検証済みのものを確認したいと思います)。ここで何が起こっているのか知っていると思う人がいたら、私に知らせてください。
最後に、私が抱えている問題を再現するためのプロジェクト ファイルを次に示します。
mega.co.nz/#!llFxBbrb!OrpPIn4Tu2UaHHuoSPL03nqOtAJFK59cfxI5TDzLyYI