Em deste Overwatch vídeo gameplay , escudo do personagem acende branco em áreas que estão perto de geometria de outros objetos.
Observe as bordas brancas no escudo azul, próximo ao chão, paredes e pilar.
Acredito que o escudo tenha seu próprio modelo e o efeito seja feito com um sombreador, mas estou perdido tentando descobrir como traduzir o conceito de "proximidade" para a programação do sombreador.
fragment-shader
graphic-effects
intersection
Blue Bug
fonte
fonte
Respostas:
Um esboço geral:
Crie um mapa de profundidade da sua cena sem o escudo. Você pode obtê-lo de forma eficaz e gratuita, pois objetos transparentes geralmente são renderizados em uma passagem posterior de qualquer maneira. Caso contrário, você pode criar o mapa de profundidade renderizando a cena sem proteção em um RTT com um shader de profundidade.
Renderize sua cena normalmente, passe o mapa de profundidade para seu shader de escudo.
No sombreador, calcule a diferença na profundidade da cena da profundidade do fragmento de escudo e use essa diferença para modificar a cor do fragmento.
Demo
Eu escrevi uma demo WebGL simples disso.
Linha por linha
Vamos examinar o código do shader fragment em detalhes:
Prove o mapa de profundidade em cada fragmento. Lembre-se de dividir pelas dimensões da janela de exibição para converter seu fragmento do espaço da tela [0, largura / altura] em coordenadas normalizadas [0,0, 1,0]. Nesse ponto, se você simplesmente definir a cor do fragmento para o pixel do mapa de profundidade amostrado, ele terá a seguinte aparência:
O mapa de profundidade é em escala de cinza, para que você possa obter o valor de qualquer canal (usei
r
aqui).Você pode usar essa amostra de profundidade para encontrar a diferença entre a profundidade da cena e a profundidade do fragmento de escudo. Lembre-se de normalizar sua profundidade também, para passar de [zNear, zFar] (os planos próximos e distantes da sua câmera) para [0,0, 1,0].
smoothstep
faz isso muito bem. o1.0 -
é inverter o valor tal quesolidsDiff
seja 1,0 quando a diferença for o máximo (zFar - zNear) e 0,0 no mínimo (0,0).Observe que eu assumi que
solidsDepth
já estava normalizado no shader de profundidade que criou o mapa de profundidade.Você pode modificar o canal alfa do seu escudo, dependendo da diferença de profundidade. Aqui começamos com um alfa mínimo de
0.3
, em seguida, criamos um bom aumento acentuado de alfa à medida que nos aproximamos da0.0
diferença.O
- 0.005
deslocamento apenas adiciona uma margem branca para tornar a "interseção" mais espessa. Tente modificá-lo!E, finalmente, aplique esse alfa à cor do seu fragmento.
Aprimoramentos
Você pode fazer um escudo curvo, adicionar plasma para uma aparência de "escudo de energia" (demo) ou explorar efeitos apenas com as interseções exibidas (demo) .
O céuSua placa de vídeo é o limite!fonte
É apenas usando o mapa de profundidade. Renderiza o mundo, renderiza o escudo e faz uma diferença entre o valor z renderizado do escudo e o valor z do buffer de profundidade para colorir o pixel mais branco.
fonte
Não sei qual mecanismo, se houver, você está usando. Ou com qual idioma você está trabalhando. Ainda assim, a maioria do que você pode encontrar on-line não é difícil de transportar de um ambiente para o outro para alcançar o que você está procurando.
E certamente há material on-line que pode ser útil para você. Veja esta discussão relacionada ao Unity: http://www.superspacetrooper.com/2012/06/tutorial-force-field-weapon-impact-energy-dispersion/ e esta pergunta relacionada ao UE4: https: //answers.unrealengine. com / questions / 74858 / dynamic-forcefield-shader.html . Para um exemplo completo de shader, implementando esse efeito de escudo, de um debate bastante recente no Reddit, você pode ver: https://www.reddit.com/r/Unity3D/comments/3edi0n/does_any_one_knows_how_to_make_this_shield_effect/ E para um tutorial que não é exatamente sobre isso, mas está relacionado o suficiente para ser de interesse: http://www.nightbox-studios.com/2015/09/05/assets-shield-effect-scripts-for-texture3d-perlin-noise-shader/
Além disso, aqui estão os links para três perguntas relacionadas feitas anteriormente neste site, que provavelmente serão de grande ajuda para entender os conceitos por trás do que você deseja alcançar:
Alargamento do escudo da nave espacial
Como implementar um escudo de energia da guerra nas estrelas no jogo
Efeito de escudo XNA com um problema de esfera primitiva
Por fim, existem algumas implementações interessantes de shaders de escudo no Unity e no Unreal Engine em suas respectivas lojas virtuais, se você estiver usando algum desses mecanismos. Eles geralmente são ativos pagos, é claro, mas quase sempre são de código aberto após a compra - e geralmente são baratos. Mesmo que você não use esses mecanismos, esses recursos podem ajudar a brincar e aprender.
Espero que ajude.
fonte