XNA 4.0에서 알파 투명도를 올바르게 수행하려면 어떻게해야합니까?


14

좋아, 나는 이것에 관한 몇 가지 기사, 튜토리얼 및 질문을 읽었다. 대부분 내 문제를 해결하지 못하는 동일한 기술을 가리 킵니다. 반투명 스프라이트 (texture2D)를 만들고 다른 스프라이트를 오버레이 할 수있는 기능이 필요합니다.

내가 찾은 코드 샘플로 다소 달성 할 수는 있지만 결과에 만족하지 않으며 이것을 수행 할 수있는 방법이 있다는 것을 알고 있습니다. 모바일 프로그래밍 (BREW)에서 우리는 구식으로 만들었고 실제로 렌더링 전에 각 픽셀의 투명성을 확인했습니다.

이 경우 아래의 스프라이트를 그 위의 알파와 혼합하여 렌더링하는 것 같습니다. 이것은 내가 텍스처를 렌더링하는 방식의 인공물 일 수 있지만, 앞에서 말했듯이 모든 예제는이 하나의 기술을 가리 킵니다. 더 진행하기 전에 예제 코드를 붙여 넣습니다.

    public void Draw(SpriteBatch batch, Camera camera, float alpha)
    {
        int tileMapWidth = Width;
        int tileMapHeight = Height;

        batch.Begin(SpriteSortMode.Texture,
            BlendState.AlphaBlend,
            SamplerState.PointWrap,
            DepthStencilState.Default,
            RasterizerState.CullNone,
            null, camera.TransformMatrix);

        for (int x = 0; x < tileMapWidth; x++)
        {
            for (int y = 0; y < tileMapHeight; y++)
            {
                int tileIndex = _map[y, x];

                if (tileIndex != -1)
                {
                    Texture2D texture = _tileTextures[tileIndex];

                    batch.Draw(
                        texture,
                        new Rectangle(
                            (x * Engine.TileWidth),
                            (y * Engine.TileHeight),
                            Engine.TileWidth,
                            Engine.TileHeight),
                        new Color(new Vector4(1f, 1f, 1f, alpha )));
                }
            }
        }

        batch.End();

    }

보시다시피,이 코드에서는 오버로드 된 SpriteBatch.Begin 메소드를 사용하고 있는데, 그중에서도 블렌드 상태가 필요합니다. 나는 그것이 내 문제라고 거의 긍정적이다. 스프라이트를 블렌드하고 싶지 않고 알파가 0 일 때 투명하게하기를 원합니다.이 예제에서는 알파를 0으로 설정할 수 있지만 낮은 z 순서 스프라이트를 통해 두 타일을 모두 렌더링합니다. 블렌딩. 이것은 원하는 효과가 아니며, 더 높은 z 순서 스프라이트가 페이드 아웃되고 그 아래의 색상에 그런 방식으로 영향을 미치지 않기를 바랍니다.

XNA 개발에 익숙하지 않아서 여기에 나올 수 있으므로 잘못된 토끼 구멍을 밟을 때 자유롭게 올바른 방향으로 조종하십시오.

티아


왜 '적절한'알파입니까? 알파 지원이 있고 알파 지원이 없습니까?
공산주의 오리

'edit'을 눌러 제목을 편집 할 수 있어야하며 제목이 맨 위에 있어야합니다. 무언가가 변경되지 않는 한.
공산주의 오리

답변:


18

문제를 올바르게 따르는 경우 Begin with BlendState.NonPremultiplied를 호출하십시오. 이 기사는 또한 XNA에서 알파 블렌딩이 어떻게 작동하는지에 대해 설명 할 수 있습니다.

https://web.archive.org/web/20130208130323/http://blogs.msdn.com/b/shawnhar/archive/2010/04/08/premultiplied-alpha-in-xna-game-studio-4- 0.aspx


그러나 NonPremultiplied가 트릭을 수행하는 것처럼 보입니다 (적어도 게시 한 링크에 따라). 나는 오늘 밤 집에 도착할 때까지 기다렸다가 받아 들일 것입니다. 그러나 이것이 답인 것처럼 보입니다. 감사!
Soshimo

그 트릭이었습니다. 나는 그들이 4.0에서 그것을 바꾸 었다는 것을 몰랐다. 당신이 연결 한 기사는 매우 예시 적이었습니다. 감사합니다.
Soshimo

1
+1 감사합니다! 알파가 부분적으로 만 작동하는 이유를 알아 내려고 온라인에서 찾고있었습니다. 이것은 그것을 해결했다. Google에서 사용하는 용어는 Spritebatch Opacity였습니다.이 용어는 이제 고글 러 가이 답변을 찾는 데 도움이되기를 바랍니다.
AttackingHobo

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.