Shader plástico translúcido HLSL

12

Estou tentando produzir um sombreador para replicar um objeto plástico branco com uma luz colorida dentro. Ou com um sombreador translúcido e se eu colocar uma luz dentro do objeto, a luz será exibida ou com um sombreador que imita o efeito de uma luz interna.

O efeito que estou procurando é como uma luz passando por um abajur semelhante a estas fotos:

texto alternativo texto alternativo texto alternativo

Idealmente, eu seria capaz de controlar a força e a cor da luz para fazê-la pulsar e girar através de algumas belas cores brilhantes de fluro

Embora eu não tenha certeza por onde começar!

Minha pergunta é: alguém conhece as técnicas que eu deveria estar pesquisando para poder produzir um sombreador ou ter um exemplo do mesmo sombreador / similar que eu possa usar como ponto de partida? Ou mesmo se você deseja fornecer um sombreador que possa fazer o trabalho

Tristan
fonte

Respostas:

10

Esse é um efeito conhecido como "Dispersão de sub-superfície".

Há um exemplo de implementação de espaço na tela disso no livro "GPU Pro: Advanced Rendering Techniques", adequado para uso em tempo real.

Tony McCrary
fonte
0

Eu não sei HLSL, então não posso dar uma resposta exata. O que você basicamente pode fazer é definir a cor de cada fragmento, dependendo da distância da fonte de luz (ignorando qualquer sombreamento automático).

No pseudocódigo, seria algo como isto:

fragment_color = light_intensity * transparent_color * lightsource_color / (atenuação * distance_to_lightsource ^ 2)

Você também pode usar um fator de atenuação linear, além do quadrado, para que a luz se espalhe mais.

Danik
fonte
0

A luz precisa se mover e o objeto precisa se deformar / animar? Se nenhum desses for o caso, uma maneira barata de fazer isso seria aplicar um mapa monocromático de textura no objeto que atua como uma máscara para a luz; no shader, você experimentaria essa textura, multiplique pela cor / intensidade da luz atual e adicione à cor de saída.

A pergunta óbvia de acompanhamento é como você irá gerar essa textura? Você pode tentar pintá-lo, se tiver acesso a um artista ou se puder pintar texturas. Também pode ser renderizado por uma ferramenta offline usando raytracing ou algo parecido. No entanto, não estou familiarizado o suficiente com as ferramentas de rastreamento de raios para dizer em detalhes como configurar isso.

Uma abordagem diferente pode ser escrever um shader que prove a luz por trás dele, usando a superfície invertida normal na equação de sombreamento difuso de Lambert; você o multiplicaria por algum fator de máscara, como 0,5 ou mais, e aumentaria a cor de saída. Isso permitiria mover dinamicamente a luz ou a geometria e não exigiria texturas, mas você provavelmente não obteria resultados tão bonitos quanto uma renderização offline.

Em relação à dispersão de subsuperfície: eu não acho que é exatamente isso que é desejado aqui, porque todos os algoritmos SSS para gráficos que eu vi são projetados para luz que sai de fora da superfície, salta um pouco e sai novamente, enquanto aqui a luz está dentro .

Nathan Reed
fonte