diff options
Diffstat (limited to '3ner.cginc')
| -rw-r--r-- | 3ner.cginc | 51 |
1 files changed, 30 insertions, 21 deletions
@@ -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); } |
