使用其他子着色器扩展Unity Standard着色器

问题描述 投票:2回答:1

我正在将“刻录”溶解着色器应用于已使用标准着色器的对象。因为我需要标准着色器以获得更好的照明等,所以我研究了如何使用它们“两者”或如何扩展标准着色器。

根据Unity docs,我可以定义我想在pragma使用哪种照明模式,所以我使用了Standard。这一定不能像我想的那样工作,因为我直接使用标准着色器时没有看到任何照明。

我正在使用来自Harry Alisavakis的燃烧溶解着色器

Shader "Custom/BurnDissolve" {
    Properties {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _SliceGuide("Slice Guide (RGB)", 2D) = "white" {}
        _SliceAmount("Slice Amount", Range(0.0, 1.0)) = 0

        _BurnSize("Burn Size", Range(0.0, 1.0)) = 0.15
        _BurnRamp("Burn Ramp (RGB)", 2D) = "white" {}
        _BurnColor("Burn Color", Color) = (1,1,1,1)

        _EmissionAmount("Emission amount", float) = 2.0
    }
    SubShader {
        Tags { "RenderType"="Opaque" }
        LOD 200
        Cull Off
        CGPROGRAM
        #pragma surface surf Standard

        fixed4 _Color;
        sampler2D _MainTex;
        sampler2D _SliceGuide;
        sampler2D _BumpMap;
        sampler2D _BurnRamp;
        fixed4 _BurnColor;
        float _BurnSize;
        float _SliceAmount;
        float _EmissionAmount;

        struct Input {
            float2 uv_MainTex;
        };

        void surf (Input IN, inout SurfaceOutputStandard o) {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            half test = tex2D(_SliceGuide, IN.uv_MainTex).rgb - _SliceAmount;
            clip(test);

            if (test < _BurnSize && _SliceAmount > 0) {
                o.Emission = tex2D(_BurnRamp, float2(test * (1 / _BurnSize), 0)) * _BurnColor * _EmissionAmount;
            }

            o.Albedo = c.rgb;
            o.Alpha = c.a;
        }
        ENDCG
    }
    FallBack "Standard"
}

我还尝试将此作为另一个子着色器添加到标准着色器源的副本,但我无法在那里工作。如果我把它放在其他人之前,就好像它是独自一样,如果我把它放在后面,标准着色器的工作就好像它是独自一样的。

我仍然是着色器的新手,所以我确定我误解了这一点。如何使用溶解着色器以及标准着色器,而无需手动重写内容。

根据请求,这里是我正在使用的图像(最初由链接的溶解着色器文章提供)。

作为_SliceGuide

enter image description here

作为_BurnRamp

enter image description here

使用#prama target 3.0o.Smoothness = 0.5f更改萨满提到,我得到这个:

enter image description here

哪个肯定更好,但我想有标准给我的效果,因为标准本身就是这样的:

enter image description here

unity3d shader
1个回答
1
投票

标准着色器使用着色器模型3.0目标,以获得更好看的照明。所以你需要添加:#pragma target 3.0。此外,标准着色器的默认配置将其平滑度设置为0.5,而在着色器的情况下,它设置为0,因此为了使着色器在光照方面匹配,您必须添加以下行:o.Smoothness = 0.5f;

© www.soinside.com 2019 - 2024. All rights reserved.