summaryrefslogtreecommitdiffstats
path: root/3ner.cginc
diff options
context:
space:
mode:
Diffstat (limited to '3ner.cginc')
-rw-r--r--3ner.cginc51
1 files changed, 30 insertions, 21 deletions
diff --git a/3ner.cginc b/3ner.cginc
index 4aa4184..08bb7cd 100644
--- a/3ner.cginc
+++ b/3ner.cginc
@@ -79,27 +79,31 @@ tess_factors patch_constant(InputPatch<v2f, 3> patch) {
#if defined(_TESSELLATION)
float edgeLength = _Tessellation_Factor;
- float3 p0_world = mul(unity_ObjectToWorld, float4(patch[0].objPos, 1));
- float3 p1_world = mul(unity_ObjectToWorld, float4(patch[1].objPos, 1));
- float3 p2_world = mul(unity_ObjectToWorld, float4(patch[2].objPos, 1));
-
- float3 v0 = p0_world - _WorldSpaceCameraPos;
- float3 v1 = p1_world - _WorldSpaceCameraPos;
- float3 v2 = p2_world - _WorldSpaceCameraPos;
-
- // Angular size drops with inverse distance
- float s0 = rsqrt(dot(v0, v0));
- float s1 = rsqrt(dot(v1, v1));
- float s2 = rsqrt(dot(v2, v2));
-
- float s01 = (s0 + s1) * 0.5f;
- float s12 = (s1 + s2) * 0.5f;
- float s20 = (s2 + s0) * 0.5f;
-
+ // Transform object-space positions to clip space
+ float4 p0_clip = UnityObjectToClipPos(float4(patch[0].objPos, 1));
+ float4 p1_clip = UnityObjectToClipPos(float4(patch[1].objPos, 1));
+ float4 p2_clip = UnityObjectToClipPos(float4(patch[2].objPos, 1));
+
+ // Convert to normalized device coordinates (NDC)
+ float3 p0_ndc = p0_clip.xyz / p0_clip.w;
+ float3 p1_ndc = p1_clip.xyz / p1_clip.w;
+ float3 p2_ndc = p2_clip.xyz / p2_clip.w;
+
+ // Convert to screen space (scale by screen dimensions)
+ float2 p0_screen = p0_ndc.xy * _ScreenParams.xy * 0.5f;
+ float2 p1_screen = p1_ndc.xy * _ScreenParams.xy * 0.5f;
+ float2 p2_screen = p2_ndc.xy * _ScreenParams.xy * 0.5f;
+
+ // Calculate screen-space edge lengths in pixels
+ float edge01 = length(p1_screen - p0_screen);
+ float edge12 = length(p2_screen - p1_screen);
+ float edge20 = length(p0_screen - p2_screen);
+
+ // Scale tessellation by screen-space edge length and falloff factor
float k = _Tessellation_Falloff_Factor;
- f.edge[2] = min(_Tessellation_Factor, k * _Tessellation_Factor * s01);
- f.edge[0] = min(_Tessellation_Factor, k * _Tessellation_Factor * s12);
- f.edge[1] = min(_Tessellation_Factor, k * _Tessellation_Factor * s20);
+ f.edge[2] = min(_Tessellation_Factor, k * edge01);
+ f.edge[0] = min(_Tessellation_Factor, k * edge12);
+ f.edge[1] = min(_Tessellation_Factor, k * edge20);
f.inside = (f.edge[0] + f.edge[1] + f.edge[2]) * 0.333333f;
@@ -115,7 +119,7 @@ tess_factors patch_constant(InputPatch<v2f, 3> patch) {
f.inside = 1;
#endif
-#if defined(_TESSELLATION) && defined(_TESSELLATION_HEIGHTMAPS)
+#if defined(_TESSELLATION)
{
float4 p0 = patch[0].pos;
float4 p1 = patch[1].pos;
@@ -251,6 +255,11 @@ float4 frag(v2f i, uint facing : SV_IsFrontFace) : SV_Target {
LightData light_data;
GetLighting(i, pbr, light_data);
+
+#if 0
+ float c = light_data.direct.NoL;
+ return float4(c,c,c,1);
+#endif
return brdf(pbr, light_data);
}