Estou procurando uma maneira de renderizar todos os pixels não transparentes em um sprite em branco sólido (para "piscar" o sprite em branco quando o jogador sofrer danos, etc.). Este é no Windows Phone 7.
Eu estava usando um sombreador personalizado muito simples para fazer isso no XNA 3.1, mas o WP7 não oferece suporte a eles e é difícil encontrar uma alternativa.
Agradeço qualquer ajuda ou sugestão. Eu prefiro não ter que criar manualmente uma cópia branca sólida de cada sprite no meu jogo.
xna
shaders
windows-phone-7
Ryan McD
fonte
fonte
Respostas:
Método 1
Você não precisa criar uma versão branca sólida de todos os sprites do seu jogo manualmente - você também pode automatizar o processo no tempo de carregamento. Em outras palavras, você pode usar
Texture2D.GetData()
para acessar os pixels de sua textura (e recuperá-los como simplesColor[]
), iterar sobre eles substituindo qualquer pixel não transparente por branco sólido e salvá-lo em uma nova textura usando eTexture2D.SetData()
.Método 2
Tentei brincar,
BlendState
mas não consegui encontrar uma maneira de tornar tudo branco, pelo menos não dentro das limitações do perfil Reach. Mas se alguém souber uma maneira, me avise. O que encontrei, no entanto, foi uma maneira de fazer isso usando o buffer de estêncil e aAlphaTestEffect
classe interna. A ideia é a seguinte:Aqui está o código que eu usei:
(Etapa 1) Primeiro verifique se o backbuffer está sendo criado com espaço para um buffer de estêncil:
(Etapa 2) Crie uma textura branca 1x1 que será dimensionada para preencher a tela inteira:
(Etapa 3) E agora a parte mais difícil - renderizar. Bem, não é muito difícil, mas requer dois
DepthStencilState
objetos e umAlphaTestEffect
objeto. Você deve criá-los apenas uma vez.E o resultado:
fonte