Skip to content

Commit 5bda119

Browse files
committed
Update sheen to Zeltner 2022 / Blender 4.x
1 parent d688f42 commit 5bda119

File tree

9 files changed

+227
-67
lines changed

9 files changed

+227
-67
lines changed

src/app/editor/inspector/scene.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -213,8 +213,8 @@ static void drawMeshMaterialEditor(VKRT* vkrt, uint32_t meshIndex, const VKRT_Me
213213
materialChanged |= ImGui_SliderFloatEx("Anisotropic", &material.anisotropic, 0.0f, 1.0f, "%.3f", ImGuiSliderFlags_AlwaysClamp);
214214
materialChanged |= ImGui_SliderFloatEx("Transmission", &material.transmission, 0.0f, 1.0f, "%.3f", ImGuiSliderFlags_AlwaysClamp);
215215
materialChanged |= ImGui_SliderFloatEx("Subsurface", &material.subsurface, 0.0f, 1.0f, "%.3f", ImGuiSliderFlags_AlwaysClamp);
216-
materialChanged |= ImGui_SliderFloatEx("Sheen", &material.sheen, 0.0f, 1.0f, "%.3f", ImGuiSliderFlags_AlwaysClamp);
217-
materialChanged |= ImGui_SliderFloatEx("Sheen Tint", &material.sheenTint, 0.0f, 1.0f, "%.3f", ImGuiSliderFlags_AlwaysClamp);
216+
materialChanged |= ImGui_SliderFloatEx("Sheen Weight", &material.sheenTintWeight[3], 0.0f, 1.0f, "%.3f", ImGuiSliderFlags_AlwaysClamp);
217+
materialChanged |= ImGui_ColorEdit3("Sheen Tint", material.sheenTintWeight, ImGuiColorEditFlags_Float);
218218
materialChanged |= ImGui_SliderFloatEx("Sheen Roughness", &material.sheenRoughness, 0.0f, 1.0f, "%.3f", ImGuiSliderFlags_AlwaysClamp);
219219
materialChanged |= ImGui_SliderFloatEx("Clearcoat", &material.clearcoat, 0.0f, 1.0f, "%.3f", ImGuiSliderFlags_AlwaysClamp);
220220
materialChanged |= ImGui_SliderFloatEx("Clearcoat Gloss", &material.clearcoatGloss, 0.0f, 1.0f, "%.3f", ImGuiSliderFlags_AlwaysClamp);

src/app/mesh/loader.c

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -457,12 +457,23 @@ static Material buildMaterial(const cgltf_material* sourceMaterial) {
457457
}
458458

459459
if (sourceMaterial->has_sheen) {
460-
material.sheen = max3(
460+
vec3 sheenColor = {
461461
sourceMaterial->sheen.sheen_color_factor[0],
462462
sourceMaterial->sheen.sheen_color_factor[1],
463463
sourceMaterial->sheen.sheen_color_factor[2]
464-
);
465-
material.sheenTint = material.sheen > 0.0f ? 1.0f : 0.0f;
464+
};
465+
float sheenWeight = max3(sheenColor[0], sheenColor[1], sheenColor[2]);
466+
if (sheenWeight > 0.0f) {
467+
material.sheenTintWeight[0] = sheenColor[0] / sheenWeight;
468+
material.sheenTintWeight[1] = sheenColor[1] / sheenWeight;
469+
material.sheenTintWeight[2] = sheenColor[2] / sheenWeight;
470+
material.sheenTintWeight[3] = sheenWeight;
471+
} else {
472+
material.sheenTintWeight[0] = 1.0f;
473+
material.sheenTintWeight[1] = 1.0f;
474+
material.sheenTintWeight[2] = 1.0f;
475+
material.sheenTintWeight[3] = 0.0f;
476+
}
466477
material.sheenRoughness = sourceMaterial->sheen.sheen_roughness_factor;
467478
}
468479

src/core/api/mesh.c

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ static Material sanitizeMaterial(Material material) {
1010
for (int c = 0; c < 3; c++) {
1111
material.baseColor[c] = vkrtFiniteClampf(material.baseColor[c], 0.0f, 0.0f, 1.0f);
1212
material.emissionColor[c] = vkrtFiniteClampf(material.emissionColor[c], 0.0f, 0.0f, INFINITY);
13+
material.sheenTintWeight[c] = vkrtFiniteClampf(material.sheenTintWeight[c], 0.0f, 0.0f, 1.0f);
1314
}
1415

1516
material.metallic = vkrtFiniteClampf(material.metallic, 0.0f, 0.0f, 1.0f);
@@ -18,8 +19,7 @@ static Material sanitizeMaterial(Material material) {
1819
material.specular = vkrtFiniteClampf(material.specular, 0.0f, 0.0f, 1.0f);
1920
material.specularTint = vkrtFiniteClampf(material.specularTint, 0.0f, 0.0f, 1.0f);
2021
material.anisotropic = vkrtFiniteClampf(material.anisotropic, 0.0f, 0.0f, 1.0f);
21-
material.sheen = vkrtFiniteClampf(material.sheen, 0.0f, 0.0f, 1.0f);
22-
material.sheenTint = vkrtFiniteClampf(material.sheenTint, 0.0f, 0.0f, 1.0f);
22+
material.sheenTintWeight[3] = vkrtFiniteClampf(material.sheenTintWeight[3], 0.0f, 0.0f, 1.0f);
2323
material.clearcoat = vkrtFiniteClampf(material.clearcoat, 0.0f, 0.0f, 1.0f);
2424
material.clearcoatGloss = vkrtFiniteClampf(material.clearcoatGloss, 0.0f, 0.0f, 1.0f);
2525
material.ior = vkrtFiniteClampf(material.ior, 1.0f, 1.0f, 4.0f);
@@ -53,8 +53,7 @@ static int materialsEqual(const Material* a, const Material* b) {
5353
a->anisotropic == b->anisotropic &&
5454
a->specular == b->specular &&
5555
a->specularTint == b->specularTint &&
56-
a->sheen == b->sheen &&
57-
a->sheenTint == b->sheenTint &&
56+
materialComponentEqual(a->sheenTintWeight, b->sheenTintWeight, 4) &&
5857
a->clearcoat == b->clearcoat &&
5958
a->clearcoatGloss == b->clearcoatGloss &&
6059
a->ior == b->ior &&

src/core/api/vkrt_types.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,7 @@ static inline Material VKRT_materialDefault(void) {
8585
.specular = 0.5f,
8686
.specularTint = 0.0f,
8787
.anisotropic = 0.0f,
88-
.sheen = 0.0f,
89-
.sheenTint = 0.5f,
88+
.sheenTintWeight = {1.0f, 1.0f, 1.0f, 0.0f},
9089
.clearcoat = 0.0f,
9190
.clearcoatGloss = 1.0f,
9291
.ior = 1.5f,

src/shaders/bsdf/common.slang

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -120,19 +120,16 @@ float3 bsdfTintColor(float3 baseColor) {
120120
return baseColor / luminance;
121121
}
122122

123-
float3 bsdfSheenTintColor(float3 baseColor) {
124-
float maxComponent = max(baseColor.x, max(baseColor.y, baseColor.z));
125-
if (maxComponent <= 0.0) {
126-
return float3(1.0);
127-
}
123+
float sheenWeight(Material material) {
124+
return saturate(material.sheenTintWeight.w);
125+
}
128126

129-
float tintWeight = smoothstep(0.02, 0.1, maxComponent);
130-
return lerp(float3(1.0), bsdfTintColor(baseColor), tintWeight);
127+
float3 sheenTint(Material material) {
128+
return saturate(material.sheenTintWeight.xyz);
131129
}
132130

133131
float3 bsdfSheenColor(Material material) {
134-
float3 tint = lerp(float3(1.0), bsdfSheenTintColor(material.baseColor), saturate(material.sheenTint));
135-
return tint * material.sheen * (1.0 - material.metallic) * (1.0 - material.transmission);
132+
return sheenTint(material) * sheenWeight(material);
136133
}
137134

138135
float3 bsdfTransmissionColor(Material material) {

0 commit comments

Comments
 (0)