Yotsuba Games
Back to Node List

Solid Render

solid_render

Renders a solid orthographically (one ray per pixel) into a Surface G-buffer with normal, height, depth, curvature, material and face ids.

Reviewed
Guide available
The node name and summary are available in English. Port, parameter, and article details are currently shown in Japanese.

Input Ports

NameTypeDescription
ć‚½ćƒŖćƒƒćƒ‰
solid
Solid
Required
ćƒ¬ćƒ³ćƒ€ćƒŖćƒ³ć‚°ć™ć‚‹ē«‹ä½“ć§ć™ć€‚

Output Ports

NameTypeDescription
ć‚µćƒ¼ćƒ•ć‚§ćƒ¼ć‚¹
surface
Surface
ćƒ¬ćƒ³ćƒ€ćƒŖćƒ³ć‚°ēµęžœć®ć‚µćƒ¼ćƒ•ć‚§ćƒ¼ć‚¹ć§ć™ć€‚ć€Œć‚µćƒ¼ćƒ•ć‚§ćƒ¼ć‚¹å…‰ćƒ—ćƒ¬ćƒ“ćƒ„ćƒ¼ć€ć«ć¤ćŖććØå…‰ć‚’å½“ć¦ć‚‰ć‚Œć¾ć™ć€‚
ē”»åƒ
image
Image
ćƒ©ć‚¤ćƒ†ć‚£ćƒ³ć‚°å‰ć®ćƒ™ć‚æå”—ć‚Šē”»åƒć§ć™ć€‚

Parameters

NameTypeDefaultRangeDescription / Options
ć‚«ćƒ”ćƒ©ę–¹ä½č§’
azimuth
Angle
45— / step 1

ć‚«ćƒ”ćƒ©ć®ę°“å¹³ę–¹å‘ć®č§’åŗ¦ć§ć™ć€‚ć‚¢ć‚¤ć‚½ćƒ”ē“ ęćÆ45åŗ¦åˆ»ćæćŒåŸŗęœ¬ć§ć™ć€‚8ę–¹å‘ē“ ęćÆć“ć“ć‚’ć‚¢ćƒ‹ćƒ”ć•ć›ć¾ć™ć€‚

ć‚«ćƒ”ćƒ©č§’ć‚¹ćƒŠćƒƒćƒ—
camera_angle_snap
Float
00–90 / step 0.5

ćƒ¬ćƒ³ćƒ€ćƒŖćƒ³ć‚°å‰ć«ć‚«ćƒ”ćƒ©ę–¹ä½č§’ć‚’ęŒ‡å®šåˆ»ćæćøäøøć‚ć¾ć™ć€‚0ćŖć‚‰ć‚¹ćƒŠćƒƒćƒ—ć—ć¾ć›ć‚“ć€‚8ę–¹å‘ē“ ęć§ćÆ45ćŒåŸŗęœ¬ć§ć™ć€‚

č¦‹äø‹ć‚ć—č§’
elevation_preset
Enum
Iso2To1—

ć‚«ćƒ”ćƒ©ć®č¦‹äø‹ć‚ć—č§’ć®ćƒ—ćƒŖć‚»ćƒƒćƒˆć§ć™ć€‚

  • 2:1ć‚¢ć‚¤ć‚½ćƒ”Iso2To1
    26.565åŗ¦ć€‚ćƒ‰ćƒƒćƒˆēµµć®å®šē•Ŗ2:1ć‚¢ć‚¤ć‚½ćƒ”ć§ć™ć€‚
  • 30°Iso30
    30åŗ¦ć®ć‚¢ć‚¤ć‚½ćƒ”ć§ć™ć€‚
  • 45°Iso45
    45åŗ¦ć®č¦‹äø‹ć‚ć—ć§ć™ć€‚
  • 真上Top
    ć»ć¼ēœŸäøŠć‹ć‚‰ć®č¦‹äø‹ć‚ć—ć§ć™ć€‚
  • ć‚«ć‚¹ć‚æćƒ Custom
    ć‚«ćƒ”ćƒ©ä»°č§’ćƒ‘ćƒ©ćƒ”ćƒ¼ć‚æć®å€¤ć‚’ä½æć„ć¾ć™ć€‚
1ćƒ¦ćƒ‹ćƒƒćƒˆć®ćƒ”ć‚Æć‚»ćƒ«ę•°
pixels_per_unit
Int
161–128

立体の1ćƒ¦ćƒ‹ćƒƒćƒˆć‚’ä½•ćƒ”ć‚Æć‚»ćƒ«ć§ęćć‹ć§ć™ć€‚16なら 1Ɨ1Ɨ1 ć®ćƒœćƒƒć‚Æć‚¹ćŒē“„16pxå¹…ć«ćŖć‚Šć¾ć™ć€‚

余白
padding
Int
10–32

č‡Ŗå‹•ćƒ•ć‚£ćƒƒćƒˆć—ćŸå‡ŗåŠ›ć®å¤–å“ć«č¶³ć™é€ę˜Žä½™ē™½(px)恧恙怂

ć‚«ćƒ”ćƒ©ä»°č§’
custom_elevation
Float
26.5650005340576171–89 / step 0.5

ćƒ—ćƒŖć‚»ćƒƒćƒˆćŒć‚«ć‚¹ć‚æćƒ ć®ę™‚ć®ć‚«ćƒ”ćƒ©ä»°č§’(åŗ¦)恧恙怂

å‡ŗåŠ›ćƒ•ćƒ¬ćƒ¼ćƒ 
frame_mode
Enum
AutoFit—

å‡ŗåŠ›ćƒ•ćƒ¬ćƒ¼ćƒ ć®ę±ŗć‚ę–¹ć§ć™ć€‚ć‚¢ćƒ‹ćƒ”ćƒ¼ć‚·ćƒ§ćƒ³ć‚„8ę–¹å‘ē“ ęć§ćÆå›ŗå®šć‚­ćƒ£ćƒ³ćƒć‚¹ć‚’ä½æć„ć¾ć™ć€‚

  • č‡Ŗå‹•ćƒ•ć‚£ćƒƒćƒˆAutoFit
    ē¾åœØć®ē«‹ä½“ć«åˆć‚ć›ć¦å‡ŗåŠ›ć‚µć‚¤ć‚ŗć‚’č‡Ŗå‹•čŖæę•“ć—ć¾ć™ć€‚
  • å›ŗå®šć‚­ćƒ£ćƒ³ćƒć‚¹FixedCanvas
    ćƒ”ć‚Æć‚»ćƒ«å¹…ćƒ»é«˜ć•ćØćƒÆćƒ¼ćƒ«ćƒ‰äø­åæƒć‚’å›ŗå®šć—ć¾ć™ć€‚ć‚¢ćƒ‹ćƒ”ćƒ¼ć‚·ćƒ§ćƒ³ē“ ęå‘ć‘ć§ć™ć€‚
å›ŗå®šå¹…
fixed_canvas_width
Int
641–1024

å‡ŗåŠ›ćƒ•ćƒ¬ćƒ¼ćƒ ć‚’å›ŗå®šć™ć‚‹ćØćć®å¹…(px)ć§ć™ć€‚ć‚¢ćƒ‹ćƒ”ćƒ¼ć‚·ćƒ§ćƒ³ć§ćƒ•ćƒ¬ćƒ¼ćƒ å¹…ć‚’ęƒćˆć‚‹ćŸć‚ć«ä½æć„ć¾ć™ć€‚

å›ŗå®šé«˜ć•
fixed_canvas_height
Int
641–1024

å‡ŗåŠ›ćƒ•ćƒ¬ćƒ¼ćƒ ć‚’å›ŗå®šć™ć‚‹ćØćć®é«˜ć•(px)ć§ć™ć€‚ć‚¢ćƒ‹ćƒ”ćƒ¼ć‚·ćƒ§ćƒ³ć§ćƒ•ćƒ¬ćƒ¼ćƒ é«˜ć•ć‚’ęƒćˆć‚‹ćŸć‚ć«ä½æć„ć¾ć™ć€‚

å›ŗå®šēÆ„å›²X
frame_world_width
Float
40.05–256 / step 0.05

å›ŗå®šć‚­ćƒ£ćƒ³ćƒć‚¹ę™‚ć«ä½æć†ćƒÆćƒ¼ćƒ«ćƒ‰ēÆ„å›²ć®Xå¹…ć§ć™ć€‚å›žč»¢ē“ ęć§ćÆåÆ¾č±”ćŒå…„ć‚‹å¤§ćć•ć«ć—ć¾ć™ć€‚

å›ŗå®šēÆ„å›²Y
frame_world_depth
Float
40.05–256 / step 0.05

å›ŗå®šć‚­ćƒ£ćƒ³ćƒć‚¹ę™‚ć«ä½æć†ćƒÆćƒ¼ćƒ«ćƒ‰ēÆ„å›²ć®Yå„„č”Œćć§ć™ć€‚

å›ŗå®šēÆ„å›²Z
frame_world_height
Float
40.05–256 / step 0.05

å›ŗå®šć‚­ćƒ£ćƒ³ćƒć‚¹ę™‚ć«ä½æć†ćƒÆćƒ¼ćƒ«ćƒ‰ēÆ„å›²ć®Zé«˜ć•ć§ć™ć€‚

中心X
frame_center_x
Float
0-256–256 / step 0.05

å›ŗå®šć‚­ćƒ£ćƒ³ćƒć‚¹ę™‚ć®äø­åæƒX恧恙怂

中心Y
frame_center_y
Float
0-256–256 / step 0.05

å›ŗå®šć‚­ćƒ£ćƒ³ćƒć‚¹ę™‚ć®äø­åæƒY恧恙怂

中心Z
frame_center_z
Float
0-256–256 / step 0.05

å›ŗå®šć‚­ćƒ£ćƒ³ćƒć‚¹ę™‚ć®äø­åæƒZ恧恙怂

Overview

The camera that converts a Solid SDF volume into a pixel-art asset. It uses orthographic projection with one ray per pixel and outputs a Surface, a pixel-art G-buffer containing normals, height, depth, and material IDs. This node sits at the center of the 3D → pixel-art lane for 2:1 isometric blocks and eight-direction characters.

  • Does not perform lighting: downstream nodes such as ć‚µćƒ¼ćƒ•ć‚§ćƒ¼ć‚¹å…‰ćƒ—ćƒ¬ćƒ“ćƒ„ćƒ¼ add light.

Usage tips

  • The minimum setup is ć‚½ćƒŖćƒƒćƒ‰ćƒœćƒƒć‚Æć‚¹ → ć‚½ćƒŖćƒƒćƒ‰ćƒ¬ćƒ³ćƒ€ćƒŖćƒ³ć‚° → ć‚µćƒ¼ćƒ•ć‚§ćƒ¼ć‚¹å…‰ćƒ—ćƒ¬ćƒ“ćƒ„ćƒ¼. Start here to learn how a volume becomes pixel art.
  • Set pixel density with pixels_per_unit: at 16, a 1Ɨ1Ɨ1 box is approximately 16px. Match asset size with this value, not by moving the camera.
  • The fastest way to find an angle is to drag in the 3D viewer, then write it back with ć“ć®č§’åŗ¦ć‚’ęŽ”ē”Ø.
  • Use AutoFit for one still image; always use FixedCanvas for animation, eight directions, or a turntable. Auto-fitting changes dimensions with orientation and makes multiple frames jitter.
  • The flat image output is for checking coverage. The primary output is surface followed by lighting nodes.

Common pitfalls

  • Frame dimensions or center shift between frames: rotation is still using frame_mode = AutoFit. Switch to FixedCanvas and make frame_world_* large enough for the subject in every frame.
  • The screen is plain white/black with no depth: this node intentionally does not light. Connect surface to surface_light_preview or a lighting definition.
  • Eight-direction angles are slightly off: set camera_angle_snap = 45 to round them and absorb floating-point drift during animation.
  • The outline is blurry: this node cannot blur because it has no AA and uses point sampling. Check enlargement filtering in the display.

Technical details

  • AutoFit fits output dimensions to the volume bounds, up to 1024px.
  • FixedCanvas fixes output dimensions and look-at center; use it for turntables and eight-direction assets.
  • One output pixel = one ray, with point sampling and no AA for pixel art.
  • normal_map is view-space: x right, y down in the image, z toward the viewer. This matches the ć‚µćƒ¼ćƒ•ć‚§ćƒ¼ć‚¹å…‰ćƒ—ćƒ¬ćƒ“ćƒ„ćƒ¼ contract.
  • height_map is normalized world z, white = high; depth_map is view depth, white = near.
  • curvature_map is screen-space curvature: 0.5 = flat, >0.5 = convex edge. It is used for edge highlights.
  • face_ids use {solid_id}:top / :left / :right / :front / :back / :bottom. If a generator's solid_id is blank, an automatic ID such as solid:0 is used.
  • Implementation is crates/pxn-core/src/sdf_render.rs with rayon parallelism. Reference performance: about 3.3ms for 129Ɨ81px with 20 primitives in release mode.

3D viewer integration

  • The 3D view in the inspector or preview window ray-marches the connected Solid input directly in Solid3DStage.
  • Drag in the viewer to find an angle, then press ć“ć®č§’åŗ¦ć‚’ęŽ”ē”Ø to write back azimuth, elevation_preset=Custom, and custom_elevation.
  • The viewer checker and light gizmo are display-only and are not baked into surface or image output.

Examples

  • ć‚½ćƒŖćƒƒćƒ‰ćƒœćƒƒć‚Æć‚¹ → ć‚½ćƒŖćƒƒćƒ‰ćƒ¬ćƒ³ćƒ€ćƒŖćƒ³ć‚° → ć‚µćƒ¼ćƒ•ć‚§ćƒ¼ć‚¹å…‰ćƒ—ćƒ¬ćƒ“ćƒ„ćƒ¼ is the minimum isometric-block setup.
  • TimeSource → SawtoothWave → ć‚½ćƒŖćƒƒćƒ‰å¤‰ę›.å›žč»¢Z → ć‚½ćƒŖćƒƒćƒ‰ćƒ¬ćƒ³ćƒ€ćƒŖćƒ³ć‚°.image → AnimationRender creates a turntable sprite sheet.
  • For eight directions, use VariantRange(key=render:azimuth, start=0, end=315, count=8) → BatchRender.items together with camera_angle_snap=45 and FixedCanvas.
  • Connect ć‚µćƒ¼ćƒ•ć‚§ćƒ¼ć‚¹ę›øćå‡ŗć— to produce a map set for an HD-2D engine.

Recommendations for animation

  • frame_mode = FixedCanvas
  • Set fixed_canvas_width / fixed_canvas_height to final single-frame dimensions.
  • Make frame_world_width/depth/height large enough to contain the subject in every frame.
  • For eight-direction assets, use camera_angle_snap = 45.

Related nodes

  • solid_box / solid_sphere / solid_combine — build the volume to photograph
  • surface_light_preview — the go-to next step for lighting the output Surface
  • model_render — equivalent camera for the Model mesh lane with shared parameter vocabulary
  • surface_export — export the Surface as a game-engine texture set
Back to Node List
Solid Render — PixPipeline Node Reference