2012-05-10 3 views
2

그래서 XNA에서 게임을 만들려고하고 있습니다. 레벨에 픽셀 쉐이더를 적용하여 게임 플레이 화면에 효과를 추가 할 수 있습니다. 셰이더 자체는 훌륭하게 작동하지만 실제로 성능을 저하시키는 단점이 있습니다. 셰이더가 활성화되어있는 한 화면에 그려지는 모든 것은 마치 알파 채널로 그려져있는 것처럼 동작합니다. Color 클래스에 내장 된 XNA를 사용하여 많은 것을 그리는 중이며 대부분 알파가 다양합니다. 그러나 셰이더는이 모든 것을 무시하는 것처럼 보입니다. 이것은 셰이더에서 소스를 반환 한 경우에도 발생합니다.색상에서 알파 채널을 제거하는 2D Pixel Shader

몇 가지 가능한 해결책을 발견했습니다. 이 중 첫 번째는 RenderTarget2D를 그리는 것이 었습니다.이 방법이이 문제를 해결했지만, 심지어 내가 들어가기를 원하지 않는 알파에 더 심각한 문제를 야기했습니다.

쉐이더의 알파 값으로 색상을 곱하는 것이 도움이되는 것처럼 보였습니다. 그러나 그 차이는 전혀 없었습니다. 따라서 알파 값 입력은 항상 1로 읽혀집니다.

여기 내 문제를 설명하기 위해 일부 이미지입니다

This is the result with the shader activeThis is what it's supposed to look like

바라건대, 누군가가이 문제를 해결하는 방법을 알고있다.

+0

쉐이더 코드를 게시하십시오. –

+0

나는 더 많은 테스트를했습니다. XNA의 SpriteBatch.Draw 메서드에서 색상이 변경되면 "Text"가 사용되어 모든 텍스처가 그려집니다. 이것은 나를 위해 매우 문제가됩니다. – Hoeloe

+0

예, 픽셀 쉐이더가 알파 값을 무시하거나 통과하지 않으면 해당 쉐이더를 사용할 때 그 효과가 나타납니다. 셰이더 코드를 게시하십시오. –

답변

0

Draw() 메소드에서 쉐이더를 호출하는 메소드 (예 : DrawUserIndexedPrimitives 등)를 호출하기 전에 GraphicsDevice.BlendState = BlendState.NonPremultiplied;을 호출해야합니다.

그렇지 않으면 프레임 워크는 알파 값이 미리 곱셈 된 것으로 가정하고 RGB 값을 프레임 버퍼로 바로 blit 할 수 있다고 가정합니다.

관련 문제