• Shader

Skin shader parameters

By: SKY ENGINE AI
scroll down ↓to find out moreskin-shader-parameters_2_resourcesTutorial

Skin Shader Parameters

In this tutorial you will get familiar with SkinShader's parameters. You will see how change of parameter values
affect materials using SkinShader.

Agenda:

  • SkinShader look - basic parameters
  • SkinShader look - SSS parameters
  • SkinShader control parameters

Scene setup

Let's use custom scene composer to set up the scene.

    from skyrenderer.cases.utils import HeadSceneComposer
    from skyrenderer.scene.scene_layout.layout_elements_definitions import MaterialDefinition
    from skyrenderer.basic_types.procedure.shader.basic_shaders import SkinShader
    scene_composer = HeadSceneComposer(antialiasing_level=128)
    scene_composer.setup_scene()
    skin_shader = SkinShader(scene_composer.renderer_context)
    material_definition = MaterialDefinition(
        shader=skin_shader,
    )
    scene_composer.renderer_context.set_material_definition(
        node_name="OnlyHead_GEO_HeadOnly", material_definition=material_definition
    )
2025-02-05 09:36:50,534 | skyrenderer.scene.renderer_context |  INFO: Root paths:
- root path: /dli/skyenvironment/skyrenderer/skyrenderer
- assets path: /dli/mount/assets
- config path: /dli/skyenvironment/skyrenderer/skyrenderer/config
- gpu sources path: /dli/skyenvironment/skyrenderer/skyrenderer/optix_sources/sources
- cache path: /dli/mount/cache
- ptx cache path: compiled_ptx/ptx
- ocio path: ocio_configs/aces_1.2/config.ocio

SkinShader look - PBR like parameters

In this section we will walk you through changing and setting basic SkinShader parameters. They are the same as
in PBRShader, see: PBRShaderParameters tutorial. For exemplary purposes a few were chosen:

  • base color and metallic
  • clearcoat parameters
    During that, we will use update default parameter methodology known from Procedure tutorial.

Base color and metallic

    renders = {}
    SkinShader.update_default_parameter("base_color", (1, 0, 0))
    renders["base_color=(1, 0, 0)"] = scene_composer.get_render()
    SkinShader.update_default_parameter("base_color", (1, 1, 0))
    renders["base_color=(1, 1, 0)"] = scene_composer.get_render()
    SkinShader.update_default_parameter("base_color", (1, 0.7, 0.4))
    renders["base_color=(1, 0.7, 0.4)"] = scene_composer.get_render()
    SkinShader.update_default_parameter("base_color", (1, 1, 1))
    renders["metallic=0.0"] = scene_composer.get_render()
    SkinShader.update_default_parameter("metallic", 0.5)
    renders["metallic=0.5"] = scene_composer.get_render()
    SkinShader.update_default_parameter("metallic", 1)
    renders["metallic=1"] = scene_composer.get_render()
    SkinShader.update_default_parameter("metallic", 0)
    scene_composer.visualize_grid_desc(renders, shape=(1000, 1500), n_cols=3)
skin-shader-parameters_1_resourcesTutorial
2025-02-05 09:36:50,976 | skyrenderer.utils.time_measurement |  INFO: Setup time: 74 ms

2025-02-05 09:36:51,118 | skyrenderer.utils.time_measurement |  INFO: Context update time: 141 ms

2025-02-05 09:37:17,853 | skyrenderer.utils.time_measurement |  INFO: Key points calculation time: 0 ms

2025-02-05 09:37:17,854 | skyrenderer.utils.time_measurement |  INFO: Render time: 26.73 seconds

2025-02-05 09:37:17,952 | skyrenderer.utils.time_measurement |  INFO: Setup time: 62 ms

2025-02-05 09:37:18,079 | skyrenderer.utils.time_measurement |  INFO: Context update time: 126 ms

2025-02-05 09:37:43,222 | skyrenderer.utils.time_measurement |  INFO: Key points calculation time: 0 ms

2025-02-05 09:37:43,223 | skyrenderer.utils.time_measurement |  INFO: Render time: 25.14 seconds

2025-02-05 09:37:43,311 | skyrenderer.utils.time_measurement |  INFO: Setup time: 55 ms

2025-02-05 09:37:43,441 | skyrenderer.utils.time_measurement |  INFO: Context update time: 130 ms

2025-02-05 09:38:09,466 | skyrenderer.utils.time_measurement |  INFO: Key points calculation time: 0 ms

2025-02-05 09:38:09,467 | skyrenderer.utils.time_measurement |  INFO: Render time: 26.02 seconds

2025-02-05 09:38:09,536 | skyrenderer.utils.time_measurement |  INFO: Setup time: 53 ms

2025-02-05 09:38:09,661 | skyrenderer.utils.time_measurement |  INFO: Context update time: 125 ms

2025-02-05 09:38:34,955 | skyrenderer.utils.time_measurement |  INFO: Key points calculation time: 0 ms

2025-02-05 09:38:34,956 | skyrenderer.utils.time_measurement |  INFO: Render time: 25.29 seconds

2025-02-05 09:38:35,025 | skyrenderer.utils.time_measurement |  INFO: Setup time: 53 ms

2025-02-05 09:38:35,151 | skyrenderer.utils.time_measurement |  INFO: Context update time: 125 ms

2025-02-05 09:39:00,204 | skyrenderer.utils.time_measurement |  INFO: Key points calculation time: 0 ms

2025-02-05 09:39:00,205 | skyrenderer.utils.time_measurement |  INFO: Render time: 25.05 seconds

2025-02-05 09:39:00,286 | skyrenderer.utils.time_measurement |  INFO: Setup time: 63 ms

2025-02-05 09:39:00,453 | skyrenderer.utils.time_measurement |  INFO: Context update time: 164 ms

2025-02-05 09:39:26,753 | skyrenderer.utils.time_measurement |  INFO: Key points calculation time: 0 ms

2025-02-05 09:39:26,754 | skyrenderer.utils.time_measurement |  INFO: Render time: 26.30 seconds

Clearcoat parameters

In SkyRenderer's Skin shader there is a clearcoat (thin outer layer) behavior modelled. It is disabled by default,
but can be enabled at any time.

    renders = {}
    SkinShader.update_default_parameter("base_color", (1, 0.7, 0.4))
    SkinShader.update_default_parameter("metallic", 0)
    SkinShader.update_default_parameter("clearcoat_roughness", 1)
    renders["no clearcoat"] = scene_composer.get_render()
    SkinShader.update_default_parameter("clearcoat_factor", 0.5)
    renders["clearcoat_factor=0.5"] = scene_composer.get_render()
    SkinShader.update_default_parameter("clearcoat_factor", 1)
    renders["clearcoat_factor=1"] = scene_composer.get_render()
    SkinShader.update_default_parameter("clearcoat_roughness", 0.0)
    renders["clearcoat_factor=1,roughness=0"] = scene_composer.get_render()
    SkinShader.update_default_parameter("clearcoat_roughness", 0.5)
    renders["clearcoat_factor=1,roughness=0.5"] = scene_composer.get_render()
    SkinShader.update_default_parameter("clearcoat_roughness", 1)
    renders["clearcoat_factor=1,roughness=1"] = scene_composer.get_render()
    scene_composer.visualize_grid_desc(renders, shape=(1000, 1500), n_cols=3)
    SkinShader.update_default_parameter("clearcoat_factor", 0.0)
    SkinShader.update_default_parameter("base_color", (1, 1, 1))
    SkinShader.update_default_parameter("metallic", 0)
skin-shader-parameters_2_resourcesTutorial
2025-02-05 09:39:27,216 | skyrenderer.utils.time_measurement |  INFO: Setup time: 122 ms

2025-02-05 09:39:27,342 | skyrenderer.utils.time_measurement |  INFO: Context update time: 125 ms

2025-02-05 09:39:53,830 | skyrenderer.utils.time_measurement |  INFO: Key points calculation time: 0 ms

2025-02-05 09:39:53,831 | skyrenderer.utils.time_measurement |  INFO: Render time: 26.49 seconds

2025-02-05 09:39:53,899 | skyrenderer.utils.time_measurement |  INFO: Setup time: 53 ms

2025-02-05 09:39:54,024 | skyrenderer.utils.time_measurement |  INFO: Context update time: 124 ms

2025-02-05 09:40:20,987 | skyrenderer.utils.time_measurement |  INFO: Key points calculation time: 0 ms

2025-02-05 09:40:20,988 | skyrenderer.utils.time_measurement |  INFO: Render time: 26.96 seconds

2025-02-05 09:40:21,053 | skyrenderer.utils.time_measurement |  INFO: Setup time: 53 ms

2025-02-05 09:40:21,178 | skyrenderer.utils.time_measurement |  INFO: Context update time: 125 ms

2025-02-05 09:40:47,117 | skyrenderer.utils.time_measurement |  INFO: Key points calculation time: 0 ms

2025-02-05 09:40:47,118 | skyrenderer.utils.time_measurement |  INFO: Render time: 25.94 seconds

2025-02-05 09:40:47,184 | skyrenderer.utils.time_measurement |  INFO: Setup time: 53 ms

2025-02-05 09:40:47,310 | skyrenderer.utils.time_measurement |  INFO: Context update time: 125 ms

2025-02-05 09:41:14,122 | skyrenderer.utils.time_measurement |  INFO: Key points calculation time: 0 ms

2025-02-05 09:41:14,123 | skyrenderer.utils.time_measurement |  INFO: Render time: 26.81 seconds

2025-02-05 09:41:14,194 | skyrenderer.utils.time_measurement |  INFO: Setup time: 53 ms

2025-02-05 09:41:14,319 | skyrenderer.utils.time_measurement |  INFO: Context update time: 125 ms

2025-02-05 09:41:40,088 | skyrenderer.utils.time_measurement |  INFO: Key points calculation time: 0 ms

2025-02-05 09:41:40,089 | skyrenderer.utils.time_measurement |  INFO: Render time: 25.77 seconds

2025-02-05 09:41:40,159 | skyrenderer.utils.time_measurement |  INFO: Setup time: 53 ms

2025-02-05 09:41:40,285 | skyrenderer.utils.time_measurement |  INFO: Context update time: 125 ms

2025-02-05 09:42:05,840 | skyrenderer.utils.time_measurement |  INFO: Key points calculation time: 0 ms

2025-02-05 09:42:05,840 | skyrenderer.utils.time_measurement |  INFO: Render time: 25.56 seconds

SkinShader - subsurface parameters

These parameters are used to control additional SSS layer of SkinShader. :

  • ss_gain
  • ss_max_samples
  • ss_radius
  • ss_radius_scale
  • ss_step
  • ss_step_multiplier

scene_composer.visualize()

ss_gain

Blending factor between diffuse and subsurface shading factors. 0 - fully diffuse, 1-only subdermal
subsurface.

    renders = {}
    SkinShader.update_default_parameter("ss_gain", 0)
    SkinShader.update_default_parameter("ss_gain", 0)
    renders["ss_gain=0"] = scene_composer.get_render()
    SkinShader.update_default_parameter("ss_gain", 0.5)
    renders["ss_gain=0.5"] = scene_composer.get_render()
    SkinShader.update_default_parameter("ss_gain", 1.0)
    renders["ss_gain=1"] = scene_composer.get_render()
    scene_composer.visualize_grid_desc(renders, shape=(500, 1500), n_cols=3)
skin-shader-parameters_3_resourcesTutorial
2025-02-05 09:42:06,259 | skyrenderer.utils.time_measurement |  INFO: Setup time: 55 ms

2025-02-05 09:42:06,385 | skyrenderer.utils.time_measurement |  INFO: Context update time: 126 ms

2025-02-05 09:42:33,402 | skyrenderer.utils.time_measurement |  INFO: Key points calculation time: 0 ms

2025-02-05 09:42:33,403 | skyrenderer.utils.time_measurement |  INFO: Render time: 27.02 seconds

2025-02-05 09:42:33,469 | skyrenderer.utils.time_measurement |  INFO: Setup time: 53 ms

2025-02-05 09:42:33,593 | skyrenderer.utils.time_measurement |  INFO: Context update time: 124 ms

2025-02-05 09:43:01,181 | skyrenderer.utils.time_measurement |  INFO: Key points calculation time: 0 ms

2025-02-05 09:43:01,181 | skyrenderer.utils.time_measurement |  INFO: Render time: 27.59 seconds

2025-02-05 09:43:01,247 | skyrenderer.utils.time_measurement |  INFO: Setup time: 53 ms

2025-02-05 09:43:01,372 | skyrenderer.utils.time_measurement |  INFO: Context update time: 125 ms

2025-02-05 09:43:41,215 | skyrenderer.utils.time_measurement |  INFO: Key points calculation time: 0 ms

2025-02-05 09:43:41,216 | skyrenderer.utils.time_measurement |  INFO: Render time: 39.84 seconds

ss_max_samples

Parameter defines random walk step count upper limit. It defines number of consecutive rays being generated for
each sample. Notice, that for 0 there is no subsurface, and for low values only close SSS (curved edges) is
calculated.

    renders = {}
    SkinShader.update_default_parameter("ss_max_samples", 0)
    renders["ss_max_samples=0"] = scene_composer.get_render()
    SkinShader.update_default_parameter("ss_max_samples", 5)
    renders["ss_max_samples=5"] = scene_composer.get_render()
    SkinShader.update_default_parameter("ss_max_samples", 20)
    renders["ss_max_samples=20"] = scene_composer.get_render()
    scene_composer.visualize_grid_desc(renders, shape=(500, 1500), n_cols=3)
skin-shader-parameters_4_resourcesTutorial
2025-02-05 09:43:41,444 | skyrenderer.utils.time_measurement |  INFO: Setup time: 55 ms

2025-02-05 09:43:41,569 | skyrenderer.utils.time_measurement |  INFO: Context update time: 125 ms

2025-02-05 09:43:49,216 | skyrenderer.utils.time_measurement |  INFO: Key points calculation time: 0 ms

2025-02-05 09:43:49,217 | skyrenderer.utils.time_measurement |  INFO: Render time: 7.65 seconds

2025-02-05 09:43:49,284 | skyrenderer.utils.time_measurement |  INFO: Setup time: 54 ms

2025-02-05 09:43:49,409 | skyrenderer.utils.time_measurement |  INFO: Context update time: 125 ms

2025-02-05 09:44:09,840 | skyrenderer.utils.time_measurement |  INFO: Key points calculation time: 0 ms

2025-02-05 09:44:09,841 | skyrenderer.utils.time_measurement |  INFO: Render time: 20.43 seconds

2025-02-05 09:44:09,906 | skyrenderer.utils.time_measurement |  INFO: Setup time: 53 ms

2025-02-05 09:44:10,032 | skyrenderer.utils.time_measurement |  INFO: Context update time: 124 ms

2025-02-05 09:45:19,641 | skyrenderer.utils.time_measurement |  INFO: Key points calculation time: 0 ms

2025-02-05 09:45:19,642 | skyrenderer.utils.time_measurement |  INFO: Render time: 69.61 seconds

ss_radius

Diminishing distance in beer-lambert law of absorption. In other engines sometimes approximated by subsurface
color. If 0, black SSS is achieved

    renders = {}
    SkinShader.update_default_parameter("ss_radius", (0, 0, 0))
    renders["ss_radius=(0,0,0)"] = scene_composer.get_render()
    SkinShader.update_default_parameter("ss_radius", (1, 0, 1))
    renders["ss_radius=(1,0,1)"] = scene_composer.get_render()
    SkinShader.update_default_parameter("ss_radius", (0, 0, 1))
    renders["ss_radius=(0,0,1)"] = scene_composer.get_render()
    scene_composer.visualize_grid_desc(renders, shape=(500, 1500), n_cols=3)
skin-shader-parameters_5_resourcesTutorial
2025-02-05 09:45:19,871 | skyrenderer.utils.time_measurement |  INFO: Setup time: 56 ms

2025-02-05 09:45:19,996 | skyrenderer.utils.time_measurement |  INFO: Context update time: 125 ms

2025-02-05 09:45:48,524 | skyrenderer.utils.time_measurement |  INFO: Key points calculation time: 0 ms

2025-02-05 09:45:48,525 | skyrenderer.utils.time_measurement |  INFO: Render time: 28.53 seconds

2025-02-05 09:45:48,593 | skyrenderer.utils.time_measurement |  INFO: Setup time: 56 ms

2025-02-05 09:45:48,722 | skyrenderer.utils.time_measurement |  INFO: Context update time: 128 ms

2025-02-05 09:46:58,086 | skyrenderer.utils.time_measurement |  INFO: Key points calculation time: 0 ms

2025-02-05 09:46:58,087 | skyrenderer.utils.time_measurement |  INFO: Render time: 69.36 seconds

2025-02-05 09:46:58,153 | skyrenderer.utils.time_measurement |  INFO: Setup time: 53 ms

2025-02-05 09:46:58,277 | skyrenderer.utils.time_measurement |  INFO: Context update time: 124 ms

2025-02-05 09:48:08,261 | skyrenderer.utils.time_measurement |  INFO: Key points calculation time: 0 ms

2025-02-05 09:48:08,262 | skyrenderer.utils.time_measurement |  INFO: Render time: 69.98 seconds

ss_radius_scale

Scaling factor for radius map. In other engines sometimes approximated by subsurface amount.

    renders = {}
    SkinShader.update_default_parameter("ss_radius_scale", 0.025)
    renders["ss_radius_scale=0.025"] = scene_composer.get_render()
    SkinShader.update_default_parameter("ss_radius_scale", 0.05)
    renders["ss_radius_scale=0.05"] = scene_composer.get_render()
    SkinShader.update_default_parameter("ss_radius_scale", 0.5)
    renders["ss_radius_scale=0.5"] = scene_composer.get_render()
    scene_composer.visualize_grid_desc(renders, shape=(500, 1500), n_cols=3)
skin-shader-parameters_6_resourcesTutorial
2025-02-05 09:48:08,469 | skyrenderer.utils.time_measurement |  INFO: Setup time: 55 ms

2025-02-05 09:48:08,595 | skyrenderer.utils.time_measurement |  INFO: Context update time: 125 ms

2025-02-05 09:49:17,931 | skyrenderer.utils.time_measurement |  INFO: Key points calculation time: 0 ms

2025-02-05 09:49:17,932 | skyrenderer.utils.time_measurement |  INFO: Render time: 69.34 seconds

2025-02-05 09:49:17,997 | skyrenderer.utils.time_measurement |  INFO: Setup time: 53 ms

2025-02-05 09:49:18,122 | skyrenderer.utils.time_measurement |  INFO: Context update time: 124 ms

2025-02-05 09:50:27,641 | skyrenderer.utils.time_measurement |  INFO: Key points calculation time: 0 ms

2025-02-05 09:50:27,642 | skyrenderer.utils.time_measurement |  INFO: Render time: 69.52 seconds

2025-02-05 09:50:27,708 | skyrenderer.utils.time_measurement |  INFO: Setup time: 54 ms

2025-02-05 09:50:27,838 | skyrenderer.utils.time_measurement |  INFO: Context update time: 130 ms

2025-02-05 09:51:37,160 | skyrenderer.utils.time_measurement |  INFO: Key points calculation time: 0 ms

2025-02-05 09:51:37,161 | skyrenderer.utils.time_measurement |  INFO: Render time: 69.32 seconds

ss_step

Initial length of subsurface sampler ray in meters. The lower, the more neighbour energy and diffuse is conveyed.
At least 2*scene_atomic_distance.

    renders = {}
    SkinShader.update_default_parameter("ss_step", 1e-5)
    renders["ss_step=1e-5"] = scene_composer.get_render()
    SkinShader.update_default_parameter("ss_step", 1e-4)
    renders["ss_step=1e-4"] = scene_composer.get_render()
    SkinShader.update_default_parameter("ss_step", 1e-3)
    renders["ss_step=1e-3"] = scene_composer.get_render()
    scene_composer.visualize_grid_desc(renders, shape=(500, 1500), n_cols=3)
    SkinShader.update_default_parameter("ss_step", 6e-4)
skin-shader-parameters_7_resourcesTutorial
2025-02-05 09:51:37,375 | skyrenderer.utils.time_measurement |  INFO: Setup time: 57 ms

2025-02-05 09:51:37,501 | skyrenderer.utils.time_measurement |  INFO: Context update time: 125 ms

2025-02-05 09:52:47,080 | skyrenderer.utils.time_measurement |  INFO: Key points calculation time: 0 ms

2025-02-05 09:52:47,081 | skyrenderer.utils.time_measurement |  INFO: Render time: 69.58 seconds

2025-02-05 09:52:47,148 | skyrenderer.utils.time_measurement |  INFO: Setup time: 54 ms

2025-02-05 09:52:47,273 | skyrenderer.utils.time_measurement |  INFO: Context update time: 125 ms

2025-02-05 09:53:56,779 | skyrenderer.utils.time_measurement |  INFO: Key points calculation time: 0 ms

2025-02-05 09:53:56,780 | skyrenderer.utils.time_measurement |  INFO: Render time: 69.51 seconds

2025-02-05 09:53:56,847 | skyrenderer.utils.time_measurement |  INFO: Setup time: 54 ms

2025-02-05 09:53:56,973 | skyrenderer.utils.time_measurement |  INFO: Context update time: 124 ms

2025-02-05 09:55:06,856 | skyrenderer.utils.time_measurement |  INFO: Key points calculation time: 0 ms

2025-02-05 09:55:06,857 | skyrenderer.utils.time_measurement |  INFO: Render time: 69.88 seconds

ss_step_multiplier

Length gain in each consecutive random walk step.

    renders = {}
    SkinShader.update_default_parameter("ss_step_multiplier", 1)
    renders["ss_step_multiplier=1"] = scene_composer.get_render()
    SkinShader.update_default_parameter("ss_step_multiplier", 3)
    renders["ss_step_multiplier=3"] = scene_composer.get_render()
    SkinShader.update_default_parameter("ss_step_multiplier", 5)
    renders["ss_step_multiplier=5"] = scene_composer.get_render()
    scene_composer.visualize_grid_desc(renders, shape=(500, 1500), n_cols=3)
skin-shader-parameters_8_resourcesTutorial
2025-02-05 09:55:07,040 | skyrenderer.utils.time_measurement |  INFO: Setup time: 55 ms

2025-02-05 09:55:07,165 | skyrenderer.utils.time_measurement |  INFO: Context update time: 125 ms

2025-02-05 09:55:38,416 | skyrenderer.utils.time_measurement |  INFO: Key points calculation time: 0 ms

2025-02-05 09:55:38,417 | skyrenderer.utils.time_measurement |  INFO: Render time: 31.25 seconds

2025-02-05 09:55:38,483 | skyrenderer.utils.time_measurement |  INFO: Setup time: 53 ms

2025-02-05 09:55:38,608 | skyrenderer.utils.time_measurement |  INFO: Context update time: 124 ms

2025-02-05 09:56:47,745 | skyrenderer.utils.time_measurement |  INFO: Key points calculation time: 0 ms

2025-02-05 09:56:47,746 | skyrenderer.utils.time_measurement |  INFO: Render time: 69.14 seconds

2025-02-05 09:56:47,822 | skyrenderer.utils.time_measurement |  INFO: Setup time: 58 ms

2025-02-05 09:56:47,958 | skyrenderer.utils.time_measurement |  INFO: Context update time: 135 ms

2025-02-05 09:57:58,724 | skyrenderer.utils.time_measurement |  INFO: Key points calculation time: 0 ms

2025-02-05 09:57:58,725 | skyrenderer.utils.time_measurement |  INFO: Render time: 70.77 seconds

Summary

In this section you have learnt:

  • SkinShader has many parameters that affect shader appearance.
  • SkinShader covers PBR behavior, but calculation is longer.
  • SkinShader's SSS model is fully customizable.