transparent-mesh-is-watertight#
Code |
VG.022 |
|---|---|
Validator |
|
Compatibility |
|
Tags |
|
Version |
0.1.0 |
Summary#
Transparent physical bodies should be watertight to allow for simulation of light transmission and refraction.
Description#
Watertight meshes are essential for transparent materials to ensure accurate light simulation, including transmission, refraction, and caustics. A watertight mesh has no holes, gaps, or non-manifold edges that would allow light to pass through unintended areas or create visual artifacts.
Key characteristics of watertight transparent meshes:
No holes or gaps in the surface
All edges are shared by exactly two faces
Consistent face normals
No overlapping geometry
Properly closed volume
Why is it required?#
Accurate light transmission simulation
Proper refraction calculations
Realistic caustics and light effects
Prevents light leakage through mesh gaps
Ensures consistent transparency behavior
Maintains visual quality in raytraced rendering
Examples#
Material Transparency Detection#
# Example 1: Glass material with transparency properties
def Material "GlassWindow" {
def Shader "GlassShader" {
uniform token info:implementationSource = "sourceAsset"
uniform asset info:mdl:sourceAsset = @./glass_base.mdl@
uniform token info:mdl:sourceAsset:subIdentifier = "Glass_base"
# Transparency indicators
bool inputs:thin_walled = true
float inputs:glass_ior = 1.491
float inputs:cutout_opacity = 0.8
}
}
# Example 2: SimPBR material with transmission enabled
def Material "TransparentPlastic" {
def Shader "SimPBRShader" {
uniform token info:implementationSource = "sourceAsset"
uniform asset info:mdl:sourceAsset = @./SimPBR.mdl@
uniform token info:mdl:sourceAsset:subIdentifier = "SimPBR"
# Transparency indicators
bool inputs:enable_transmission = true
bool inputs:enable_opacity = true
float inputs:alpha_constant = 0.7
float inputs:opacity_ratio = 0.5
}
}
# Example 3: Opaque material (no transparency)
def Material "OpaqueMetal" {
def Shader "SimPBRShader" {
uniform token info:implementationSource = "sourceAsset"
uniform asset info:mdl:sourceAsset = @./SimPBR.mdl@
uniform token info:mdl:sourceAsset:subIdentifier = "SimPBR"
# No transparency indicators
bool inputs:enable_transmission = false
bool inputs:enable_opacity = false
float inputs:alpha_constant = 1.0
bool inputs:thin_walled = false
}
}
Mesh Topology Examples#
# Invalid: Non-watertight transparent mesh with holes
def Mesh "TransparentCube" {
int[] faceVertexCounts = [4, 4, 4, 4, 4] # Missing one face
int[] faceVertexIndices = [0, 1, 2, 3, 4, 5, 6, 7, 0, 4, 7, 3, 1, 5, 6, 2, 0, 1, 5, 4]
point3f[] points = [(0,0,0), (1,0,0), (1,1,0), (0,1,0), (0,0,1), (1,0,1), (1,1,1), (0,1,1)]
# Missing top face: [3, 2, 6, 7]
# This mesh has a hole and should not be used with transparent materials
}
# Valid: Watertight transparent mesh
def Mesh "TransparentCube" {
int[] faceVertexCounts = [4, 4, 4, 4, 4, 4] # All 6 faces present
int[] faceVertexIndices = [0, 1, 2, 3, 4, 5, 6, 7, 0, 4, 7, 3, 1, 5, 6, 2, 0, 1, 5, 4, 3, 2, 6, 7]
point3f[] points = [(0,0,0), (1,0,0), (1,1,0), (0,1,0), (0,0,1), (1,0,1), (1,1,1), (0,1,1)]
# All faces present - watertight
}
How to comply#
Use mesh repair tools to fill holes and gaps
Ensure all edges are shared by exactly two faces
Check for and fix non-manifold geometry
Verify consistent face normals
Use boolean operations to create proper closed volumes
Validate mesh topology before applying transparency
Third-party mesh repair software (Blender, Maya, 3ds Max)