
void vert (inout appdata v, out Input o) {
UNITY_INITIALIZE_OUTPUT(Input,o); // o 구조체 멤버 0 또는 기본값으로 초기화
float t = _Time * _Speed; // _Time은 유니티 자체 변수
float waveHeight = sin(t + v.vertex.x * _Freq) * _Amp;
v.vertex.y = v.vertex.y + waveHeight;
// vertex 값을 변경했으니 normal도 그에 맞게 변경 (정확한 계산은 아님)
v.normal = normalize(float3(v.normal.x + waveHeight, v.normal.y, v.normal.z));
o.vertColor = waveHeight + 2; // 약속된 이름은 아니고 데이터 넘기기 위해 Input에 선언
}
sampler2D _MainTex;
void surf (Input IN, inout SurfaceOutput o) {
float4 c = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = c * IN.vertColor.rgb;
}

void surf(Input IN, inout SurfaceOutput o) {
_ScrollX *= _Time;
_ScrollY *= _Time;
float3 water = (tex2D(_MainTex, IN.uv_MainTex + float2(_ScrollX, _ScrollY))).rgb;
float3 foam = (tex2D(_FoamTex, IN.uv_MainTex + float2(_ScrollX/2.0, _ScrollY/2.0))).rgb;
o.Albedo = (water+foam)/2.0;
}

void surf (Input IN, inout SurfaceOutput o) {
const float PI = 3.14159265;
float t = _Time.x * _Speed;
//vertical
float c = sin(IN.worldPos.x * _Scale1 + t);
//horizontal
c += sin(IN.worldPos.z * _Scale2 + t);
//diagonal
c+= sin(_Scale3*(IN.worldPos.x*sin(t/2.0) + IN.worldPos.z*cos(t/3))+t);
//circular
float c1 = pow(IN.worldPos.x + 0.5 * sin(t/5),2);
float c2 = pow(IN.worldPos.z + 0.5 * cos(t/3),2);
c += sin(sqrt(_Scale4*(c1+c2)+1+t));
o.Albedo.r = sin(c/4.0*PI);
o.Albedo.g = sin(c/4.0*PI + 2*PI/4);
o.Albedo.b = sin(c/4.0*PI + 4*PI/4);
o.Albedo *= _Tint;
}
surface shader
SubShader
{
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
};
struct v2f
{
float4 vertex : SV_POSITION;
};
float4 _Tint;
float _Speed;
float _Scale1;
float _Scale2;
float _Scale3;
float _Scale4;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
fixed4 col;
const float PI = 3.14159265;
float t = _Time.x * _Speed;
//these are screen coordinates so
//get them down to small values for the
//sin to use
float xpos = i.vertex.x * 0.001;
float ypos = i.vertex.y * 0.001;
//vertical
float c = sin(xpos * _Scale1 + t);
//horizontal
c += sin(ypos * _Scale2 + t);
//diagonal
c += sin(_Scale3*(xpos*sin(t/2.0) + ypos*cos(t/3))+t);
//circular
float c1 = pow(xpos + 0.5 * sin(t/5),2);
float c2 = pow(ypos + 0.5 * cos(t/3),2);
c += sin(sqrt(_Scale4*(c1 + c2)+1+t));
col.r = sin(c/4.0*PI);
col.g = sin(c/4.0*PI + 2*PI/4);
col.b = sin(c/4.0*PI + 4*PI/4);
return col;
}
ENDCG
}
vertex/fragment shader
IN.worldPos는 월드 좌표계 (World Space) 위치
i.vertex는 SV_POSITION, 즉 클립 공간(Screen Space) 상 위치

별로 인상적이지 않다.

방 없애고 별도 씬으로 넘어가기


