유니티 셰이더 기초 - 입력값 출력해서 색 바꾸기!!

코드멍멍이(Joonieboy)·2022년 9월 4일
1
post-thumbnail

프로퍼티

프로퍼티에 새로운 함수를 작성하게 되면, 유니티 셰이더 인스펙터에 나타나요. 이 프로퍼티를 SubShader에서 적절하게 사용하면, 머테리얼의 컬러를 바꿀 수 있어요!

Properties
    {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Glossiness ("Smoothness", Range(0,1)) = 0.5
        _Metallic ("Metallic", Range(0,1)) = 0.0
        //테스트 컬러를 만들어주었다.
        _TestColor("testcolor", Color) = (1,1,1,1)
    }
        SubShader
    {
        CGPROGRAM
        half _Glossiness;
        half _Metallic;
        fixed4 _Color;
        //테스트컬러 변수를 만들었다.
        float4 _TestColor;

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            //o.Albedo에 테스트 컬러 변수를 넣었다. o.Emmision에도 적용이 가능하다
            o.Albedo = _TestColor.rgb;
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;
            o.Alpha = c.a;
        }
        ENDCG
    }

참고로 코드는 필요한 일부를 강조하기 위해서 자른 부분이 많아요!! 그래서 이걸 가지고 가면, 작동 안돼요 !!

앞서 말씀드린 것 처럼, 프로퍼티에 _testColor를 작성했기 때문에 인스펙터에 추가가 됐고, o.Albedo에 적용을 해서 머테리얼 컬러를 변경할 수 있어요.

R, G, B 각각 조절해서 컬러 변경

RGB 각각을 조절해서 컬러를 변경하기 위해서는 앞서 프로퍼티에서 했던 것 처럼 새로운 변수를 만들어야 해요. _Red, _Green, _Blue 그리고 SubShader에서도 똑같이 변수를 선언하구요. 이 후에 o.Albedo에 적용만 하면 돼요.

    Properties
    {
        //테스트 컬러를 만들어주었다.
        _Red("Red", Range(0,1)) = 0
        _Green("Green", Range(0,1)) = 0
        _Blue("Blue", Range(0,1)) = 0
    }
        SubShader
    {
        CGPROGRAM
        //R, G, B 각각 조정하기 위해서 변수를 선언했다
        float _Red, _Green, _Blue;

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;
            //R, G, B 각각 인스펙터에서 조절할 수 있다
            o.Albedo = float3(_Red, _Green, _Blue);
            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;
            o.Alpha = c.a;
        }
        ENDCG        
    }

색상을 밝게 혹은 어둡게 만들자

이 또한 코드로 크게 어렵지 않아요! 반복 작업처럼 프로퍼티에 Brightness $ Darkness 코드를 작성하고, SubShader에 변수를 선언하고, 아까 작성한 컬러 코드에 더해주기만 하면 되죠~

    Properties
    {
        _Color ("Color", Color) = (1,1,1,1)
        _MainTex ("Albedo (RGB)", 2D) = "white" {}
        _Glossiness ("Smoothness", Range(0,1)) = 0.5
        _Metallic ("Metallic", Range(0,1)) = 0.0
        
        //테스트 컬러를 만들어주었다.
        _TestColor("testcolor", Color) = (1,1,1,1)
        
        //RGB 각각 조절하기
        _Red("Red", Range(0,1)) = 0
        _Green("Green", Range(0,1)) = 0
        _Blue("Blue", Range(0,1)) = 0
        
        //색상을 밝게 혹은 어둡게 만들기
        _BrightDark("Brightness $ Darkness", Range(-1,1)) = 0
    }
        SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 200

        CGPROGRAM

        //테스트컬러 변수를 만들었다.
        float4 _TestColor;

        //R, G, B 각각 조정하기 위해서 변수를 선언했다
        float _Red, _Green, _Blue;
        
        //Brightness $ Darkness 변수 선언
        float _BrightDark;

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            fixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;

            //색상을 밝게 혹은 어둡게 만들기
            o.Albedo = float3(_Red, _Green, _Blue) + _BrightDark;

            o.Metallic = _Metallic;
            o.Smoothness = _Glossiness;
            o.Alpha = c.a;
        }
        ENDCG
    }

Full Code

Shader "Custom/changeColor"
{
    Properties
    {
        //테스트 컬러를 만들어주었다.
        _TestColor("testcolor", Color) = (1,1,1,1)
        
        //RGB 각각 조절하기
        _Red("Red", Range(0,1)) = 0
        _Green("Green", Range(0,1)) = 0
        _Blue("Blue", Range(0,1)) = 0
        
        //색상을 밝게 혹은 어둡게 만들기
        _BrightDark("Brightness $ Darkness", Range(-1,1)) = 0
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }

        CGPROGRAM
        #pragma surface surf Standard fullforwardshadows

        struct Input
        {
            float4 color : COLOR ;
        };

        //테스트컬러 변수를 만들었다.
        float4 _TestColor;

        //R, G, B 각각 조정하기 위해서 변수를 선언했다
        float _Red, _Green, _Blue;
        
        //Brightness $ Darkness 변수 선언
        float _BrightDark;

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            //o.Albedo에 테스트 컬러 변수를 넣었다. o.Emmision에도 적용이 가능하다
            // o.Albedo = _TestColor.rgb;

            //R, G, B 각각 인스펙터에서 조절할 수 있다
            //o.Albedo = float3(_Red, _Green, _Blue);
            
            //색상을 밝게 혹은 어둡게 만들기
            o.Albedo = float3(_Red, _Green, _Blue) + _BrightDark;

            o.Alpha = 1;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

공부한 책: 유니티 쉐이더 스타트업

profile
#유니티개발자 #게임 #인플루언서 #ENFJ

0개의 댓글