Vertex Shader를 Unity로 처음 쓰기

결실


결과 여기(gfycat)
유닛 쉐더를 처음 쓰는 거라 필기를 했어요.

참고 자료


참조: Moving vertices in shaders - Unity Answers
아니면 거의 모든 위에 있는 Shader가 복사를 했지만 이를 계기로 더 많은 Shader를 쓸 수 있게 되고 싶어요.

코드


bekobeko.shader
Shader "Custom/BekoBekoShader" {
    Properties{
        _MainTex("Texture", 2D) = "white" {}
    _Amount("Height Adjustment", Float) = 1.0
    }
    SubShader{
        Tags{ "RenderType" = "Opaque" }
        CGPROGRAM
        #pragma surface surf Lambert vertex:vert
        struct Input {
            float2 uv_MainTex;
            float3 worldPos;
        };

        // Access the shaderlab properties
        float _Amount;
        sampler2D _MainTex;

        float rand(float3 co)
        {
            return frac(sin(dot(co.xyz, float3(12.9898, 78.233, 45.5432))) * 43758.5453);
        }

        // Vertex modifier function
        void vert( inout appdata_full v) {
            // Do whatever you want with the "vertex" property of v here
                        //コメント部分を適用すると中心から円状に波が広がる
            /*float mag = (v.vertex.x * v.vertex.x) + (v.vertex.z * v.vertex.z);
            mag = sqrt(mag);*/
            float mag = v.vertex.x + v.vertex.z;
            v.vertex.y = sin(_Time * _Amount + mag) / 3;
        }

        // Surface shader function
        void surf(Input IN, inout SurfaceOutput o) {
            o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;
        }
    ENDCG
    }
    FallBack "Diffuse"
}

설명하려고 했는데 실패한 부분.


Unity Shader는 크게 두 부분으로 나눌 수 있습니다.
Properties 및 SubShader 로 구분됩니다.
minimum.shader
Shader "名前"{

Properties{}
SubShader{
CGPROGRAM
ENDCG
}

}
그러게 말이야.
Properties는 Unity의 Inspector에 나타나는 변수입니다.

SubShader에서 유형을 지정하고 같은 변수 이름을 사용하면Properties 변수에 접근할 수 있습니다.(Amount MainTex 등)
SubShader는 몇 개를 기록할 수 있으며, 하드웨어에 따라 위에서부터 순서대로 시도하고, 최종적으로 안 되면 팔백이 지정한 이름의 Shader를 시도한다.#pragma surface surf Lambert vertex:vert그렇다면, 나는 Vertex Shader의 함수가vert의 사전 컴파일 명령성을 나타내는 것이라고 생각한다.
그건 아직 이해가 안 돼요.
따라서vert 함수에 특별한 서명이 있을 수 있으며 파라미터를 추가하려면 욕을 먹을 수 있습니다.
보시다시피 그냥'글통'을 대충 썼을 뿐인데 댓글을 남겨주시면 좋을 것 같아요.

PS


Lambert를 살짝 봤지만 뭔가 이상해서 투덜거렸다.
Wikipedia: Lambertian Reflecance
결론적으로 스푸커라와 반대로 빛은 예쁘게 반사하기보다는 디퓨즈적으로 흐린 날이거나 보는 각도와 상관없이 빛의 영향을 받는다.
공식도 간단하면서도 훌륭하다
I_{D}=\mathbf{L}\cdot\mathbf{N} C I_{L}
I(D)에서 나오는 빛, L은 빛의 단위 벡터, N은 면의 법선, C는 색, I(L)는 빛의 크기인 경우의 Lambertian Reflecctance.
자세한 내용은 위키백과를 읽으시면 됩니다. 다만 간단하게 말하면'빛의 방향과 법선이 가까울수록 각도가 밝습니다'.
이제부터 기억해야 할 게 많은 것 같은데 아무튼Earl Sweatshirt 바람에 날리면 OK.

좋은 웹페이지 즐겨찾기