diff options
| author | yum <yum.food.vr@gmail.com> | 2025-10-11 22:08:17 -0700 |
|---|---|---|
| committer | yum <yum.food.vr@gmail.com> | 2025-10-12 11:14:39 -0700 |
| commit | b056c6935128dd7e4a9572a946bab5c4bc08da32 (patch) | |
| tree | 1de16ab073383a5277a19354fbf0d63feaa5090f | |
| parent | dc8a6dfb9d78316b8c58c587bc606468377b0fe3 (diff) | |
gay behavior
| -rw-r--r-- | 3ner.cginc | 39 | ||||
| -rw-r--r-- | 3ner.shader | 8 | ||||
| -rw-r--r-- | custom31.slang | 79 | ||||
| -rw-r--r-- | features.cginc | 5 | ||||
| -rw-r--r-- | globals.cginc | 3 | ||||
| -rw-r--r-- | interpolators.cginc | 3 | ||||
| -rw-r--r-- | lighting.cginc | 2 | ||||
| -rw-r--r-- | vertex.cginc | 31 |
8 files changed, 155 insertions, 15 deletions
@@ -13,6 +13,7 @@ #include "lighting.cginc" #include "globals.cginc" #include "interpolators.cginc" +#include "vertex.cginc" v2f vert(appdata v) { v2f o; @@ -24,14 +25,20 @@ v2f vert(appdata v) { #if defined(_TESSELLATION) o.tpos = v.vertex; #endif - o.pos = UnityObjectToClipPos(v.vertex); - o.uv0 = v.uv0; - o.objPos = v.vertex; - o.worldPos = mul(unity_ObjectToWorld, v.vertex); - o.eyeVec.xyz = o.worldPos.xyz - _WorldSpaceCameraPos; - o.normal = UnityObjectToWorldNormal(v.normal); - o.tangent.xyz = UnityObjectToWorldNormal(v.tangent.xyz); - o.tangent.w = v.tangent.w; + o.uv0 = v.uv0; + o.objPos = v.vertex; +#if defined(_CUSTOM31_FRAGMENT_NORMALS) + o.objPos_orig = v.vertex; +#endif + + // Normal and tangent are in object space. + o.normal = v.normal; + o.tangent = v.tangent; +#if !defined(_CUSTOM31_FRAGMENT_NORMALS) + deform_normal(o.objPos, o.normal.xyz, o.tangent.xyz); +#endif + deform(o.objPos); + propagateObjPos(o); UNITY_TRANSFER_LIGHTING(o, v.uv1); UNITY_TRANSFER_FOG_COMBINED_WITH_EYE_VEC(o, o.pos); @@ -148,13 +155,13 @@ v2f domain( #else o.objPos = DOMAIN_INTERP(objPos); #endif - +#if defined(_CUSTOM31_FRAGMENT_NORMALS) + o.objPos_orig = DOMAIN_INTERP(objPos_orig); +#endif o.normal = DOMAIN_INTERP(normal); o.tangent = DOMAIN_INTERP(tangent); - o.worldPos = mul(unity_ObjectToWorld, float4(o.objPos, 1)); - o.pos = UnityObjectToClipPos(o.objPos); - o.eyeVec.xyz = o.worldPos - _WorldSpaceCameraPos; + propagateObjPos(o); UNITY_TRANSFER_INSTANCE_ID(patch[0], o); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); @@ -166,6 +173,14 @@ float4 frag(v2f i, uint facing : SV_IsFrontFace , out float depth : SV_DepthLessEqual #endif ) : SV_Target { +#if defined(_CUSTOM31_FRAGMENT_NORMALS) + deform_normal(i.objPos_orig, i.normal, i.tangent.xyz); +#endif + + // Convert normal and tangent to world space. + i.normal = UnityObjectToWorldNormal(i.normal); + i.tangent.xyz = UnityObjectToWorldNormal(i.tangent.xyz); + i.normal *= facing ? 1 : -1; i.normal = normalize(i.normal); i.tangent.xyz = normalize(i.tangent.xyz); diff --git a/3ner.shader b/3ner.shader index d4954f5..47d414b 100644 --- a/3ner.shader +++ b/3ner.shader @@ -42,11 +42,15 @@ Shader "yum_food/3ner" [HideInInspector] m_start_Gimmicks("Gimmicks", Float) = 0 //ifex _Custom31_Enabled==0 [HideInInspector] m_start_Custom31("Custom31", Float) = 0 - [ToggleUI] _Custom31_Enabled("Enable", Float) = 0 + [ThryToggle(_CUSTOM31)] _Custom31_Enabled("Enable", Float) = 0 + [ThryToggle(_CUSTOM31_FRAGMENT_NORMALS)] _Custom31_Fragment_Normals_Enabled("Fragment normals", Float) = 0 //ifex _Custom31_Tubes_Enabled==0 [HideInInspector] m_start_Custom31_Tubes("Tubes", Float) = 0 - [ToggleUI] _Custom31_Tubes_Enabled("Enable", Float) = 0 + [ThryToggle(_CUSTOM31_TUBES)] _Custom31_Tubes_Enabled("Enable", Float) = 0 + _Custom31_Tubes_A("A", Range(0,1)) = 0 + _Custom31_Tubes_k("k", Range(0,8)) = 1 + _Custom31_Tubes_tk("time factor", Range(0,10)) = 1 [HideInInspector] m_end_Custom31_Tubes("Tubes", Float) = 0 //endex diff --git a/custom31.slang b/custom31.slang new file mode 100644 index 0000000..4b0e003 --- /dev/null +++ b/custom31.slang @@ -0,0 +1,79 @@ +#ifndef __CUSTOM31_INC +#define __CUSTOM31_INC + +#define PI 3.14159265f + +float3x3 inverse(float3x3 m) { + float det = + m._11 * (m._22 * m._33 - m._23 * m._32) - + m._12 * (m._21 * m._33 - m._23 * m._31) + + m._13 * (m._21 * m._32 - m._22 * m._31); + + if (abs(det) < 1e-6) { + return float3x3( + 1,0,0, + 0,1,0, + 0,0,1); + } + + float invDet = 1.0f / det; + float3x3 inv; + + inv._11 = (m._22 * m._33 - m._23 * m._32) * invDet; + inv._12 = (m._13 * m._32 - m._12 * m._33) * invDet; + inv._13 = (m._12 * m._23 - m._13 * m._22) * invDet; + inv._21 = (m._23 * m._31 - m._21 * m._33) * invDet; + inv._22 = (m._11 * m._33 - m._13 * m._31) * invDet; + inv._23 = (m._13 * m._21 - m._11 * m._23) * invDet; + inv._31 = (m._21 * m._32 - m._22 * m._31) * invDet; + inv._32 = (m._31 * m._12 - m._11 * m._32) * invDet; + inv._33 = (m._11 * m._22 - m._12 * m._21) * invDet; + + return inv; +} + +[Differentiable] +public float3 c31_deform(float3 xyz, no_diff float A, no_diff float k, no_diff float t) { + float x = xyz.x; + float y = xyz.y; + float z = xyz.z; + + float x0 = x + sin(y * k) * 0.1; + float y0 = y + sin(x * k * 2) * 0.5 + cos(z); + float z0 = (z + sin(x * y * k * PI + t) * A) * (1.0 + sin(y * k) * sin(x * k)); + + x0 += z0 * 0.1 * sin(z0 * PI + 1.5); + y0 += z0 * 0.1 * sin(z0 * PI + 1.5); + + x0 -= 0.0; + y0 -= 1.2; + + return float3( + x0, y0, z0 + ); +} + +// Deform a normal vector using the inverse transpose of the jacobian. +public void c31_deform_normal(float3 xyz, inout float3 normal, inout float3 tangent, float A, float k, float t) { + // Compute jacobian using autodiff applied to basis vectors. + DifferentialPair<float3> dp_x = diffPair(xyz, float3(1, 0, 0)); + DifferentialPair<float3> dp_y = diffPair(xyz, float3(0, 1, 0)); + DifferentialPair<float3> dp_z = diffPair(xyz, float3(0, 0, 1)); + + DifferentialPair<float3> dp_x_out = fwd_diff(c31_deform)(dp_x, A, k, t); + DifferentialPair<float3> dp_y_out = fwd_diff(c31_deform)(dp_y, A, k, t); + DifferentialPair<float3> dp_z_out = fwd_diff(c31_deform)(dp_z, A, k, t); + + // Transform normal and tangent using jacobian + float3x3 jacobian = float3x3( + float3(dp_x_out.d.x, dp_y_out.d.x, dp_z_out.d.x), + float3(dp_x_out.d.y, dp_y_out.d.y, dp_z_out.d.y), + float3(dp_x_out.d.z, dp_y_out.d.z, dp_z_out.d.z) + ); + float3x3 itjac = inverse(transpose(jacobian)); + normal = normalize(mul(itjac, normal)); + tangent = normalize(mul(jacobian, tangent)); +} + +#endif // __CUSTOM31_INC + diff --git a/features.cginc b/features.cginc index e3e7f6a..d6ba34d 100644 --- a/features.cginc +++ b/features.cginc @@ -23,6 +23,11 @@ #pragma shader_feature_local _CLOTH_SHEEN //endex +//ifex _Custom31_Enabled==0 +#pragma shader_feature_local _CUSTOM31 +#pragma shader_feature_local _CUSTOM31_FRAGMENT_NORMALS +//endex + //ifex _Custom31_Tubes_Enabled==0 #pragma shader_feature_local _CUSTOM31_TUBES //endex diff --git a/globals.cginc b/globals.cginc index ee997e9..f615136 100644 --- a/globals.cginc +++ b/globals.cginc @@ -59,6 +59,9 @@ texture2D _Cloth_Sheen_DFG_LUT; #if defined(_CUSTOM31_TUBES) float _Custom31_Tubes_Speed; +float _Custom31_Tubes_A; +float _Custom31_Tubes_k; +float _Custom31_Tubes_tk; #endif // _CUSTOM31_TUBES #endif // __GLOBALS_INC diff --git a/interpolators.cginc b/interpolators.cginc index 7fa53d5..9041e15 100644 --- a/interpolators.cginc +++ b/interpolators.cginc @@ -25,6 +25,9 @@ struct v2f { float3 normal : TEXCOORD4; float4 tangent : TEXCOORD5; UNITY_LIGHTING_COORDS(6,7) +#if defined(_CUSTOM31_FRAGMENT_NORMALS) + float3 objPos_orig : TEXCOORD8; +#endif UNITY_VERTEX_INPUT_INSTANCE_ID UNITY_VERTEX_OUTPUT_STEREO diff --git a/lighting.cginc b/lighting.cginc index 6668459..17f1a0a 100644 --- a/lighting.cginc +++ b/lighting.cginc @@ -203,7 +203,7 @@ void GetLighting(v2f i, Pbr pbr, out LightData data) { data.indirect.double_LoV = saturate(2.0f * indirect_LoV * indirect_LoV - 1.0f); data.indirect.diffuse = getIndirectDiffuse(i, pbr, data.indirect); - data.indirect.specular = getIndirectSpecular(i, pbr.roughness_perceptual, view_dir, data.indirect.dir); + data.indirect.specular = getIndirectSpecular(i, pbr.roughness, view_dir, data.indirect.dir); #if defined(_CLEARCOAT) data.indirect.specular_cc = getIndirectSpecular(i, pbr.cc_roughness, view_dir, dir_cc); #endif diff --git a/vertex.cginc b/vertex.cginc new file mode 100644 index 0000000..0140ff2 --- /dev/null +++ b/vertex.cginc @@ -0,0 +1,31 @@ +#ifndef __VERTEX_INC +#define __VERTEX_INC + +#include "custom31.hlsl" + +void deform(inout float3 objPos) { +#if defined(_CUSTOM31_TUBES) + float A = _Custom31_Tubes_A; + float k = _Custom31_Tubes_k; + float t = _Time[2] * _Custom31_Tubes_tk; + objPos = c31_deform(objPos, A, k, t); +#endif // _CUSTOM31_TUBES +} + +void deform_normal(float3 objPos, inout float3 objNorm, inout float3 objTan) { +#if defined(_CUSTOM31_TUBES) + float A = _Custom31_Tubes_A; + float k = _Custom31_Tubes_k; + float t = _Time[2] * _Custom31_Tubes_tk; + c31_deform_normal(objPos, objNorm, objTan, A, k, t); +#endif // _CUSTOM31_TUBES +} + +void propagateObjPos(inout v2f i) { + i.worldPos = mul(unity_ObjectToWorld, float4(i.objPos, 1)); + i.pos = UnityObjectToClipPos(i.objPos); + i.eyeVec.xyz = i.worldPos - _WorldSpaceCameraPos; +} + +#endif // __VERTEX_INC + |
