2013-08-19 5 views
2

Windows에서 MonoGame GL에서 매우 단순해야하는 무언가를 수행하려고합니다. PNG 파일에서 텍스처를로드하여 화면에 요정. 지금까지 나는 이것에 많은 문제가있다. 나는 다음과 같은 코드가있는 Texture2D에 PNG를로드하고있어 (F 번호) :Monogame의 PNG에서 질감을로드하는 투명성 문제

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 라이브러리를 사용하여 정확히 동일한 코드가 완벽하게 렌더링된다는 것입니다. 이 문제는 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 파일을 변경하여 알파 블렌딩 문제에 대해 더 자세히 설명합니다. 이 새로운 텍스처 파일을 사용한 후 잘못된 MonoGame 렌더링의 스크린 샷을 가져 와서 별도의 색상 채널로 보았습니다. 무슨 일이 일어나고 있는지 꽤 당황 스럽다. 나는 처음에 무시되는 BlendState.NonPremultiplied의 간단한 경우 일지 모르지만, 내가 보는 것은 그것을 더욱 복잡하게 보입니다. 무엇보다도 녹색 색상 채널은 파란색과 빨간색 채널과 다르게 혼합 된 것처럼 보입니다. 다음은 내가 말하는 내용에 대한 스크린 샷과 설명을 요약 한 다소 큰 PNG 이미지입니다.

i.imgur.com/CEUQqm0.png

분명히 MonoGame for Windows GL에 버그가 있으며 아마도이 버전을 사용하지 않은 다른 버전이있을 수 있습니다. 아무도 그들이 여기에서 무슨 일이 일어날 지 알면 내게 알려주세요.

mega.co.nz/#!llFxBbrb!OrpPIn4Tu2UaHHuoSPL03nqOtAJFK59cfxI5TDzLyYI

+0

내 첫번째 추측은 SpriteBatch.Begin 호출에 BlendState.NonPremultiplied을 사용했을 것이다,하지만 난 당신이 이미 그 일을 참조하십시오

덕분에이에 올바른 방향으로 날을 가리키는 위해 dellis1972합니다. SpriteSortMode.Deferred로 변경하고 무슨 일이 일어나는지보십시오. 어쨌든, 나는 이것이 MonoGame의 버그 일 것임에 동의합니다. – craftworkgames

+0

@craftworkgames 시도했지만 아무런 차이가 없다 :(. 고마워. – battlebottle

답변

6

이 문제가 해결되었습니다

는 마지막으로, 여기에 프로젝트 파일이 나는 데 문제를 재현 할 수 있습니다. 다음과 같은 방법으로 MonoGame.Framework/Graphics/ImageEx.cs : 프레임 워크의 버그에서 발견 된이로 변경

internal static void RGBToBGR(this Image bmp) 
{ 
    System.Drawing.Imaging.ImageAttributes ia = new System.Drawing.Imaging.ImageAttributes(); 
    System.Drawing.Imaging.ColorMatrix cm = new System.Drawing.Imaging.ColorMatrix(rgbtobgr); 

    ia.SetColorMatrix(cm); 
    using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bmp)) 
    { 
     g.DrawImage(bmp, new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height), 0, 0, bmp.Width, bmp.Height, System.Drawing.GraphicsUnit.Pixel, ia); 
    } 
} 

이 문제를 해결 수행 RGBToBGR 변환, 그것은을 그릴 때

internal static void RGBToBGR(this Image bmp) 
{ 
    using (Bitmap bmpCopy = (Bitmap)bmp.Clone()) 
    { 
     System.Drawing.Imaging.ImageAttributes ia = new System.Drawing.Imaging.ImageAttributes(); 
     System.Drawing.Imaging.ColorMatrix cm = new System.Drawing.Imaging.ColorMatrix(rgbtobgr); 

     ia.SetColorMatrix(cm); 
     using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bmp)) 
     { 
      g.Clear(Color.Transparent); 
      g.DrawImage(bmpCopy, new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height), 0, 0, bmp.Width, bmp.Height, System.Drawing.GraphicsUnit.Pixel, ia); 
     } 
    } 
} 

은 무엇 일어나고있는 것은 변환중인 이미지 객체의 맨 위에있는 이미지의 변환 된 버전입니다. 이것은 이상한 효과를 일으키는 원인입니다. 지금까지 내가 할 수있는 유일한 방법은 다시 그려주기 전에 이미지 객체를 지우는 것입니다. 원본 이미지를 덮어 쓰면서 복사 한 비트 맵을 읽을 수 있도록 변환중인 비트 맵을 복사해야합니다. 방금 취소되었습니다. https://github.com/mono/MonoGame/issues/1946