Proposed VRM mtoon in Substance Designer
The Context
VRM is a file format for handling 3D humanoid avatars in VR applications. It’s designed to be a versatile and exchangeable format across various systems. mtoon is a toon shader used with VRM models to give them a distinct, stylized look that emulates 2D animation within a 3D space.
Substance Designer is a powerful node-based texturing tool essential for creating realistic textures for 3D models. By implementing mtoon support in Substance Designer, we can bridge the gap between high-quality texture design and VRM character customization.
The Problem Statement
The current workflow for applying toon shading to VRM models is disconnected from the process of designing textures, often requiring multiple tools and manual adjustments. We aim to simplify the workflow by integrating mtoon support directly into Substance Designer, allowing for a more cohesive and efficient design process.
Describe how your proposal will work with code, pseudo-code, mock-ups, or diagrams
The implementation would involve developing a custom Substance Designer node set or a template that encapsulates mtoon’s parameters and replicates its shading model within the Substance Designer environment. This would allow artists to preview and tweak the toon shader settings in real-time while crafting the textures.
A mock-up interface would present these parameters within Substance Designer, where each one directly corresponds to a property in the VRM mtoon shader.
The Benefits
- Streamlined Workflow: Artists can create and adjust VRM textures and toon shaders all within Substance Designer.
- Real-time Previews: Immediate feedback on how changes to textures and shader parameters impact the final appearance.
- Consistency: Reduces discrepancies between the design phase and the final rendering in VR applications.
The Downsides
- Development Time: Significant time investment required to develop and maintain the custom node set/template.
- Complexity: Adds an additional layer of complexity within Substance Designer, which could be overwhelming for new users.
- Niche Audience: The feature might only cater to a relatively small audience of VRM content creators.
The Road Not Taken
We could have chosen to maintain the status quo, requiring VRM creators to switch between multiple tools to finalize their avatar’s appearance. However, this would prolong the existing inefficiencies in the production pipeline.
The Infrequent Use Case
While most VRM mtoon use cases involve common elements like lit colors and normal maps, less frequent use cases could involve highly custom properties such as UV animations or unique rim lighting effects.
In Core and Done by Us
The development of this feature would be in-house, ensuring deep integration with existing Substance Designer systems and full control over the implementation and updates.
Status
Status: Proposed
Decision Makers
- V-Sekai development team and community stakeholders.
Further Reading
- V-Sekai · GitHub - Official GitHub account for the V-Sekai development community focusing on social VR functionality for the Godot Engine.
- V-Sekai/v-sekai-game - GitHub page for the V-Sekai open-source project bringing social VR/VRSNS/metaverse components to the Godot Engine.
AI assistant Aria assisted with this article.
Below is a table of parameters for the proposed VRM mtoon Substance Designer node set/template:
Rank | Parameter | Type | Description | Impact Level | Range |
---|---|---|---|---|---|
1 | _Color |
vec4 | Lit Color, Alpha (Lit RGB, Alpha A) | High | [0, 1] |
2 | _MainTex |
texture | Main Texture (RGB) | High | [0, 1] |
3 | _ShadeColor |
vec4 | Shade Color (Shade RGB) | High | [0, 1] |
4 | _ShadeTexture |
texture | Shade Texture (RGB) | High | [0, 1] |
5 | _ShadeToony |
float | Shading Toony (0.0 is Lambert. Higher value get toony shading.) | High | [0.0, 1.0] |
6 | _RimColor |
vec4 | Rim Color (RGB) | High | [0, 1] |
7 | _RimTexture |
texture | Rim Texture (RGB) | High | [0, 1] |
8 | _EmissionColor |
vec4 | Emission Color (RGB) | High | [0, 1] |
9 | _EmissionMap |
texture | Emission Map (RGB) | High | [0, 1] |
10 | _Cutoff |
float | Alpha Cutoff (Discard pixels below this value in Cutout mode) | High | [0.0, 1.0] |
11 | _AlphaCutoutEnable |
int | Rendering Type (TransparentWithZWrite mode can cause problems with rendering.) | High | {0, 1} |
12 | _MainTex_ST |
vec4 | UV Offset (UV Scale X,Y, UV Offset X,Y) | High | [0, 1] |
13 | _BumpScale |
vec2 | Normal Map and Multiplier for normals in tangent space | High | [0.0, 1.0] |
14 | _BumpMap |
texture | Normal Map (RGB) | High | [0, 1] |
15 | _OutlineWidth |
float | Width (Outline Width) | High | [0.01, ∞) |
16 | _OutlineWidthTexture |
texture | Outline Width Texture (R) | High | [0, 1] |
17 | _OutlineColor |
vec4 | Outline Color (RGB) | High | [0, 1] |
18 | _SphereAdd |
texture | MatCap Texture (RGB) | Subtle | [0, 1] |
19 | _ShadeShift |
float | Shading Shift (Zero is Default. Negative value increase lit area. Positive value increase shade area.) | Moderate | [-1.0, ∞) |
20 | _ReceiveShadowRate |
float | Shadow Receive (Texture R * Rate. White is Default. Black attenuates shadows.) | Moderate | [0.0, 1.0] |
21 | _ReceiveShadowTexture |
texture | Receive Shadow Texture (R) | Moderate | [0, 1] |
22 | _ShadingGradeRate |
float | Shading Grade (Lit & Shade Mixing Multiplier: Texture R * Rate. Compatible with UTS2 ShadingGradeMap. White is Default. Black amplifies shade.) | Moderate | [0.0, 1.0] |
23 | _ShadingGradeTexture |
texture | Shading Grade Texture (R) | Moderate | [0, 1] |
24 | _LightColorAttenuation |
float | Light Color Attenuation | Moderate | [0.0, ∞) |
25 | _IndirectLightIntensity |
float | GI Intensity (Indirect Light Intensity) | Moderate | [0.0, ∞) |
26 | _MatcapColor |
vec4 | MatCap Color (Color multiplied with Additive Sphere map / MatCap Texture RGB) | Subtle | [0, 1] |
27 | _RimLightingMix |
float | Rim Lighting Mix | Subtle | [0.0, 1.0] |
28 | _RimFresnelPower |
float | Fresnel Power (If you increase this value, you get sharper rim light.) | Subtle | [0.0, 100.0] |
29 | _RimLift |
float | Rim Lift (If you increase this value, you can lift rim light.) | Subtle | [0.0, ∞) |
30 | _OutlineWidthMode |
int | Mode (None = outline pass disabled; World = outline in world coordinates; Screen = screen pixel thickness) | Outline-Specific | {0, 1, 2} |
31 | _OutlineScaledMaxDistance |
float | Outline Scaled Distance (Width Scaled Max Distance) | Outline-Specific | [1.0, 10.0] |
32 | _OutlineColorMode |
int | Color Mode (FixedColor = unshaded; MixedLighting = match environment light (recommended)) | Outline-Specific | {0, 1} |
33 | _OutlineLightingMix |
float | Outline Mix (Outline Lighting Mix) | Outline-Specific | [0.0, 1.0] |
34 | _UvAnimMaskTexture |
texture | Auto Animation Mask Texture (R) | UV Animation | [0, 1] |
35 | _UvAnimScrollX |
float | UV Scroll X (per second) | UV Animation | [-100.0, 100.0] |
36 | _UvAnimScrollY |
float | UV Scroll Y (per second) | UV Animation | [-100.0, 100.0] |
37 | _UvAnimRotation |
float | UV Rotation (per second) | UV Animation | [-100.0, 100.0] |
38 | _DebugMode |
int | Visualize (Debugging Visualization: Normal or Lighting) | Debugging | {0, 1, 2} |