Advertisement
noradninja

Shader_LOD

Oct 16th, 2023 (edited)
856
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.14 KB | None | 0 0
  1. using System;
  2. using UnityEngine;
  3. using UnityEngine.Rendering;
  4.  
  5. public class Shader_LOD_Enumerator : MonoBehaviour
  6. {
  7.     public enum LODState
  8.     {
  9.         Full,
  10.         Reduced,
  11.         VertexOnly
  12.     }
  13.  
  14.     public GameObject player;
  15.     public float[] LOD_Distance;
  16.     public bool enableShaderLOD = true;
  17.     public bool isFoliage;
  18.     public Material replacementMaterial;
  19.     public float distance;
  20.  
  21.     [SerializeField] private int tick;
  22.  
  23.     [SerializeField] private Texture albedoTex;
  24.  
  25.     [SerializeField] private Texture MOARTex;
  26.  
  27.     [SerializeField] private Material originalMaterial;
  28.  
  29.     public bool shadowCaster;
  30.  
  31.     public LODState shaderLOD;
  32.     private Vector3 playerPos;
  33.     private Vector3 thisPos;
  34.     private Renderer thisRenderer;
  35.     private Vector3 viewPos;
  36.  
  37.     private void Awake()
  38.     {
  39.         thisRenderer = this.GetComponent<Renderer>();
  40.         shadowCaster = thisRenderer.shadowCastingMode == ShadowCastingMode.On;
  41.     }
  42.  
  43.     private void Start()
  44.     {
  45.         tick = 0;
  46.         //get needed components
  47.         originalMaterial = thisRenderer.sharedMaterial;
  48.         albedoTex = originalMaterial.mainTexture;
  49.         MOARTex = originalMaterial.GetTexture("_MetallicGlossMap");
  50.  
  51.         //assign materials if not assigned already, and textures for later use
  52.         if (isFoliage) //grab the textures we need from the old mat, disable leaf wiggle
  53.         {
  54.             if (replacementMaterial != null) return;
  55.             replacementMaterial = new Material(Shader.Find("Vita/Lightmapped Vertlit Wind Foliage"));
  56.             replacementMaterial.SetFloat("_LeavesOn", 0);
  57.             replacementMaterial.SetTextureScale("_MainTex", new Vector2(2, 2));
  58.             replacementMaterial.SetTexture("_MOAR", MOARTex);
  59.         }
  60.         else //basic vertex lightmap mat
  61.         {
  62.             if (replacementMaterial != null) return;
  63.             replacementMaterial = new Material(Shader.Find("Vita/Vertex_Lightmap"));
  64.             replacementMaterial.mainTexture = albedoTex;
  65.         }
  66.     }
  67.  
  68.     private void Update()
  69.     {
  70.         // we only need to do *whatever* FPS/tick times a frame, depending on refresh rate
  71.         if (tick != 6)
  72.             tick++;
  73.         else
  74.         {
  75.             thisPos = this.transform.position;
  76.             playerPos = player.transform.position;
  77.             distance = Vector3.Distance(thisPos, playerPos); //how far are we from the player, I should make this disregard Y
  78.             tick = 0;
  79.             TickUpdate();
  80.         }
  81.     }
  82.  
  83.     private void TickUpdate()
  84.     {
  85.         if (!enableShaderLOD) return; //check if we enabled this; if not, dump
  86.         shaderLOD = distance <= LOD_Distance[1]
  87.             ? distance <= LOD_Distance[0] ? LODState.Full : LODState.Reduced : LODState.VertexOnly; //set LOD based on our distance from the player
  88.  
  89.         switch (shaderLOD)
  90.         {
  91.             case LODState.Full:
  92.                 if (!thisRenderer.sharedMaterial.IsKeywordEnabled("_NORMALMAP"))
  93.                     thisRenderer.sharedMaterial.EnableKeyword("_NORMALMAP"); //enable normalmap
  94.                 if (shadowCaster && thisRenderer.shadowCastingMode != ShadowCastingMode.On)
  95.                     thisRenderer.shadowCastingMode = ShadowCastingMode.On; //enable shadows
  96.                 break;
  97.             case LODState.Reduced:
  98.                 if (thisRenderer.sharedMaterial != originalMaterial) thisRenderer.sharedMaterial = originalMaterial;
  99.                 if (thisRenderer.sharedMaterial.IsKeywordEnabled("_NORMALMAP"))
  100.                     thisRenderer.sharedMaterial.DisableKeyword("_NORMALMAP"); //drop normalmap
  101.                 if (shadowCaster && thisRenderer.shadowCastingMode != ShadowCastingMode.Off)
  102.                     thisRenderer.shadowCastingMode = ShadowCastingMode.Off; //disable shadows
  103.                 break;
  104.             case LODState.VertexOnly:
  105.                 thisRenderer.sharedMaterial = replacementMaterial;
  106.                 if (shadowCaster && thisRenderer.shadowCastingMode != ShadowCastingMode.Off)
  107.                   thisRenderer.shadowCastingMode = ShadowCastingMode.Off; //disable shadows
  108.                 break;
  109.         }
  110.     }
  111. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement