summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-x3ner.shader2
-rwxr-xr-xpbr.cginc55
2 files changed, 38 insertions, 19 deletions
diff --git a/3ner.shader b/3ner.shader
index 18fc303..1f313e7 100755
--- a/3ner.shader
+++ b/3ner.shader
@@ -690,7 +690,7 @@ Shader "yum_food/3ner"
//ifex _Burley_Tiling_Normal_Enabled==0
[HideInInspector] m_start_Burley_Tiling_Normal("Normal", Float) = 0
[ThryToggle(_BURLEY_TILING_NORMAL)] _Burley_Tiling_Normal_Enabled("Enable", Float) = 0
- _Burley_Tiling_Normal_Map("Texture", 2D) = "bump" {}
+ _Burley_Tiling_Normal_Map("Texture", 2D) = "white" {}
_Burley_Tiling_Normal_Map_LUT("LUT", 2D) = "white" {}
_Burley_Tiling_Normal_Strength("Strength", Range(0, 10)) = 1
[HideInInspector] m_end_Burley_Tiling_Normal("Normal", Float) = 0
diff --git a/pbr.cginc b/pbr.cginc
index 7973994..c9ee5c5 100755
--- a/pbr.cginc
+++ b/pbr.cginc
@@ -226,18 +226,25 @@ float3 burley_apply_soft_clipping(float3 gaussian_color, float3 weights) {
return burley_soft_clipping_contrast(gaussian_color, w_hat);
}
-float3 burley_degaussianize(texture2D lut, float3 gaussian_color) {
+float3 burley_degaussianize(texture2D lut, float3 gaussian_color, bool decode_srgb = true) {
float2 uv_r = float2(gaussian_color.r, 0.5f);
float2 uv_g = float2(gaussian_color.g, 0.5f);
float2 uv_b = float2(gaussian_color.b, 0.5f);
float lut_r = lut.Sample(linear_clamp_s, uv_r).r;
float lut_g = lut.Sample(linear_clamp_s, uv_g).g;
float lut_b = lut.Sample(linear_clamp_s, uv_b).b;
- return srgb_to_linear(float3(lut_r, lut_g, lut_b));
+ float3 restored = float3(lut_r, lut_g, lut_b);
+ return decode_srgb ? srgb_to_linear(restored) : restored;
}
-float4 burley_sample_patch(texture2D tex, float2 uv, float2 uv_dx, float2 uv_dy, float2 tri_vertex,
- float input_scale) {
+struct BurleyPatchTransform {
+ float2 uv;
+ float2 dx;
+ float2 dy;
+};
+
+BurleyPatchTransform burley_make_patch_transform(float2 uv, float2 uv_dx, float2 uv_dy,
+ float2 tri_vertex, float input_scale) {
float3 cube_id = float3(tri_vertex.x, tri_vertex.y, -tri_vertex.x - tri_vertex.y);
float3 tile_rand3 = hash33_fast(cube_id);
float2 vertex_uv = burley_tri_to_cart(tri_vertex);
@@ -262,8 +269,16 @@ float4 burley_sample_patch(texture2D tex, float2 uv, float2 uv_dx, float2 uv_dy,
// Finally, remap onto [0, 1].
local_uv += 0.5f;
+ BurleyPatchTransform patch;
+ patch.uv = local_uv;
+ patch.dx = sample_dx;
+ patch.dy = sample_dy;
+ return patch;
+}
+
+float4 burley_sample_patch(texture2D tex, BurleyPatchTransform patch) {
return tex.SampleGrad(
- aniso4_trilinear_repeat_s, local_uv, sample_dx, sample_dy);
+ aniso4_trilinear_repeat_s, patch.uv, patch.dx, patch.dy);
}
#endif // _BURLEY_TILING
@@ -298,31 +313,35 @@ void apply_burley_tiling(v2f i, inout Pbr pbr, inout float3 normal_tangent) {
float3 weights = burley_apply_blend_gamma(baryc, _Burley_Tiling_Blend_Gamma);
float2 uv_dx = ddx(uv);
float2 uv_dy = ddy(uv);
+ BurleyPatchTransform patch_0_transform = burley_make_patch_transform(uv, uv_dx, uv_dy, vertex_0, input_scale);
+ BurleyPatchTransform patch_1_transform = burley_make_patch_transform(uv, uv_dx, uv_dy, vertex_1, input_scale);
+ BurleyPatchTransform patch_2_transform = burley_make_patch_transform(uv, uv_dx, uv_dy, vertex_2, input_scale);
- float4 patch_0 = burley_sample_patch(_Burley_Tiling_Maintex, uv, uv_dx, uv_dy, vertex_0, input_scale);
- float4 patch_1 = burley_sample_patch(_Burley_Tiling_Maintex, uv, uv_dx, uv_dy, vertex_1, input_scale);
- float4 patch_2 = burley_sample_patch(_Burley_Tiling_Maintex, uv, uv_dx, uv_dy, vertex_2, input_scale);
+ float4 patch_0 = burley_sample_patch(_Burley_Tiling_Maintex, patch_0_transform);
+ float4 patch_1 = burley_sample_patch(_Burley_Tiling_Maintex, patch_1_transform);
+ float4 patch_2 = burley_sample_patch(_Burley_Tiling_Maintex, patch_2_transform);
float4 gaussian_blend = patch_0 * weights.x + patch_1 * weights.y + patch_2 * weights.z;
pbr.albedo.xyz = burley_degaussianize(_Burley_Tiling_Maintex_LUT, burley_apply_soft_clipping(gaussian_blend.rgb, weights));
#if defined(_BURLEY_TILING_SMOOTHNESS)
- float patch_0_smoothness = burley_sample_patch(_Burley_Tiling_Smoothness_Map, uv, uv_dx, uv_dy, vertex_0, input_scale);
- float patch_1_smoothness = burley_sample_patch(_Burley_Tiling_Smoothness_Map, uv, uv_dx, uv_dy, vertex_1, input_scale);
- float patch_2_smoothness = burley_sample_patch(_Burley_Tiling_Smoothness_Map, uv, uv_dx, uv_dy, vertex_2, input_scale);
- float smoothness_blend = patch_0_smoothness * weights.x + patch_1_smoothness * weights.y + patch_2_smoothness * weights.z;
+ float4 patch_0_smoothness = burley_sample_patch(_Burley_Tiling_Smoothness_Map, patch_0_transform);
+ float4 patch_1_smoothness = burley_sample_patch(_Burley_Tiling_Smoothness_Map, patch_1_transform);
+ float4 patch_2_smoothness = burley_sample_patch(_Burley_Tiling_Smoothness_Map, patch_2_transform);
+ float4 smoothness_blend = patch_0_smoothness * weights.x + patch_1_smoothness * weights.y + patch_2_smoothness * weights.z;
+ pbr.smoothness = burley_degaussianize(_Burley_Tiling_Smoothness_Map_LUT, burley_apply_soft_clipping(smoothness_blend, weights)).r;
#if defined(_BURLEY_TILING_SMOOTHNESS_INVERT)
- smoothness_blend = 1.0f - smoothness_blend;
+ pbr.smoothness = 1.0f - pbr.smoothness;
#endif // _BURLEY_TILING_SMOOTHNESS_INVERT
- pbr.smoothness = burley_degaussianize(_Burley_Tiling_Smoothness_Map_LUT, burley_apply_soft_clipping(smoothness_blend, weights)).r;
#endif // _BURLEY_TILING_SMOOTHNESS
#if defined(_BURLEY_TILING_NORMAL)
// TODO whiteout blending?
- float4 patch_0_normal = burley_sample_patch(_Burley_Tiling_Normal_Map, uv, uv_dx, uv_dy, vertex_0, input_scale);
- float4 patch_1_normal = burley_sample_patch(_Burley_Tiling_Normal_Map, uv, uv_dx, uv_dy, vertex_1, input_scale);
- float4 patch_2_normal = burley_sample_patch(_Burley_Tiling_Normal_Map, uv, uv_dx, uv_dy, vertex_2, input_scale);
+ float4 patch_0_normal = burley_sample_patch(_Burley_Tiling_Normal_Map, patch_0_transform);
+ float4 patch_1_normal = burley_sample_patch(_Burley_Tiling_Normal_Map, patch_1_transform);
+ float4 patch_2_normal = burley_sample_patch(_Burley_Tiling_Normal_Map, patch_2_transform);
float4 normal_blend = patch_0_normal * weights.x + patch_1_normal * weights.y + patch_2_normal * weights.z;
- normal_tangent = burley_degaussianize(_Burley_Tiling_Normal_Map_LUT, burley_apply_soft_clipping(normal_blend.rgb, weights));
+ normal_tangent = burley_degaussianize(_Burley_Tiling_Normal_Map_LUT, burley_apply_soft_clipping(normal_blend.rgb, weights), false);
+ normal_tangent.xy = normal_tangent.xy * 2 - 1;
normal_tangent.xy *= _Burley_Tiling_Normal_Strength;
normal_tangent = normalize(normal_tangent);
#endif // _BURLEY_TILING_NORMAL