Gray Scale postprocess
In this case we will present you Gray Scale postprocess step.
Agenda:
- Grey Scale usage
- Color weights parameter
Scene setup
Let's use custom scene composer to set up the scene.
Scene consists of:
- white sphere - location: (0, 0, 0)
- red sphere - location: (1, 0, 0)
- green sphere - location: (0, 1, 0)
- blue sphere - location: (0, 0, 1)
- camera - location: (3, 0, 3)
- direction light - direction: (-1, -1, 0)
from skyrenderer.cases.utils import GrayScaleSceneComposer
from skyrenderer.render_chain import RenderChain
scene_composer = GrayScaleSceneComposer(antialiasing_level=2048)
scene_composer.setup_scene()
2025-02-14 12:47:21,683 | skyrenderer.scene.renderer_context | INFO: Root paths: - root path: /home/skyengine/anaconda/lib/python3.6/site-packages/skyrenderer - assets path: /dli/mount/assets - config path: /home/skyengine/anaconda/lib/python3.6/site-packages/skyrenderer/config - gpu sources path: /home/skyengine/anaconda/lib/python3.6/site-packages/skyrenderer/optix_sources/sources - cache path: /dli/mount/cache - ptx cache path: compiled_ptx/ptx - ocio path: ocio_configs/aces_1.2/config.ocio
Grey Scale usage
Grayscale postprocess converts an image with a full range of colors into a monochromatic version
that only uses shades of gray.
Let's create two renders, first of them will be a result of a render chain consisting of a single
visible light render step.
scene_composer.renderer_context.define_render_chain(
RenderChain(
render_steps=[scene_composer.visible_light_render_step],
width=500,
height=500,
),
)
colorful_render = scene_composer.get_render()
2025-02-14 12:47:22,595 | skyrenderer.utils.time_measurement | INFO: Setup time: 872 ms 2025-02-14 12:47:22,701 | skyrenderer.utils.time_measurement | INFO: Context update time: 106 ms 2025-02-14 12:47:26,419 | skyrenderer.utils.time_measurement | INFO: Key points calculation time: 0 ms 2025-02-14 12:47:26,422 | skyrenderer.utils.time_measurement | INFO: Render time: 3.72 seconds
The second render will have an additional Grayscale Postprocess step.
from skyrenderer.render_chain import GrayscalePostprocess
gray_scale_step = GrayscalePostprocess(
scene_composer.renderer_context,
)
scene_composer.renderer_context.define_render_chain(
RenderChain(
render_steps=[scene_composer.visible_light_render_step, gray_scale_step],
width=500,
height=500,
),
)
grayscale_render = scene_composer.get_render()
scene_composer.visualize_grid((colorful_render, grayscale_render), (500, 1000), 2)
2025-02-14 12:47:26,504 | skyrenderer.utils.time_measurement | INFO: Setup time: 62 ms 2025-02-14 12:47:26,672 | skyrenderer.utils.time_measurement | INFO: Context update time: 166 ms 2025-02-14 12:47:28,266 | skyrenderer.utils.time_measurement | INFO: Key points calculation time: 0 ms 2025-02-14 12:47:28,269 | skyrenderer.utils.time_measurement | INFO: Render time: 1.60 seconds
Color weights parameter
The previous grayscale render was a bit too dark, we will try to brighten it. For this purpose we can use
the color_weights parameter. It is a list of 3 floats corresponding to RGB colors. The higher the values of this
parameter, the given color will be processed into a brighter gray.
Let's create a parameter provider and pass a list of low color weights:
gray_scale_params = GrayscalePostprocess.create_parameter_provider(
scene_composer.renderer_context, color_weights=[1, 1, 1]
)
gray_scale_step = GrayscalePostprocess(scene_composer.renderer_context, gray_scale_params)
scene_composer.renderer_context.define_render_chain(
RenderChain(
render_steps=[scene_composer.visible_light_render_step, gray_scale_step],
width=500,
height=500,
),
)
bright_grayscale_render = scene_composer.get_render()
render_dict = {
"Colorful render": colorful_render,
"Default parameters": grayscale_render,
"Color weights [1, 1 ,1]": bright_grayscale_render,
}
scene_composer.visualize_grid_desc(render_dict, (500, 1500), 3, font_scale=2)
2025-02-14 12:47:28,540 | skyrenderer.utils.time_measurement | INFO: Setup time: 55 ms 2025-02-14 12:47:28,702 | skyrenderer.utils.time_measurement | INFO: Context update time: 159 ms 2025-02-14 12:47:30,007 | skyrenderer.utils.time_measurement | INFO: Key points calculation time: 0 ms 2025-02-14 12:47:30,008 | skyrenderer.utils.time_measurement | INFO: Render time: 1.31 seconds
We can also set different weights for red, green and blue colors. In the last render we expect red color
to be translated to brighter and green to darker gray.
gray_scale_params = GrayscalePostprocess.create_parameter_provider(
scene_composer.renderer_context, color_weights=[2, 0.5, 1]
)
gray_scale_step = GrayscalePostprocess(scene_composer.renderer_context, gray_scale_params)
scene_composer.renderer_context.define_render_chain(
RenderChain(
render_steps=[scene_composer.visible_light_render_step, gray_scale_step],
width=500,
height=500,
),
)
various_grayscale_render = scene_composer.get_render()
render_dict = {
"Colorful render": colorful_render,
"Color weights [1, 1 ,1]": bright_grayscale_render,
"Color weights [2, 0.5, 1]": various_grayscale_render,
}
scene_composer.visualize_grid_desc(render_dict, (500, 1500), 3, font_scale=2)
2025-02-14 12:47:30,230 | skyrenderer.utils.time_measurement | INFO: Setup time: 56 ms 2025-02-14 12:47:30,317 | skyrenderer.utils.time_measurement | INFO: Context update time: 86 ms 2025-02-14 12:47:31,585 | skyrenderer.utils.time_measurement | INFO: Key points calculation time: 0 ms 2025-02-14 12:47:31,585 | skyrenderer.utils.time_measurement | INFO: Render time: 1.27 seconds
Summary
In this section you have learnt:
- Grayscale postprocess step translates RGB colors to the shades of gray.
- Dolor weights parameter can make translate the RGB colors to lighter or darker shades of gray.
- The higher the values of color weights the given color will be processed into a brighter gray.