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)
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)
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)
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)
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)
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)
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)
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)
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.