Inker

Design how a viewport DRAWS — then take it home. Every control is a real key in a Rhino display mode; export the .ini and import it in Options → View → Display Modes.

Design the way your viewport DRAWS, then take it home as a real Rhino display mode. One model, every graphics decision live: ink and pixel lineweights, silhouettes vs creases (and the dihedral test that finds them), isocurves, flat vs modeled shading via the ambient term, specular shine, shadow maps with their resolution, blur and bias artifacts, the paper behind it all — each control naming the exact .ini key it writes. A single WEIGHT BOOST scales every line family together, so the whole drawing can be made frankly heavy for a projector, a pin-up or low vision without losing its hierarchy — and it exports, reaching surfaces, meshes, SubDs and the section cut alike. Twenty-five studio presets, accessibility first (HIGH CONTRAST, NIGHT SHIFT, then Moebius ligne claire, graphite, noir, blueprint, clay, terracotta, riso, xray, Nolli, neon, chalk, black-poché sections and more) or dial your own, then export a .ini that imports straight into Options → View → Display Modes. Drive the massing to watch intersection curves appear and vanish — including a raking blade wall, because surface∩volume is the hard case. Client-side; the lesson is the settings panel you were always afraid of.

Ligne claire: one uniform ink, silhouettes a step heavier than interior edges, matte fill flattened by white ambient — only lines a hand would draw.

25 modes on the shelf, grouped by what they are FOR. ACCESSIBILITY comes first on purpose: those two are built to be legible before they are beautiful, and they ship with the weight boost already up.

×

Multiplies EVERY weight below: the six technical families, curve objects, isocurves, naked edges, the SubD and mesh wires, and the section cut. Because it scales rather than sets, the silhouette stays heavier than the edges, which stay heavier than the creases — the drawing gets louder, not flatter. It EXPORTS: the .ini carries these boosted pixel weights into Rhino, and a family you switched off stays off however far you push it.

Drawn at 4.0 / 2.0 / 2.0px

silhouette / edges / intersections, after the boost. The ceiling is 20px per family — past that a line reads as a fill and the hierarchy is gone.

Ink vs paper15.8:1

excellent. The WCAG contrast ratio between this mode's ink and the paper it draws on — the same number an accessibility audit computes. Under 4.5:1 the boost above is doing the work a better ink choice should be doing.

Every line draws whether or not something is in front of it — the depth test comes off entirely. This is how you read a pile of INTERSECTING volumes: the curve where the chimney enters the roof is inside the roof, so an ordinary depth test hides exactly the line you came to look at. Writes XrayAllObjects.

Draw the wires of MESH objects — an imported .obj or .stl, which carries no surfaces for the technical pipeline to find. Off, an imported mesh shades but shows no linework at all. Writes ShowMeshEdges + ShowMeshWires (at the boosted edge weight).

#1a1614

ONE ink for every line — curves, edges, silhouettes, sections. Writes CurveColor, TEColor, TSiColor…

px

The outer contour — where the surface turns away from THIS camera. Orbit and watch it crawl across the silo and the dome; the creases underneath never move. The preview computes it the way Rhino does — the edges whose two faces disagree about facing you — so it is a real curve at a real pixel weight, not an outline effect. Writes TSiThickness.

px

Where two faces of the model meet — anchored in the geometry, a step lighter than the contour. Writes TEThickness.

px

The curves where two OBJECTS cross — the chimney through the roof, every mass into the ground, the blade wall through everything. Every PAIR in the scene is checked, not a chosen few. Touching isn't crossing: only interpenetration draws. Writes TIThickness. Drive it with the Intersections group below.

px

The sharp interior edges of a SINGLE surface. On this meshed preview creases fold into Edges — in Rhino they are their own family. Writes TCThickness.

px

Where a closed surface's parameterization meets itself — the vertical on the silo, the meridian on the dome. Writes TSThickness.

px

The same linework where the model occludes it, drawn dashed — an inverted depth test, which is also how the GPU does it. Writes THThickness.

°

Preview lesson: an edge is drawn when its two faces bend more than this. Rhino draws true surface edges; meshes everywhere use this test. Watch the silo lose its facet lines around 8°.

Together these write TechnicalMask = 45 — one bit per family (edges 1 · hidden 2 · silhouettes 4 · creases 8 · seams 16 · intersections 32). A weight of 0 clears its bit.

px

Real curves — the site boundary and the walkway arc on the slab. Writes CurveThickness (+ ShowCurves).

The UV parameter lines NURBS surfaces carry — note the boxes have none to show. Writes ShowIsocurves.

px

Isocurves used to be locked to 1px. Give them a weight of their own and they stop being an artifact and start being HATCHING — see ETCHING on the shelf. Writes IsocurveThickness (+ the U/V/W variants).

Highlight the boundary of OPEN surfaces — the canopy shell behind the house is the open one here. Writes ShowNakedEdges.

px

Writes NakedEdgeThickness. Off, the boundary draws as an ordinary edge.

Edges where surfaces meet SMOOTHLY (fillet borders) — nothing here is filleted, so this is export-only. Writes ShowTangentEdges.

The tangent variety of seams — export-only here. Writes ShowTangentSeams.

An intersection curve is not a style, it is a FACT about two solids. These controls move the still life so you can watch the fact change — every pair of objects in the scene is tested, so anything you push into anything draws.

ft

THE lesson about intersections: at 0 every mass rests exactly on the slab and every ground line VANISHES, because resting on a face is contact, not crossing. Rhino behaves identically — which is why a model that looks fine in shaded mode can lose all its ground lines in a technical one.

ft

Watch the SHAPE of the curve where the chimney enters the roof: a clean V while it straddles the ridge, folding into a flat quadrilateral as it slides onto one slope, gone entirely once it clears the gable end.

ft

Two curved solids, which is the case that used to come out ragged. At 0 the dome's equator sits exactly on the rim — TANGENT, so nothing draws. Sink it and a clean circle appears; lift it and the dome floats free.

ft

Volume into volume: push the vault left and the curved extrusion cuts a real arc-and-line profile through the house's wall. This pair was not on the old hard-coded list, so it used to draw nothing at all.

Adds a thin OPEN surface — a single plane, not a box — standing through the massing. Surface∩volume is the harder case: with no thickness there is no second face to catch the curve, so it is where a sloppy tolerance shows up first.

ft

Drive it through the house, the silo, the vault and the canopy in turn — each one is a different intersection problem, and each draws in the Intersections weight.

Drop back faces, so an OPEN surface is one-sided: orbit behind the blade or the canopy shell and it disappears. That is not a bug — an open surface has a front, and a closed solid never shows a backface anyway. Writes CullBackfaces.

#e4cea2

The one signature color everything renders in. Writes Diffuse.

Off = the fill above; on = each object's own layer color, same ink. Writes OverrideObjectColor.

%

The ambient term: ambient × diffuse reaches every pixel no matter where the light is. 100% = ligne claire; 0% = full modeling. Writes AmbientColor.

The specular EXPONENT: higher = a tighter highlight; 0 kills the term — the flat-illustration move. Writes Shine.

#000000

The highlight's own color (needs Shine > 0 to appear). Writes Specular.

%

See-through display material — the linework keeps drawing on top. Writes Transparency.

Per-FACE normals instead of smooth ones: the silo shows its real facets. Writes FlatShaded.

Writes CastShadows. Flat styles often drop them entirely — the silhouette carries depth instead.

%

How dark the shadowed region reads. Writes ShadowIntensity.

#3f342f

A warm sepia beats dead black in every flat style. Writes ShadowColor.

Writes ShadowBlur. At 0, watch the shadow edge pixelate — that is the shadow MAP showing its resolution.

Shadows are rendered from the LIGHT into a texture this size, then looked up per pixel. Writes ShadowMapSize (preview caps at 4096).

Preview lesson: slide to 0 and stripes crawl across lit faces — shadow acne, a surface shadowing ITSELF through depth-precision error. Bias pushes the test surface toward the light; too much and shadows detach (peter-panning).

#f6f0e2

The background is a design decision, not a default. Writes SolidColor.

A two-color vertical wash instead of flat paper. Writes FillMode + the GradTop…/GradBot… corners (solid paper still exports as the fallback).

#fffaec

Waiting on Gradient paper above.

#ece6d8

The construction grid, in the mode's ink. Writes DrawGrid.

The grid's own axis lines. Writes DrawAxes + DrawZAxis.

The little corner gizmo. Writes DrawWorldAxes.

Preview lesson: a clipping plane cuts the model live; the cut line draws in the section-edge weight. Rhino also FILLS the cut with the poché color below.

ft
#c69e78

The poché where the plane cuts solid material (in Rhino — the preview draws the cut line only). Writes ClippingSurfaceColor.

px

The cut line — traditionally the heaviest in the drawing. Writes ClippingEdgeThickness.

Export (top right) writes the .ini. Presets keep a stable identity, so re-importing overwrites cleanly; a custom mode arrives in Rhino as a new mode each export.

Loading viewport…

Three kinds of line. The 4.0px silhouette exists only from THIS camera — orbit and it moves across the surface. The 2.0px edges are anchored in the geometry and never move. The 2.0px intersections belong to PAIRS of objects — the chimney into the roof, each mass into the ground, the vault into the house — computed as the curve where the two surfaces actually cross. Contact draws nothing; only interpenetration does.

Every pair, chained, lifted. The viewport tests EVERY pair of objects in the scene rather than a chosen list, so anything you drive into anything draws. The loose per-triangle pieces are then walked into continuous polylines — at 1px a heap of chips looks like a curve, at 4px each chip grows its own round cap and the curve turns into beads. And each curve is nudged a fraction of a depth unit toward the camera: a line lying EXACTLY on the surface it belongs to is otherwise in a tie the depth buffer breaks per pixel, which is what stippling and flickering on orbit actually are.

One multiplier, whole hierarchy. The weight boost is at 1× — every family scaled together, so the silhouette stays heavier than the edges however loud the drawing gets. Ink against paper measures 15.8:1 (excellent). Both travel in the .ini: the mode a student imports is this legible in their own Rhino, on surfaces, meshes, SubDs and the section cut alike.

Seams & hidden lines. A seam is where a closed surface's parameterization meets itself — one vertical on the silo, one meridian on the dome; it's an artifact of HOW the surface is described, not of the form. Hidden lines are the same linework re-drawn dashed with an INVERTED depth test: draw only where something is in front.

The shading equation. Every pixel is ambient + diffuse + specular. Your ambient term carries 100% of the fill unconditionally — the whole difference between a modeled clay render and a flat Moebius wash. Shine 0 kills the specular term: matte. Smooth shading interpolates normals across facets.

Shadow maps. The scene is rendered from the light into a 4096² depth texture; each pixel then asks “is something nearer the light than me?”. Blockiness is texture resolution, blur hides it, and the bias slider shows the classic failure both ways.

Pixel lineweights. All the weights here are screen pixels, exactly as Rhino measures lineweight — zoom in and the ink does NOT get thicker. That is what makes the boost an ACCESSIBILITY control rather than a zoom: a 12px edge is 12px at every camera distance, on every projector, at the back of every review room. The six line families pack into one integer: TechnicalMask = 45.

The contour is computed. The silhouette is not an outline drawn around the shape — it is found, every frame, by asking of each edge whether its two faces disagree about facing the camera. Where the surface is genuinely folded (a box corner, the silo's rim) the contour runs along that edge; where the mesh is only approximating a curve (the dome, the silo's side) it cuts ACROSS the facets, at the line where the interpolated normal turns side-on. Doing only the first gives the classic staircase — a zig-zag that hides at a hairline and grows whiskers at 8px.

A display mode is just this: sections of key=value pairs. Everything on the left writes a line you can find below — there is no magic between the panel and the file.

[DisplayMode\9a9e3e62-2b0f-465e-9946-8c4bb96b3c8f]
PipelineId=e1eb7363-87f2-4a2b-a861-256e77835369
SupportsShading=y
SupportsStereo=y
AddToMenu=y
AllowObjectAssignment=n
ShadedPipelineRequired=y
WireframePipelineRequired=y
PipelineLocked=y
Order=13
DerivedFrom=f4616fa5-a831-4620-a97e-9b807d5ec376
Name=MOEBIUS - DISPLAY
XrayAllObjects=n
IgnoreHighlights=n
DisableConduits=n
DisableTransparency=n
BBoxMode=0
RealtimeDisplayId=00000000-0000-0000-0000-000000000000
SupportsShadeCmd=y
[DisplayMode\9a9e3e62-2b0f-465e-9946-8c4bb96b3c8f\Lighting]
ShadowIntensity=45
ShadowClippingRadius=87.59174346923828
ShadowClippingUsage=0
PerPixelLighting=y
TransparencyTolerance=40
ShadowBlur=1
ShadowBias=2,12,0
ShowLights=n
UseHiddenLights=n
UseLightColor=n
LightingScheme=1
Luminosity=0
AmbientColor=255,255,255
LightCount=0
CastShadows=y
ShadowMapSize=8256
SkylightShadowQuality=0
NumSamples=0
ShadowMapType=1
ShadowBitDepth=32
ShadowColor=63,52,47
[DisplayMode\9a9e3e62-2b0f-465e-9946-8c4bb96b3c8f\Objects]
CPHidePoints=n
CPHighlight=y
CPHidden=n
nCPWireThickness=2
LockedUsage=2
LockedTrans=50
GhostLockedObjects=n
ClipSectionUsage=0
CPColor=26,22,20
eCVStyle=102
nCVSize=3
LayersFollowLockUsage=n
LockedObjectsBehind=n
LockedColor=100,100,100
CPSolidLines=n
CPSingleColor=n
CPHideSurface=n
[DisplayMode\9a9e3e62-2b0f-465e-9946-8c4bb96b3c8f\Objects\Annotations]
DotBorderColor=-1
ShowText=y
ShowAnnotations=y
DotTextColor=-1
[DisplayMode\9a9e3e62-2b0f-465e-9946-8c4bb96b3c8f\Objects\Curves]
ShowCurves=y
CurveThicknessUsage=0
LineJoinStyle=0
LineEndCapStyle=0
CurvePattern=-1
CurveTrans=0
CurveThickness=1
CurveColor=26,22,20
SingleCurveColor=y
ShowCurvatureHair=n
CurveThicknessScale=2
[DisplayMode\9a9e3e62-2b0f-465e-9946-8c4bb96b3c8f\Objects\Meshes]
ShowMeshNakedEdges=n
MeshNonmanifoldEdgeColor=26,22,20
MeshNakedEdgeColor=26,22,20
MeshEdgeColor=26,22,20
MeshNonmanifoldEdgeColorReduction=0
MeshNakedEdgeColorReduction=0
MeshEdgeColorReduction=0
MeshNonmanifoldEdgeThickness=2
MeshNakedEdgeThickness=2
MeshEdgeThickness=2
ShowMeshNonmanifoldEdges=n
ShowMeshEdges=n
MeshVertexSize=0
ShowMeshVertices=n
ShowMeshWires=n
MeshWirePattern=-1
MeshWireThickness=2
MeshWireColor=26,22,20
SingleMeshWireColor=y
HighlightMeshes=n
[DisplayMode\9a9e3e62-2b0f-465e-9946-8c4bb96b3c8f\Objects\Points]
PCSize=2
ShowPoints=y
PointStyle=102
PointSize=3
PCGripStyle=102
PCGripSize=2
PCStyle=50
ShowPointClouds=y
[DisplayMode\9a9e3e62-2b0f-465e-9946-8c4bb96b3c8f\Objects\SubD]
CreaseVisible=y
CreaseUsage=0
CreaseColor=26,22,20
CreaseColorReduction=0
CreaseThickness=1
CreaseThicknessScale=1
CreaseApplyPattern=y
NonmanifoldVisible=n
NonmanifoldUsage=0
NonmanifoldColor=26,22,20
NonmanifoldColorReduction=0
NonmanifoldThickness=2
NonmanifoldThicknessScale=1
NonmanifoldApplyPattern=y
BoundaryVisible=y
BoundaryUsage=0
BoundaryColor=26,22,20
SmoothColorReduction=0
SmoothColor=26,22,20
ShowSymmetryAxis=y
SmoothVisible=n
SubDThicknessUsage=0
BoundaryColorReduction=0
BoundaryThickness=2
SmoothThickness=2
BoundaryThicknessScale=2
BoundaryApplyPattern=y
ShowReflectedPlane=y
SmoothUsage=0
PlaneColorUsage=2
SymmetryAxisThickness=0.02500000037252903
ReflectedColor=64,64,64
ColorPercentage=30
AxisColor=255,0,0
SmoothThicknessScale=1
SmoothApplyPattern=y
[DisplayMode\9a9e3e62-2b0f-465e-9946-8c4bb96b3c8f\Objects\Surfaces]
EdgeColorReduction=0
SurfaceKappaHair=n
HighlightSurfaces=n
ShowIsocurves=n
IsoThicknessUsed=y
IsocurveThickness=1
IsoUThickness=1
IsoVThickness=1
IsoWThickness=1
SingleIsoColor=y
IsoColor=26,22,20
IsoColorsUsed=n
IsoUColor=26,22,20
IsoVColor=26,22,20
IsoWColor=26,22,20
IsoPatternUsed=n
IsocurvePattern=-1
IsoUPattern=-1
IsoVPattern=-1
IsoWPattern=-1
ShowEdges=y
ShowNakedEdges=n
ShowTangentEdges=n
ShowTangentSeams=n
ShowNonmanifoldEdges=n
ShowEdgeEndpoints=n
EdgeThickness=2
EdgeColorUsage=0
NakedEdgeThickness=2
NakedEdgeColorUsage=0
NakedEdgeColorReduction=0
EdgeColor=26,22,20
NakedEdgeColor=26,22,20
NonmanifoldEdgeColor=26,22,20
EdgePattern=-1
NakedEdgePattern=-1
NonmanifoldEdgePattern=-1
SurfaceThicknessUsage=0
SurfaceEdgeThicknessScale=2
SurfaceEdgeApplyPattern=y
SurfaceNakedEdgeUseNormalEdgeThickness=n
SurfaceNakedEdgeThicknessScale=2
SurfaceNakedEdgeApplyPattern=y
SurfaceIsoUThicknessScale=1
SurfaceIsoVThicknessScale=1
SurfaceIsoWThicknessScale=1
SurfaceIsoUApplyPattern=y
SurfaceIsoVApplyPattern=y
SurfaceIsoWApplyPattern=y
ShowFlatSurfaceIsos=n
[DisplayMode\9a9e3e62-2b0f-465e-9946-8c4bb96b3c8f\Objects\Technical]
TEThickness=2
TCThickness=1
TSThickness=1
TIThickness=2
THColor=26,22,20
TEColor=26,22,20
TSiColor=26,22,20
TCColor=26,22,20
TSColor=26,22,20
TIColor=26,22,20
TechnicalMask=45
TechnicalUsageMask=0
THThickness=1
TSiThickness=4
[DisplayMode\9a9e3e62-2b0f-465e-9946-8c4bb96b3c8f\Shading]
ParallelLineRotation=0
CullBackfaces=n
ShadeVertexColors=n
SingleWireColor=y
WireColor=26,22,20
ShadeSurface=y
UseObjectMaterial=n
UseObjectBFMaterial=n
BakeTextures=y
ShowDecals=y
SurfaceColorWriting=y
ShadingEffect=0
ParallelLineWidth=2
ParallelLineSeparation=3
[DisplayMode\9a9e3e62-2b0f-465e-9946-8c4bb96b3c8f\Shading\Material]
BackIsCustom=n
FrontIsCustom=n
UseBackMaterial=n
[DisplayMode\9a9e3e62-2b0f-465e-9946-8c4bb96b3c8f\Shading\Material\Back Material]
ShineIntensity=100
Luminosity=0
Reflectivity=0
Transparency=0
Specular=0,0,0
Shine=0
Diffuse=228,206,162
OverrideObjectReflectivity=y
OverrideObjectTransparency=y
OverrideObjectColor=y
FlatShaded=n
[DisplayMode\9a9e3e62-2b0f-465e-9946-8c4bb96b3c8f\Shading\Material\Back Material\BitmapTexture]
=
[DisplayMode\9a9e3e62-2b0f-465e-9946-8c4bb96b3c8f\Shading\Material\Back Material\EmapTexture]
=
[DisplayMode\9a9e3e62-2b0f-465e-9946-8c4bb96b3c8f\Shading\Material\Back Material\TransparencyTexture]
=
[DisplayMode\9a9e3e62-2b0f-465e-9946-8c4bb96b3c8f\Shading\Material\Front Material]
Diffuse=228,206,162
Specular=0,0,0
Shine=0
ShineIntensity=100
Reflectivity=0
Transparency=0
FlatShaded=n
OverrideObjectColor=y
OverrideObjectTransparency=y
OverrideObjectReflectivity=y
Luminosity=0
[DisplayMode\9a9e3e62-2b0f-465e-9946-8c4bb96b3c8f\Shading\Material\Front Material\BitmapTexture]
=
[DisplayMode\9a9e3e62-2b0f-465e-9946-8c4bb96b3c8f\Shading\Material\Front Material\EmapTexture]
=
[DisplayMode\9a9e3e62-2b0f-465e-9946-8c4bb96b3c8f\Shading\Material\Front Material\TransparencyTexture]
=
[DisplayMode\9a9e3e62-2b0f-465e-9946-8c4bb96b3c8f\View settings]
ShowClippingPlanes=n
FlipGlasses=n
AGViewingMode=0
AGColorMode=0
StereoParallax=1
StereoSeparation=1
StereoModeEnabled=0
BackgroundBitmap=<Pen>
GradBotRight=236,230,216
WzColor=0,0,150
GridTrans=60
WyColor=75,150,75
WxColor=150,75,75
WorldAxesColor=0
GridPlaneColor=0,0,0
PlaneUsesGridColor=n
AxesPercentage=100
PlaneVisibility=0
GridPlaneTrans=90
DrawTransGridPlane=n
GradTopRight=255,250,236
GradBotLeft=236,230,216
GradTopLeft=255,250,236
SolidColor=246,240,226
FillMode=2
CustomLinearWorkflowPostProcessGamma=2.200000047683716
CustomLinearWorkflowPreProcessGamma=2.200000047683716
CustomLinearWorkflowPostProcessFrameBuffer=n
CustomLinearWorkflowPreProcessTextures=y
CustomLinearWorkflowPreProcessColors=y
LinearWorkflowUsage=0
CustomGroundPlaneShadowOnly=n
CustomGroundPlaneAutomaticAltitude=y
CustomGroundPlaneAltitude=0
CustomGroundPlaneShow=n
GroundPlaneUsage=1
UseDocumentGrid=n
DrawGrid=n
DrawAxes=n
DrawZAxis=n
DrawWorldAxes=n
ShowGridOnTop=n
ShowTransGrid=n
BlendGrid=n
VertScale=1
HorzScale=1
ClippingCPColor=255,255,255
ClippingEdgeColor=26,22,20
ClippingSurfaceColor=198,158,120
ClippingEdgeThickness=3
ClippingCPTrans=95
ClippingCPUsage=0
ClippingEdgesUsage=2
ClippingSurfaceUsage=0
ClippingShowCP=n
ClippingClipSelected=y
ClippingShowXEdges=y
ClippingShowXSurface=y
Inker · Good Tools