본문 바로가기
UNITY/유니티게임스쿨

쉐이더

by 램플릿 2024. 7. 31.
Shader "Custom/OutlineShader"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _LineColor ("Line Color", Color) = (0,0,0,1)
        _LineWidth ("Line Width", Range(0, 0.1)) = 0.01
    }
    SubShader
    {
        Tags {"Queue"="Transparent" "RenderType"="Transparent"}
        LOD 100
        
        CGPROGRAM
        #pragma surface surf Lambert alpha

        sampler2D _MainTex;
        fixed4 _LineColor;
        float _LineWidth;

        struct Input
        {
            float2 uv_MainTex;
        };

        void surf (Input IN, inout SurfaceOutput o)
        {
            // 현재 나의 uv값을 가져온다. ( 색상 정보 )
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            // left right를 나누는 코드다
            // 0 ~ 1 -> -0.5 ~ 0.5 -> abs를 통해 0 ~ 0.5
            float2 uvDist = abs(IN.uv_MainTex - 0.5) * 2;

            // 어느 직각에 더 가까운지 체크한다.
            float maxDist = max(uvDist.x, uvDist.y);

            // 1 - 두께를 하면 이것 0.8 -> maxDist 0.7 -> 0반환
            // 0.8 -> maxDist 0.9 -> 1반환하는 함수
            float isBorder = step(1 - _LineWidth, maxDist);

            // 0 ~ 1사이 값을 반환한다.
            o.Albedo = lerp(c.rgb, _LineColor.rgb, isBorder);

            // 그냥 투명도 있을시 넣어주는거다.
            o.Alpha = lerp(c.a, _LineColor.a, isBorder);
        }
        ENDCG
    }
    FallBack "Diffuse"
}

데이터 설정하면 된다

내부에 있는 색상도 바꿔보기

Shader "Custom/OutlineShader"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _LineColor ("Line Color", Color) = (0,0,0,1)
        _SurfaceColor ("Surface Color", Color) = (1,1,1,1)
        _LineWidth ("Line Width", Range(0, 0.1)) = 0.01
    }
    SubShader
    {
        Tags {"Queue"="Transparent" "RenderType"="Transparent"}
        LOD 100

        CGPROGRAM
        #pragma surface surf Lambert alpha

        sampler2D _MainTex;
        fixed4 _LineColor;
        fixed4 _SurfaceColor;
        float _LineWidth;

        struct Input
        {
            float2 uv_MainTex;
        };

        void surf (Input IN, inout SurfaceOutput o)
        {
            // 현재 나의 uv값을 가져온다. ( 색상 정보 )
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex);
            // left right를 나누는 코드다
            // 0 ~ 1 -> -0.5 ~ 0.5 -> abs를 통해 0 ~ 0.5
            float2 uvDist = abs(IN.uv_MainTex - 0.5) * 2;

            // 어느 직각에 더 가까운지 체크한다.
            float maxDist = max(uvDist.x, uvDist.y);

            // 1 - 두께를 하면 이것 0.8 -> maxDist 0.7 -> 0반환
            // 0.8 -> maxDist 0.9 -> 1반환하는 함수
            float isBorder = step(1 - _LineWidth, maxDist);

            // 0 ~ 1사이 값을 반환한다.
            o.Albedo = lerp(_SurfaceColor.rgb, _LineColor.rgb, isBorder);
            o.Albedo = lerp(_SurfaceColor.rgb, _LineColor.rgb, isBorder);

            // 그냥 투명도 있을시 넣어주는거다.
            o.Alpha = lerp(c.a, _LineColor.a, isBorder);
        }
        ENDCG
    }
    FallBack "Diffuse"
}

Vertex Shader와 Pixel Shader가 있다.

버텍스 쉐이더는 메쉬의 버텍스 하나하나를 다루고 픽셀은 점 하나하나를 다룬다.

따라서 픽셀쉐이더는 해상도만큼(예:1920*1080번) 호출된다.

Surface 쉐이더라고 불리기도 한다.

 

 UV는 0~1의 정규화된 수치를 가진다.

tex2D : 현재 나의 UV값을 구해온다. (+생상 정보)

0~1 => 각각 0.5씩 빼주면 -0.5~0.5로 계산할 수 있고 여기에 절댓값을 취해서 

abs : 절대값 구하는 함수.

 

 

쉐이더 만드는 방법

.

이름 짓고 더블클릭하여 안에 코드를 작성한다. (상단 코드 복붙)

 

쉐이더를 누른채 create → material 하면 머테리얼이 생성된다.

 

 

쉐이더 그래프 사용하기

New Shader Graph.shadergraph
0.04MB

 

 

아웃라인 툴킷(에셋스토어-무료) 사용하기

https://assetstore.unity.com/packages/p/outline-toolkit-98020

 

Outline Toolkit | Particles/Effects | Unity Asset Store

Use the Outline Toolkit tool for your next project. Find this and more particle & effect tools on the Unity Asset Store.

assetstore.unity.com

 

'UNITY > 유니티게임스쿨' 카테고리의 다른 글

Unity 클라이언트와 서버 통신하기  (0) 2024.09.25
프로토버퍼  (0) 2024.09.23
포스트 프로세싱  (0) 2024.07.30
CSV Parser  (0) 2024.07.19
개인 포트폴리오 작성 :: AngryBird  (0) 2024.07.02