Shader의 6부 마스크를 낄 뻔했어요.

8317 단어 Unityshadertech

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


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

미리 준비하다


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

데모


메인 이미지는 마스크 이미지의 모양으로 잘라낼 수 있다.

Shader 샘플


Shader "Custom/Mask"
{
    //Inspectorに出すプロパティー
    Properties
    {
        //テクスチャー(オフセットの設定なし)
        [NoScaleOffset] _MainTex ("Texture", 2D) = "white" {}
        //Mask用テクスチャー(オフセットの設定なし)
        [NoScaleOffset] _MaskTex("Mask Texture (RGB)", 2D) = "white" {}
    }
    SubShader
    {
        Tags
        {
            "RenderType"="Opaque"
        }

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            //頂点シェーダーに渡ってくる頂点データ
            struct appdata
            {
                //セミコロン以降の大文字はセマンティクスと呼ばれる 
                //"この変数は ○○を受け取ります" みたいなやつらしい
                float4 vertex : POSITION;
                float2 uv1 : TEXCOORD0; //1番目のUV座標 たぶんテクスチャが複数枚あって別々に何かしたいときに助かるやつ
            };

            //フラグメントシェーダーへ渡すデータ
            struct v2f
            {
                float2 uv1 : TEXCOORD0; //テクスチャUV
                float4 vertex : SV_POSITION; //座標変換された後の頂点座標
            };

            sampler2D _MainTex;
            sampler2D _MaskTex;

            //頂点シェーダー
            v2f vert(appdata  v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex); //3D空間座標→スクリーン座標変換
                o.uv1 = v.uv1;
                return o;
            }

            //フラグメントシェーダー
            fixed4 frag(v2f i) : SV_Target
            {
                //マスク用画像のピクセルの色を計算
                fixed4 mask = tex2D(_MaskTex, i.uv1);
                //引数の値が"0以下なら"描画しない すなわち"Alphaが0.5以下なら"描画しない
                clip(mask.a - 0.5);
                //メイン画像のピクセルの色を計算
                fixed4 col = tex2D(_MainTex, i.uv1);
                //メイン画像とマスク画像のピクセルの計算結果を掛け合わせる
                return col * mask;
            }
            ENDCG
        }
    }
}

clip


커팅 원리.간이요.
클립 매개 변수의 값이 0보다 작으면 그리지 않을 수 있습니다.
마스크 이미지의 알파 값에서 0.5 빼기
마스크 이미지의 알파 값이 0.5 미만인 경우(즉, 매개변수 값이 0 미만)는 그려지지 않습니다.
따라서 마스크 이미지의 일부를 그리지 않으려는 알파 값은
0.5 이하로 투과된 이미지를 미리 준비해야 합니다.

참조 링크


Unity 사다 프로그램 입문 Unlitshader의 모든 요소 해설
Use of Clip () in alpha cutouts?

좋은 웹페이지 즐겨찾기