Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unity3d 使用附加子着色器扩展Unity标准着色器_Unity3d_Shader - Fatal编程技术网

Unity3d 使用附加子着色器扩展Unity标准着色器

Unity3d 使用附加子着色器扩展Unity标准着色器,unity3d,shader,Unity3d,Shader,我正在对已经使用标准着色器的对象应用“燃烧”溶解着色器。因为我需要标准着色器以获得更好的照明等,所以我研究了如何“同时”使用它们或如何扩展标准着色器 根据,我可以定义在pragma中要使用的照明模式,因此我使用了标准。这一定不是我想的那样,因为我看不到我直接使用标准着色器时所做的任何照明 我正在使用来自的燃烧溶解着色器 Shader“自定义/燃烧溶解”{ 性质{ _颜色(“颜色”,颜色)=(1,1,1,1) _MainTex(“反照率(RGB)”,2D)=“白色”{} _切片向导(“切片向导(R

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

根据,我可以定义在
pragma
中要使用的照明模式,因此我使用了
标准
。这一定不是我想的那样,因为我看不到我直接使用标准着色器时所做的任何照明

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

Shader“自定义/燃烧溶解”{
性质{
_颜色(“颜色”,颜色)=(1,1,1,1)
_MainTex(“反照率(RGB)”,2D)=“白色”{}
_切片向导(“切片向导(RGB)”,2D)=“白色”{}
_切片量(“切片量”,范围(0.0,1.0))=0
_燃烧大小(“燃烧大小”,范围(0.0,1.0))=0.15
_烧录渐变(“烧录渐变(RGB)”,2D)=“白色”{}
_燃烧颜色(“燃烧颜色”,颜色)=(1,1,1,1)
_排放量(“排放量”,浮动)=2.0
}
子阴影{
标记{“RenderType”=“不透明”}
LOD 200
剔除
CGP程序
#布拉格马表面冲浪标准
固定4色;
取样器2D_MainTex;
采样器2D_切片指南;
取样器2D(U)地图;;
取样器2D_BurnRamp;
固定的4_颜色;
浮子大小;
浮动量;
浮动排放量;
结构输入{
浮动2 uv_MainTex;
};
void surf(输入、输入、输出表面输出标准输出){
fixed4 c=tex2D(_MainTex,IN.uv_MainTex);
半测试=tex2D(_SliceGuide,IN.uv_MainTex)。rgb-_SliceAmount;
夹子(试验);
如果(测试<燃烧量大小和切片量>0){
o、 排放=tex2D(_BurnRamp,float2(测试*(1/_BurnSize),0))*_BurnColor*_排放量;
}
o、 反照率=c.rgb;
o、 α=c.a;
}
ENDCG
}
后备“标准”
}
我还尝试将其作为另一个子着色器添加到标准着色器源的副本中,但无法在那里工作。如果我把它放在其他着色器之前,它的工作原理就好像它是单独的,如果我把它放在后面,标准着色器的工作原理就好像它是单独的一样

我对着色器还是新手,所以我肯定我误解了这一点。我如何才能让溶解着色器与标准着色器一样应用,而不必手动重写内容

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

作为指南:

如图所示:

使用萨满提到的
#prama target 3.0
o.Smoothness=0.5f
更改,我得到以下结果:

这肯定更好,但我想《标准》给了我一些效果,因为《标准》本身就是这样的:


标准着色器使用着色器模型3.0目标,以获得更好的照明效果。 因此您需要添加以下内容:
#pragma target 3.0

另外,标准着色器的默认配置将其平滑度设置为0.5,而在着色器的情况下,它将设置为0,因此为了使着色器在照明方面匹配,必须添加以下行:
o.smoothness=0.5f

请添加着色器中使用的纹理。我没有从链接的文章中修改它们,而是将它们添加到文章中以供参考。因此,基本上您只希望着色器在照明方面与标准着色器匹配?是的。我使用标准着色器(默认配置)。我很确定它只是照明,但标准着色器是一个复杂的野兽。不过,我没有更改默认设置。理想情况下,我希望标准着色器应用它需要的所有内容,然后应用“溶解”着色器。我不需要灯光影响下的溶解/燃烧效果,但如果是这样的话也不会有问题。谢谢,这让我更接近了。似乎有一个详细的标准,我仍然缺少。我不知道这是不是因为光照?我用屏幕截图更新了我的问题。我猜这是因为标准着色器对这颗小行星使用了法线贴图,但burn溶解没有,它只是使用了标准照明模型?我想是这样的!您可以将法线贴图添加到着色器中,然后查看它是否与标准着色器匹配。很有趣,我的源代码已经有了它的条目(
sampler2D\u BumpMap;
),但它没有在任何地方使用。我从unity文档“writing surface shaders”中找到了
o.Normal
示例,它工作得非常好。谢谢
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"
}