250406

lililllilillll·2025년 4월 6일

개발 일지

목록 보기
133/350

✅ What I did today


  • Udemy Course : Unity Shader
  • Project BCA
  • Project Katana


🎞️ Udemy Course : Unity Shader


Waves

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

Scroll texture

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

Plasma

        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) 상 위치



🎮 Project BCA


  • 문 재추가와 케이크를 위해 만들었던 머테리얼 테두리 로직 제거.
  • 문은 적당한 금속 머테리얼을 구해서 적용하기.

Intro

별로 인상적이지 않다.

Ending

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

Additional room



🎮 Project Katana




profile
너 정말 **핵심**을 찔렀어

0개의 댓글