2012-05-11 4 views
1

그래서 XNA의 RenderTarget2D에 내 게임 플레이를 렌더링하려고하므로 쉐이더를 장면에 적용 할 수 있습니다. 그것은 어느 정도까지는 작동하지만, 255가 아닌 다른 알파 수준으로 그려진 것은 색이 자주색으로 보입니다. 알파 효과가 작동하지만 보라색 색조가 있습니다. 나는 해결책을 찾기 위해 노력했다. 내가 볼 수있는 유일한 것은 전체 화면이 보라색으로 렌더링되거나 알파가 보라색으로 대체된다는 점이다.RenderTarget2D는 모든 알파 보라색에 색을 입힌다

내 문제는 확실히 하나 그 ...

Tinting purple!

이 내가 무슨 일이 일어나고 있는지를 표시하도록 던진 장면입니다. 알 수 있듯이 알파 효과는 작동하지만 오브젝트는 자주색으로 표시됩니다.

gameTarget = new RenderTarget2D(GraphicsDevice, (int)screenSize.X, (int)screenSize.Y, 1, SurfaceFormat.Color, RenderTargetUsage.PreserveContents); 

gameDepthBuffer = new DepthStencilBuffer(GraphicsDevice, (int)screenSize.X, (int)screenSize.Y, GraphicsDevice.DepthStencilBuffer.Format); 

이 내가 사용하고 초기화는 다음과 같습니다

여기에 내 렌더링 코드를 게시 할 부분입니다.

GraphicsDevice g = GraphicsDevice; 
DepthStencilBuffer d = g.DepthStencilBuffer; 
g.SetRenderTarget(0, gameTarget); 
g.DepthStencilBuffer = gameDepthBuffer; 
g.Clear(Color.Black); 
GameBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.SaveState); 
     level.Draw(GameBatch); 

GameBatch.End(); 
g.SetRenderTarget(0, null); 
g.DepthStencilBuffer = d; 
GameBatch.Begin(SpriteBlendMode.AlphaBlend, SpriteSortMode.Immediate, SaveStateMode.SaveState); 
     if (renderEffect != null) 
     { 
      renderEffect.Begin(); 
      renderEffect.CurrentTechnique.Passes[0].Begin(); 
     } 
     Sprite.Draw(GameBatch, gameTarget.GetTexture(), new Rectangle(0, 0, (int)assumedSize.X, (int)assumedSize.Y), Color.White); 
     if (renderEffect != null) 
     { 
      renderEffect.CurrentTechnique.Passes[0].End(); 
      renderEffect.End(); 
     } 
     GameBatch.End(); 

renderEffect는 스프라이트 (가변 해상도에 대응하는) 상정 화면 크기에 대하여 도면을 다루는 클래스 효과 파일이다.

저는 XNA 3.1에서 일하고 있습니다. 4.0으로 지금 사용해야한다고 알고 있지만, 특정 상황에서 도움이되는 3.1에 대한 책을 가지고 있기 때문에 나는 아닙니다.

어쨌든, 여기에 몇 가지 도움을 주시면 감사하겠습니다 ...

+0

는 [gamedev]에서이 일을 통해 물어 더 좋을 수 있음 (http://gamedev.stackexchange.com/) – musefan

+0

아마도,하지만 난 존재를 인식하지 않았다 당신이 링크를 게시 할 때까지 gamedev 섹션의. – Hoeloe

답변

1

고정! 좀 알파 매개 변수를 설정하는 데 필요한 :

GraphicsDevice.RenderState.SeparateAlphaBlendEnabled = true; 
GraphicsDevice.RenderState.AlphaDestinationBlend = Blend.One; 
GraphicsDevice.RenderState.AlphaSourceBlend = Blend.SourceAlpha; 
GraphicsDevice.RenderState.SourceBlend = Blend.SourceAlpha; 
GraphicsDevice.RenderState.DestinationBlend = Blend.InverseSourceAlpha; 
3

일반적으로 보라색은 렌더 타겟이 해제되어있는 기본 색상입니다.

염두에두고, 렌더링 대상을 null으로 설정 한 후 Back Buffer를 지우지 않았 음을 알았습니다. 따라서 코드는 다음과 같아야합니다.

g.SetRenderTarget(0, null); 
g.Clear(Color.Transparent);//or black 
+0

고마워요, 그 속임수를했습니다. 그냥 TransparentBlack으로 설정하면 효과가있었습니다. – Hoeloe

+0

사실, 그것을 다시 보니, 이제 모든 것이 검은 색으로 변하고 있습니다. XNA 3.1에는 "Color.Transparent"가 없으므로 어떻게해야할지 모르겠습니다. – Hoeloe

+0

잠깐, 고쳐 줘. 나는 내 대답을 올릴거야. – Hoeloe