我正在申请"燃烧"将着色器溶解到已使用标准着色器的对象。因为我需要标准着色器以获得更好的照明等,所以我研究了如何使用它们"两者"或者如何扩展标准着色器。
根据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.0
和o.Smoothness = 0.5f
更改,我明白了:
这肯定更好,但我想有标准给我的效果,因为这里标准本身的样子:
答案 0 :(得分:1)
标准着色器使用着色器模型3.0目标,以获得更好的照明效果。
所以你需要添加:#pragma target 3.0
。
此外,标准着色器的默认配置将其平滑度设置为0.5,而在着色器的情况下,它设置为0,因此为了使着色器在光照方面匹配,您必须添加以下行:o.Smoothness = 0.5f;
。