Shader 之 LOD详解

本文详细介绍了Unity中LODShader的工作原理及其使用方法。通过不同LOD级别的SubShader设置,实现根据距离变化调整材质细节,从而优化性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Shader "Custom/LODShader" {
    Properties {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Glossiness ("Smoothness", Range(0,1)) = 0.5
        _Metallic ("Metallic", Range(0,1)) = 0.0
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 600 

        CGPROGRAM

        #pragma surface surf Standard fullforwardshadows

        #pragma target 3.0

        sampler2D _MainTex;

        struct Input {
            float2 uv_MainTex;
        };

        half _Glossiness;
        half _Metallic;
        fixed4 _Color;

        void surf (Input IN, inout SurfaceOutputStandard o) {
            o.Albedo = fixed3(1.0, 0.0, 0.0);
        }
        ENDCG
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 500 

        CGPROGRAM

        #pragma surface surf Standard fullforwardshadows

        #pragma target 3.0

        sampler2D _MainTex;

        struct Input {
            float2 uv_MainTex;
        };

        half _Glossiness;
        half _Metallic;
        fixed4 _Color;

        void surf (Input IN, inout SurfaceOutputStandard o) {
            o.Albedo = fixed3(0.0, 1.0, 0.0);
        }
        ENDCG
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 400 

        CGPROGRAM

        #pragma surface surf Standard fullforwardshadows

        #pragma target 3.0

        sampler2D _MainTex;

        struct Input {
            float2 uv_MainTex;
        };

        half _Glossiness;
        half _Metallic;
        fixed4 _Color;

        void surf (Input IN, inout SurfaceOutputStandard o) {
            o.Albedo = fixed3(0.0, 0.0, 1.0);
        }
        ENDCG
    }
    FallBack "Diffuse"
}


using UnityEngine;
using System.Collections;

public class Test2 : MonoBehaviour
{
    public Shader shader;
    public int va = 600;

    void Start()
    {
        Debug.Log(this.shader.maximumLOD);
    }


    void Update()
    {
        this.shader.maximumLOD =va;
    }
}

这里写图片描述


这里写图片描述


这里写图片描述


总结:

 shader有一个LOD,每一个SubShader又分别有各自的LOD
 按照shader书写顺序,从上到下依次查阅SubShader
 如果当前查阅的SubShader的LOD <= Shader.maximumLOD ,就停止查阅,立即执行当前的SubShader;
 最终只有一个SubShader会被执行

FR:海涛高软(hunk Xu)

在Unity中,Tags是一种特殊的关键字,用于在Shader中指定一些渲染相关的信息,例如渲染类型、渲染队列、渲染器名称等。Tags通常被用于告诉Unity如何处理Shader,以及如何在场景中使用该Shader。 下面是一些常用的Tags及其含义: - RenderType:指定渲染类型,例如Opaque(不透明)、Transparent(半透明)、TransparentCutout(半透明带透明贴图)等。 - Queue:指定渲染队列,用于控制Shader的渲染顺序。具有相同队列的Shader将按照其在场景中的顺序进行渲染。 - DisableBatching:禁用批处理,用于控制是否对多个物体使用相同的Shader进行批处理。如果禁用批处理,则会为每个物体单独进行渲染,可能会影响性能。 - RenderPipeline:指定渲染管线,用于控制Shader在哪个渲染管线中使用(例如Built-in或Universal Render Pipeline)。 - ShaderLOD:指定ShaderLOD级别,用于控制Shader在不同距离下的细节程度。较远的物体可以使用较低的LOD级别以提高性能。 Tags通常出现在Shader文件的SubShader块中,用于告诉Unity如何处理该SubShader。例如,在以下示例中,我们使用RenderType标签指定该SubShader渲染类型为Opaque: ```ShaderLab SubShader { Tags { "RenderType"="Opaque" } // ... } ``` 除了在Shader文件中使用Tags之外,我们还可以在Unity Editor中使用Tags进行场景配置。例如,在设置相机的渲染路径时,我们可以使用Tags来指定渲染管线: ```C# Camera.main.depthTextureMode = DepthTextureMode.Depth; Camera.main.renderingPath = RenderingPath.Forward; Camera.main.actualRenderingPath = RenderingPath.Forward; Camera.main.clearFlags = CameraClearFlags.SolidColor; Camera.main.backgroundColor = Color.black; Camera.main.allowHDR = true; Camera.main.allowMSAA = true; Camera.main.allowDynamicResolution = true; Camera.main.SetReplacementShader(Shader.Find("MyShader"), "RenderType=Opaque"); ``` 使用Tags可以为我们提供更多的灵活性和控制权,使得Shader在不同的场景中都能够得到良好的表现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值