Sombreador de vidro refrativo

10

Eu tenho um piso hexagonal infinito, gerado pelo mosaico de uma grade de pontos em um par de sombreador de mosaico:

insira a descrição da imagem aqui

Observe que se trata de uma estrutura de arame plana - as "sombras" são um truque de iluminação:

insira a descrição da imagem aqui

Agora, eu gostaria que isso parecesse vidro grosso e refrativo, mas não tenho certeza de como proceder.

A primeira coisa que veio à mente é

  1. definir um uniforme contendo a "espessura" solicitada dos blocos
  2. Ao calcular a iluminação, use a lei de Snell para calcular o comprimento do caminho óptico que um raio percorreria o bloco hexadecimal, se fosse realmente tão espesso quanto o uniforme de "espessura" diz, e somar o alfa nesse comprimento. Isso daria transparência, mas não lida com coisas como reflexão interna / TIR, etc.

insira a descrição da imagem aqui

Ainda não tentei isso, então não tenho certeza de qual seria o resultado visual.

Por fim, para esse nível em particular, estou tentando obter esse visual hexagonal de vidro usado no Tron: Legacy durante a batalha de discos. ( Veja esta imagem para um exemplo .)

Sugestões?

3Dave
fonte
1
Você pode explicar mais o visual que está tentando alcançar? A foto Tron mostra principalmente reflexão, AFAICT, não refração - você não pode ver através das placas de piso na maioria das fotos. Supondo que você não queira apenas uma superfície brilhante, o que você quer ver através do chão? Você deseja mostrar uma textura de subpavimento? Existe uma cena inteira debaixo do chão (como em Tron)? Ou você quer que seja mais como vidro fosco, onde você não pode ver uma imagem distinta, mas tem um efeito de dispersão na superfície?
Nathan Reed
Espalhamento de subsuperfície, embora eu não soubesse como é chamado. Facilita a busca no Google. :)
3Dave

Respostas:

4

Este artigo na GPU Gems detalha a refração, o que pode fornecer bons resultados

(a) Transparência completa (b) Vidro refrativo

No sentido mais básico

O primeiro passo da técnica básica de refração é transformar a geometria da cena em uma textura, pulando todas as malhas de refração. Essa textura pode ser usada para determinar quais objetos são visíveis atrás dos objetos de refração que serão renderizados em uma passagem subsequente. Denotamos essa textura como S.

O segundo passo é renderizar as malhas de refração, procurando valores da textura S com uma perturbação aplicada para simular a aparência de refração. A perturbação pode ser alcançada usando um mapa N normal, onde os componentes vermelho e verde (XY) do mapa normal são usados ​​e redimensionados por algum valor pequeno para adicionar um deslocamento nas coordenadas de textura projetadas. Essa abordagem é simples de implementar em um shader:

  1. buscar a textura N
  2. use os componentes XY dimensionados por um valor pequeno (como 0,05)
  3. adicione esse valor de deslocamento nas coordenadas projetadas de textura para S

A listagem a seguir mostra um sombreador que demonstra essa abordagem

half4 main(float2 bumpUV : TEXCOORD0,
  float4 screenPos : TEXCOORD1,
  uniform sampler2D tex0,
  uniform sampler2D tex1,
  uniform float4 vScale) : COLOR
{
  // fetch bump texture, unpack from [0..1] to [-1..1]
  half4 bumpTex=2.0 * tex2D(tex0, bumpUV.xy) - 1.0;

  // displace texture coordinates    
  half2 newUV = (screenPos.xy/screenPos.w) + bumpTex.xy * vScale.xy;

  // fetch refraction map
  return tex2D(tex1, newUV);
}

As próximas imagens ilustram estas três etapas

As três etapas listadas no sombreador acima

Existem técnicas mais avançadas no mesmo artigo que podem obter uma aparência muito mais atraente


Para um efeito semelhante no Unity, você pode dar uma olhada na página da wiki The Refraction Shader

codemonkey
fonte
3

Tomarei a imagem que você mostrou como referência para como imagino o efeito. O algoritmo em que consigo pensar é simples:

  1. Renderize o ambiente em uma textura de mapa de cubo para simular a reflexão do ambiente.
  2. Aplique a textura do mapa do cubo em um plano que represente a camada abaixo do piso refrativo. Não renderize o avião ainda.
  3. Renderize o plano em uma textura, uma textura 2D normal.
  4. Passe a textura para o shader de refração usado para renderizar o piso de refração.
  5. Agora renderize as malhas / piso refrativos com um shader de refração.

Em relação ao shader de refração, para simular o vidro que você pode fazer

  • Use o termo fresnel para simular a reflexão e a refração.
  • Use o mapa normal / normal para fazer uma busca de textura.

Eu apenas pensei na idéia, então não a testei. Tenho certeza de que precisa de mais trabalho, talvez o faça quando voltar do trabalho.

concept3d
fonte
Abordagem interessante - vou ter que mexer nessa por um tempo. Obrigado pela contribuição.
3Dave