【问题标题】:Extending the Unity Standard shader with an additional subshader使用额外的子着色器扩展 Unity 标准着色器
【发布时间】:2018-06-01 10:37:55
【问题描述】:

我正在对已经使用标准着色器的对象应用“燃烧”溶解着色器。因为我需要标准着色器来获得更好的照明等,所以我研究了如何“同时”使用它们或如何扩展标准着色器。

根据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:

作为_BurnRamp:

使用 #prama target 3.0o.Smoothness = 0.5f 更改萨满提到的,我明白了:

这肯定更好,但我想标准会给我带来一些影响,因为标准本身就是这样的:

【问题讨论】:

  • 能否请您添加您在着色器中使用的纹理。
  • 我没有从我链接的文章中修改它们,而是将它们添加到文章中以供参考。
  • 所以基本上你只是希望你的着色器在光照方面与标准着色器相匹配?
  • 是的。我使用标准着色器(默认配置)。我很确定它只是照明,但标准着色器是一个复杂的野兽。虽然我没有更改默认值。理想情况下,我希望标准着色器应用它需要的所有东西,然后再应用溶解着色器。我不需要受光照影响的溶解/燃烧效果,但如果是这样就不是问题了。

标签: unity3d shader


【解决方案1】:

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

【讨论】:

  • 谢谢,这让我更接近了。似乎我仍然缺少标准的详细程度。不知道是不是光的原因?我用屏幕截图更新了我的问题。
  • 玩转,我猜是因为标准着色器使用了这颗小行星的法线贴图,但燃烧溶解没有,它只是使用标准光照模型?
  • 我认为是这样的!您可以在着色器中添加法线贴图,看看它是否与标准着色器匹配。
  • 就是这样,有趣的是我的来源已经有一个条目(sampler2D _BumpMap;)但它没有在任何地方使用。我从统一文档“编写表面着色器”中找到了o.Normal 示例,它运行良好。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-19
  • 2019-05-14
相关资源
最近更新 更多