diff options
Diffstat (limited to '3ner.cginc')
| -rwxr-xr-x | 3ner.cginc | 38 |
1 files changed, 28 insertions, 10 deletions
@@ -31,11 +31,32 @@ v2f vert(appdata v) { UNITY_TRANSFER_INSTANCE_ID(v, o); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); - // Apply instance texture offset transformation if enabled + impostor_vert(v.vertex.xyz); + +#if defined(_VERTEX_DEFORMATION) && ( \ + defined(_VERTEX_DEFORMATION_FRAGMENT_NORMALS) || \ + defined(_VERTEX_DEFORMATION_TESSELLATION)) || \ + (defined(_IMPOSTORS) && defined(_INSTANCE_TEXTURE_OFFSET)) + o.objPos_orig = v.vertex; +#endif + + + [branch] if (instance_distance_culling()) { + return (v2f) asfloat(-1); + } instancing_vert(v); -#if defined(_IMPOSTORS) - impostor_vert(v.vertex.xyz); +#if defined(_INSTANCE_TEXTURE_OFFSET) && defined(UNITY_INSTANCING_ENABLED) + // Early exit custom frustum culling. + float3 instanceCenter; + if (get_instance_center(instanceCenter)) { + float4 instanceClipPos = UnityObjectToClipPos(instanceCenter); + instanceClipPos /= instanceClipPos.w; + float k = 1.05; + if (any(instanceClipPos.xy < -k) || any(instanceClipPos.xy > k)) { + return (v2f) asfloat(-1); + } + } #endif #if defined(_TESSELLATION) @@ -47,9 +68,6 @@ v2f vert(appdata v) { o.uv23.zw = v.uv3; float3 obj_space_camera_pos = mul(unity_WorldToObject, float4(_WorldSpaceCameraPos, 1.0)); o.objPos = v.vertex; -#if defined(_VERTEX_DEFORMATION_FRAGMENT_NORMALS) || defined(_VERTEX_DEFORMATION_TESSELLATION) - o.objPos_orig = v.vertex; -#endif #if defined(_RAY_MARCHING_BAKED_ORIGINS) o.color = v.color; #endif @@ -190,7 +208,10 @@ v2f domain( o.objPos = DOMAIN_INTERP(objPos); #endif -#if defined(_VERTEX_DEFORMATION_FRAGMENT_NORMALS) || defined(_VERTEX_DEFORMATION_TESSELLATION) +#if defined(_VERTEX_DEFORMATION) && ( \ + defined(_VERTEX_DEFORMATION_FRAGMENT_NORMALS) || \ + defined(_VERTEX_DEFORMATION_TESSELLATION)) || \ + defined(_IMPOSTORS) && defined(_INSTANCE_TEXTURE_OFFSET) o.objPos_orig = DOMAIN_INTERP(objPos_orig); o.objPos = o.objPos_orig; deform(o.objPos); @@ -266,9 +287,6 @@ float4 frag(v2f i, uint facing : SV_IsFrontFace return 0; #endif - // Apply instancing effects (e.g., distance culling) - instancing_frag(i); - #if defined(_RAY_MARCHING) const bool is_fragment = true; ray_march(i, is_fragment); |
