본문 바로가기
튜터리얼_스터디

(HLSL)아티스트를 위한 URP 셰이더 Shader #3 - 프로퍼티스1

by 대마왕J 2021. 7. 21.

 

후후후 이번에는 코드로 해 봅시다. 프로퍼티가 뭔지는 지난 시간에 말했으니까? 
자 일단 코드를 다시 보죠 

Shader "One/Two/Three/Four/TestShader"
{
    Properties
    { }

    SubShader
    {
        Tags { "RenderType" = "Opaque" "RenderPipeline" = "UniversalPipeline" }

        Pass
        {
            HLSLPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl"

            struct Attributes
            {
                float4 positionOS   : POSITION;
            };

            struct Varyings
            {
                float4 positionHCS  : SV_POSITION;
            };

            Varyings vert(Attributes IN)
            {
                Varyings OUT;
                OUT.positionHCS = TransformObjectToHClip(IN.positionOS.xyz);
                return OUT;
            }

            half4 frag() : SV_Target
            {
                half4 customColor = half4(0.5, 0, 0, 1);
                return customColor;
            }
            ENDHLSL
        }
    }
}

주석은 다 지웠습니다. 주석이 궁금하신 분은 이전 시간을 다시 보심 되고요. 
주석도 너무 많으니까 정신없어 배부른소리 

코드를 처음 보신 분은 뭐 .. 아예 인식이 잘 안된다는거 잘 알고 있습니다. 저도 그랬으니까. 
하지만 제가 누굽니까... 요령을 가르쳐 드리지요 .. 저 역시 코드 1도 모르고 시작했던 사람이라 어디서 막히는지 잘 알고 있거든요. 

자 일단, 코드는 이런 느낌으로 보세요 

0. 아예 번호로 지정되어 있지도 않은 크으으으ㅡ으ㅡㅡ응으으은으느은은은은 집이 있고요 . 이건 { } 로 감싸져 있죠 
이건 집으로 따지면 그냥 큰 집 자체를 의미한다고 생각하면 돼요 대문을 열고 들어가 보죠. 

1. 그 집 안에 입구에 보면 전실같은 "1" 번이 있지요 .
여긴 Properties{ }로 감싸져 있어요. 집으로 생각하면 여긴 대충 '전실'같은 느낌. 
아직 집에 들어가지도 않은 거예요. 뭔가 집 들어가기 전에 뭔가 뭔가 하는 그런 느낌. 가끔 좋은 집 가 보면 대문 열었는데 뭔가 공간 하나 더 있는 느낌 있잖아요. 아 몰라 하여간 그거.  

2. SubShader{ } 가 있지요. "2" 번 영역이예요 여기가 진짜 집. 드디어 집에 들어왔네요. 여기는 집 들어와서 초입 부분이예요. 
근데 들어오자마자 2번에는 Tag{  } 가 있지요? 여기는 좋은 집인가 봐요. 전실 넘어서 집에 왔더니 또 신발장이 있어요. 
여기서 이 셰이더의 큰 설정을 하지요. 이제 신발 벗고 들어오세요

3. Pass{ } 가 있지요? "3" 번이요 이제 진짜 집에 들어오신 거예요. 잘 오셨어요! 
이 집은 다시 HLSLPROGRAM ~ ENDHLSL로 감싸져 있는데, 됐어요 몰라도 돼요 그냥 그런가 보다 하세요  


자 뭐 됐고. 아 외우지 말아요. 적지도 말아요. 한 번 읽고 아 그렇구나 그러세요. 어차피 초보라면, 못 외워요. 
그냥 여러 번 내가 얘기하는게 빠릅니다 ㅋㅋㅋ 아니 무시하는게 아니라 진짜 그게 더 잘 익혀져요 

자 잊어도 돼요

 

Properties 

자 오늘 할 건 저기의 1 번 Properties 입니다. 
솔직히 말하면요. 저기는 코드로 하는게 더 쉬워요 (속닥속닥)
개념도 더 클리어 해서 저는 매우 좋아합니다. 

너무 좋아

일단 도움말은 여기네요 
https://docs.unity3d.com/Manual/SL-Properties.html

 

Unity - Manual: ShaderLab: defining material properties

ShaderLab: defining a Shader object ShaderLab: assigning a fallback ShaderLab: defining material properties This page contains information on using a Properties block in your ShaderLabUnity’s language for defining the structure of Shader objects. More in

docs.unity3d.com

이걸 읽으셔도 되는데, 영어인데다가 보기 좀 힘드니까 설명드릴께요

일단 다른데는 다 신경 끄고, 

Properties
    { }

만 보시죠. 다른데는 그냥 두세요. 지우지 말라고!!!!! 지우라는 말이 아냐!!! 그냥 보지 말라는 거지요!!! 

기본 코딩에서는 띄어쓰기나 엔터가 큰 의미가 없습니다. '절대로 붙여쓰면 안되는 경우' 는 있지만 보통 띄어쓰기는 별 의미 없어요. 

게다가 이 부분은 정통 코딩이라고 부르기도 좀 애매... 유니티의 자체 스크립팅 언어인 'ShaderLab' 입니다. 
나중에 진짜 셰이더 코딩은 HLSLPROGRAM ~ ENDHLSL 로 하게 되고요, 지금은 유니티의 스크립트를 사용하는 단계입니다. 그래서 끝에 ; 를 붙일 필요도 없고, 대신 엔터가 의미가 있고, 대소문자를 구별 안하는 등의 귀찮은 점들이 있어요. 모르겠으면 걍 넘어가셔도 되고 허허허 

서론이 길었네요. 그냥 해 봅시다. 

메뉴얼에 따르면 , 프로퍼티를 쓰는 법은 이렇게 한다고 합니다. 

일케요. 

한글로 쉽게 설명하자면, 

[뭔가 옵션] 변수이름("인스펙터에 보일 이름", 어떤 타입인가) = 초기값

이라고 되어 있는 거네요.  

자 그럼 Float 부터 만들어 봅시다. 

Float / Range

이전에 노드 만들때에도 float하나 만드는 것 부터 시작했지요? float은 한 자리 숫자(소숫점이 있는) 을 나타내는 말입니다. 마찬가지로 여기서 만들어 보도록 하지요. 

그럼 일단 아래와 같이 써 보세요. 

Properties
    { 
        _TestFloat("테스트 플롯이다뇨", Float) = 0
    }

그리고 저장한 후에, 이 셰이더를 적용한 메터리얼에 가 보면 ... 이렇게 되어 있는 것을 알 수 있습니다. 

짠. 간편하죠? 

이걸 설명해 보면, 이렇게 인식하시면 돼요 

[뭔가 옵션] 변수이름  ("인스펙터에 보일 이름", 어떤 타입인가) = 초기값

                _TestFloat  ("테스트 플롯이다뇨"   ,   Float            ) = 0

  • [뭔가 옵션] 은 안써도 상관없는 값입니다. 필요할 때 특별한 옵션을 넣기 위한 것이예요. 
  • 변수이름은 여기서 _TestFloat 이라고 썼고요, 이게 프로그래머가 스크립트에서 보는 진짜 이름이라고 생각하시면 됩니다. 이 이름을 잘 지어야 겠지요 역시 변수명이라서 시작을 숫자로 해서도 안되고, 한글이나 특수문자를 사용하셔도 안되고, 띄어쓰기도 하시면 안됩니다. _ (언더바)만은 예외고요
    아.. 그리고 '예약어' 도 쓰면 안됩니다. 예약어가 뭐냐고요? '왠지 유니티에서 쓰고 있을 것 같은 이름' 이예요. 
    예를 들자면.. Color 라던가 Float 이라던가 이런걸 이름으로 쓰면 곤란하겠죠
    또, 당연하게 이미 쓰고 있는 이름과 겹쳐서도 안됩니다. 
  • 인스펙터에 보일 이름은 " " 안에 넣어야만 합니다. 그리고 한글로 써도 되는 유일한 부분이예요
  • 어떤 타입인지는 ....  여기서는 Float을 썼습니다. 이 부분은 스크립트라서 대소문자가 그다지 중요하지 않은 부분이라서 float 이라고 써도 잘 먹습니다. '한 자리만 입력받겠다' 라는 뜻이겠지요. 
  • 초기값은 셰이더가 탄 ★ 생 한 순간에 들어있을 값입니다.  유저가 건드리는 순간 의미없어지지요. 
    음... 프로그램을 조금 해 보신 분은 왜 저기가 0.0f 가 아니라 0 이지...? 라고 생각하실 수 있겠지만, 셰이더는 GPU 처리라서 거의 모든 경우 걍 float으로만 처리하기 때문에 (GPU가 부동 소수점에 특화되어 있기 때문에) 걍 0으로 써도 알아서 잘 먹습니다. 

후후후 좋습니다. 뭐 얘기가 많지만, 일단 하나만 쓸 줄 알면 그다음부터 쉬워지지요. 

아참, Float은 이렇게 표현하는 법도 있습니다. 

Properties
    { 
        _TestFloat("테스트 플롯이다뇨", Range(0,1)) = 0
    }

이렇게 하면 어떻게 될까요?

우옷! 0에서 1까지 제한값을 가진 슬라이더가 만들어 졌습니다!!!

이건 사실상 Float과 똑같은건데요, 최대 최소값을 제한할 수 있어서 이상한 숫자를 넣을 수 없게 만들 때 좋지요 
그래픽 아티스트를 믿을 수 없을 때 

Range를 사용하는 법을 설명하자면 이렇게 될 수 있겠네요 

[뭔가 옵션] 변수이름  ("인스펙터에 보일 이름", Range( 최소값, 최대값 )) = 초기값

 

좋아요. 이제 그럼 Float은 한 자리 숫자를 입력받는 기능이란걸 알 수 있었습니다. 
한 자리 숫자를 입력받게 할 수 있고, 범위(Range) 를 정해서 슬라이더로 값을 입력받게 할 수 있어요!
라는 간단한 내용이었습니다. 한 번 해 보세요!!! 

블로그 주인장에게 커피값을 후원할 수 있습니다! 

donaricano-btn

반응형

댓글