我想立即声明我不会使用经常使用的着色器,以及我正在使用的基本着色器 - 来自Unity的一个线程中的力场着色器论坛,是一个更老的版本。然而,原来"几乎"做我想要的。
我想修改它以添加滚动效果以模拟速度,但奇怪的是我得到了#34;无法识别的标识符'输入'"。 IN Input是一个普通变量..据说,在Unity的着色器中。这是我到目前为止的代码:
Shader "Custom/SubspaceLook" {
Properties {
_Color ("Main Color", Color) = (1,1,1,0.5)
_MainTex ("Texture", 2D) = "white" {}
_UVScale ("UV Scale", Range (0.05, 4)) = 1
_UVDistortion ("UV Distortion", Range (0.01, 1)) = 0.5
_Rate ("Oscillation Rate", Range (5, 200)) = 10
_Rate2 ("Oscillation Rate Difference", Range (1, 3)) = 1.43
_ZPhase ("Z Phase", Range (0, 3)) = 0.5
_Scale ("Scale", Range (0.02, 2)) = 0.5
_Distortion ("Distortion", Range (0, 20)) = 0.4
_ScrollSpeedX("Scroll X", Range(0, 10)) = 2
_ScrollSpeedY("Scroll Y", Range(0, 10)) = 3
}
SubShader {
ZWrite Off
Tags { "Queue" = "Transparent" }
Blend One One
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma fragmentoption ARB_fog_exp2
#include "UnityCG.cginc"
float4 _Color;
sampler2D _MainTex;
float _Rate;
float _Rate2;
float _Scale;
float _Distortion;
float _ZPhase;
float _UVScale;
float _UVDistortion;
float _ScrollSpeedX;
float _ScrollSpeedY;
struct v2f {
float4 pos : SV_POSITION;
float3 uvsin : TEXCOORD0;
float3 vertsin : TEXCOORD1;
float2 uv : TEXCOORD2;
};
v2f vert (appdata_base v)
{
v2f o;
o.pos = UnityObjectToClipPos (v.vertex);
float s = 1 / _Scale;
float t = (_Time[0]*_Rate*_Scale) / _Distortion;
float2 uv = float2(v.vertex.y * 0.3 + (v.vertex.y - v.vertex.z *
0.0545), v.vertex.x + (v.vertex.z - v.vertex.x * 0.03165));
o.vertsin = sin((v.vertex.xyz + t) * s);
o.uvsin = sin((float3(uv, t * _ZPhase) + (t* _Rate2)) * s) *
_Distortion;
o.uv = uv;
return o;
}
half4 frag (v2f i) : COLOR
{
float3 vert = i.vertsin;
float3 uv = i.uvsin;
float mix = 1 + sin((vert.x - uv.x) + (vert.y - uv.y) + (vert.z -
uv.z));
float mix2 = 1 + sin((vert.x + uv.x) - (vert.y + uv.y) - (vert.z +
uv.z));
return half4( tex2D( _MainTex, (i.uv + (float2(mix, mix2) *
_UVDistortion)) * _UVScale ) * 1.5 * _Color);
}
void surf(Input IN, inout SurfaceOutput o)
{
fixed2 scrolledUV = IN.uv_MainTex;
fixed xScrollValue = _ScrollSpeedX * _Time;
fixed yScrollValue = _ScrollSpeedY * _Time;
scrolledUV += fixed2(xScrollValue, yScrollValue);
half2 c = tex2D(_MainTex, scrolledUV);
o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rbg;
o.Albedo += c.rbg;
half rim = 1.0 - saturate(dot(normalize(IN.viewDir), o.Normal));
o.Emission = _Rimcolor.rgb * pow(rim, _RimPower);
}
ENDCG
}
}
Fallback "Diffuse"
}
我对原始着色器的主要更改是添加滚动值和" surf"它。我没有碰过第一个版本,这是由森林约翰逊在2008年写的。
答案 0 :(得分:3)
您可以混合使用Surface Shader代码和常规着色器:
#pragma vertex vert
#pragma fragment frag
这些用于显式顶点和像素着色器,而surf()是统一的Surface着色器系统。
编译器指出的错误是你的着色器缺少 surf()函数引用的输入结构,但这不是你需要的调查。
struct Input {
float2 uv_MainTex;
};