Shader en plastique translucide HLSL

12

J'essaie de produire un shader pour reproduire un objet en plastique blanc avec une lumière colorée à l'intérieur. Soit en ayant un shader qui sera translucide et si je mets une lumière à l'intérieur de l'objet, la lumière sera visible à travers ou en ayant un shader qui simule l'effet d'une lumière à l'intérieur.

L'effet que je recherche est un peu comme une lumière traversant un abat-jour similaire à ces images:

texte alternatif texte alternatif texte alternatif

Idéalement, je serais en mesure de contrôler la force et la couleur de la lumière pour la faire pulser et tourner à travers de jolies couleurs fluro lumineuses

Même si je ne sais pas par où commencer!

Ma question est: est-ce que quelqu'un connaît les techniques que je devrais rechercher pour pouvoir produire un tel shader ou avoir un exemple du même shader / similaire que je peux utiliser comme point de départ? Ou même si vous voulez fournir un shader qui pourrait faire l'affaire

Tristan
la source

Réponses:

10

Il s'agit d'un effet connu sous le nom de «diffusion sous-surface».

Il existe un exemple d'implémentation de l'espace d'écran dans le livre "GPU Pro: Techniques de rendu avancées" qui convient à une utilisation en temps réel.

Tony McCrary
la source
0

Je ne connais pas HLSL donc je ne peux pas donner de réponse exacte. Ce que vous pouvez faire est de définir la couleur de chaque fragment en fonction de la distance de la source lumineuse (sans tenir compte de l'ombrage automatique).

En pseudocode, ce serait quelque chose comme ceci:

fragment_color = light_intensity * transparence_color * lightsource_color / (atténuation * distance_to_lightsource ^ 2)

Vous pouvez également utiliser un facteur d'atténuation linéaire en plus du carré pour que la lumière se diffuse davantage.

Danik
la source
0

La lumière doit-elle pouvoir bouger et l'objet doit-il pouvoir se déformer / animer? Si aucun de ces éléments n'est le cas, un moyen peu coûteux de le faire serait d'appliquer une carte de texture monochrome sur l'objet qui agit comme un masque pour la lumière; dans le shader, vous échantillonneriez cette texture, la multiplieriez par la couleur / intensité de la lumière actuelle et ajouterait à la couleur de sortie.

La question de suivi évidente est de savoir comment allez-vous générer cette texture? Vous pouvez essayer de le peindre, si vous avez accès à un artiste ou si vous pouvez peindre vous-même des textures. Il peut également être rendu par un outil hors ligne utilisant le raytracing ou un autre. Je ne connais pas suffisamment les outils de lancer de rayons pour vous expliquer en détail comment configurer cela, cependant.

Une approche différente pourrait être d'écrire un shader qui échantillonne la lumière derrière lui, en utilisant la normale de surface inversée dans l'équation d'ombrage diffus Lambert régulière; alors vous le multiplieriez par un facteur de masque comme 0,5 ou plus et ajouterait à la couleur de sortie. Cela permettrait de déplacer dynamiquement la lumière ou la géométrie, et ne nécessiterait aucune texture, mais vous n'obtiendriez probablement pas des résultats aussi beaux qu'un rendu hors ligne.

En ce qui concerne la diffusion souterraine: je ne pense pas que ce soit précisément ce que l'on veut ici parce que tous les algorithmes SSS pour les graphiques que j'ai vus sont conçus pour la lumière qui vient de l' extérieur de la surface, rebondit un peu et sort de nouveau, alors qu'ici la lumière est à l' intérieur .

Nathan Reed
la source