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"
}