셰더의 49번째 부분을 할 시간이 얼마 남지 않았어요.

10402 단어 Unityshadertech

쉐더를 할 시간이 얼마 안 남았어요.


하마터면 Shader를 할 뻔했다.쉐더를 할 시간이 많지 않을 것 같아서요.
100부까지 열심히 하겠습니다.10년이 걸려도 돼요.
100편의 글을 배웠다면 초보자라도 이해할 수 있을 것 같아요.
이렇게 하는 거야.
※ 초보자는 필기 레벨로 기록
기술 보도로는 도움이 안 될 것 같습니다.

미리 준비하다


아래 참조
Shader 파트 1Unite 2017 애니메이션을 볼 때가 많지 않아요. (기초지식~종이 스크레이퍼로 색깔 바꾸기)

데모


윤활등은 바로 이런 물건이다.

림은'연'이라는 뜻인 듯 가장자리 부분에서 빛이 나는데 이것이 바로 윤활등이다.

Shader 샘플


Shader "Custom/Rim"
{
    Properties
    {
        _TintColor("Tint Color", Color) = (0,0.5,1,1)
        _RimColor("Rim Color", Color) = (0,1,1,1)
        _RimPower("Rim Power", Range(0,1)) = 0.4
    }

    Category
    {
        Tags
        {
            "Queue" = "Transparent"
            "RenderType" = "Transparent"
        }
        Blend SrcAlpha OneMinusSrcAlpha

        SubShader
        {
            Pass
            {
               ZWrite On
               ColorMask 0
            }

            Pass
            {
                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag

                #include "UnityCG.cginc"

                float4 _TintColor;
                float4 _RimColor;
                float _RimPower;

                struct appdata_t
                {
                    float4 vertex : POSITION;
                    float2 uv : TEXCOORD0;
                    float3 normal : NORMAL;
                };

                struct v2f
                {
                    float4 vertex : SV_POSITION;
                    float2 uv : TEXCOORD0;
                    float3 world_pos : TEXCOORD1;
                    float3 normalDir : TEXCOORD2;
                };

                v2f vert(appdata_t v)
                {
                    v2f o;

                    o.vertex = UnityObjectToClipPos(v.vertex);
                    o.uv = v.uv;
                    o.world_pos = mul(unity_ObjectToWorld, v.vertex).xyz;
                    //法線を取得
                    o.normalDir = UnityObjectToWorldNormal(v.normal);
                    return o;
                }

                fixed4 frag(v2f i) : SV_Target
                {
                    //カメラのベクトルを計算
                    float3 viewDirection = normalize(_WorldSpaceCameraPos.xyz - i.world_pos.xyz);
                    //法線とカメラのベクトルの内積を計算し、補間値を算出
                    half rim = 1.0 - saturate(dot(viewDirection, i.normalDir));
                    //補間値で塗分け
                    float4 col = lerp(_TintColor, _RimColor, rim * _RimPower);
                    return col;
                }
                ENDCG
            }
        }
    }
}
saturate는 0~1의 범위 내에서 파라미터를 납부한다.
법방향과 카메라의 벡터는saturate로 0~1을 넣고 이동할 수 있는 조명의 도분 삽입 값을 계산한다.
법선과 카메라 벡터가 직선이면 내적은 0이고 방향이 같으면 1로 돌아간다.
【참조 링크】: Shader의 31번째 부분에 내적을 사용할 때가 거의 없어요.
아래의 보도는 지도를 이해하기 매우 쉽다.
【참조 링크】: 윤활등

좋은 웹페이지 즐겨찾기