[Graphics] 그래픽스 스터디 (3)

박민주·2022년 1월 24일
0

Unity

목록 보기
12/40
post-thumbnail

여기에서는 색상 관련 실습을 진행해보려 한다.

1. 색상 입력받아 출력해보기

책에 나온 코드 중에서 색상을 입력받아 출력하기 위한 부분만 남기고 지웠다

배운 점

  • struct Input { } 지우면 에러나고, 멤버를 하나라도 포함해야 함
  • Properties에 세미콜론 주의! 습관처럼 세미콜론 썼다가 에러가 떠서 무슨 에러인지 헤맸었다
  • o.Albedo는 r,g,b만 필요하므로 _TestColor라고 작성하지 않고 _TestColor.rgb 라고 작성
Shader "NewShader"
{
    Properties
    {
        _TestColor("TestColor", Color) = (1,1,1,1)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }

        CGPROGRAM

        #pragma surface surf Standard fullforwardshadows

        struct Input
        {
            float4 color : COLOR; // 버텍스 컬러를 받아오는 마법의 주문
        };

        float4 _TestColor;

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            o.Albedo = _TestColor.rgb; // o.Albedo는 r,g,b만 필요하므로 _TestColor라고 작성하지 않음            
            o.Alpha = _TestColor.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}


2. R,G,B 따로 입력받아서 색상 설정하기

배운 점

  • C# 하던 습관으로 o.Albedo = new float3() 이렇게 썼는데 new 키워드는 필요없다..
  • 변수를 만들 때 Properties에 선언 -> CGPROGRAM~ENDCG 에 선언하는 이 과정이 익숙해지고 있다
Shader "NewShader"
{
    Properties
    {
        _TestColor("TestColor", Color) = (1,1,1,1)
        _Red("Red", Range(0,1)) = 0
        _Green("Green", Range(0,1)) = 0
        _Blue("Blue", Range(0,1)) = 0
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }

        CGPROGRAM

        #pragma surface surf Standard fullforwardshadows

        struct Input
        {
            float4 color : COLOR;
        };

        float4 _TestColor;
        float _Red;
        float _Green;
        float _Blue;

        void surf (Input IN, inout SurfaceOutputStandard o)
        {
            o.Albedo = float3(_Red, _Green, _Blue);
            o.Alpha = _TestColor.a;
        }
        ENDCG
    }
    FallBack "Diffuse"
}

(사실 여기서부터는 TestColor 부분 없어도 된다)

3. 색상을 밝고 어둡게 만들기

float값을 하나 입력받고, 기존 출력 색상에 더해주면서 밝기를 조절하는 방식이다

어떻게 그냥 float값을 더하면 밝아지는 건지 생각해보면,
모니터에 표현되는 색은 더할수록 밝아지는 가산혼합 방식이니까
단순하게 기존 색에 더해주어 밝게 만드는 방식인 것 같다

위 코드에서 추가된 부분의 코드만 정리해보면 다음과 같다

    Properties
    {
        _BrightDark ("Brightness $ Darkness", Range(-1,1)) = 0
    }
     SubShader
    {
    	CGPROGRAM
        float _BrightDark;

        void surf (Input IN, inout SurfaceOutputStandard o)
        {            
            o.Albedo = float3(_Red, _Green, _Blue) + _BrightDark;
        }
        ENDCG
    }


참고

  • 테크니컬 아티스트를 위한 유니티 쉐이더 스타트업 (정종필 저)
profile
Game Programmer

0개의 댓글