후후후 이번에는 코드로 해 봅시다. 프로퍼티가 뭔지는 지난 시간에 말했으니까?
자 일단 코드를 다시 보죠
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
이걸 읽으셔도 되는데, 영어인데다가 보기 좀 힘드니까 설명드릴께요
일단 다른데는 다 신경 끄고,
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) 를 정해서 슬라이더로 값을 입력받게 할 수 있어요!
라는 간단한 내용이었습니다. 한 번 해 보세요!!!
블로그 주인장에게 커피값을 후원할 수 있습니다!
'튜터리얼_스터디' 카테고리의 다른 글
(공통이론)아티스트를 위한 URP 셰이더 Shader #4 - 색과 숫자 (1) | 2021.07.23 |
---|---|
(HLSL)아티스트를 위한 URP 셰이더 Shader #3 - 프로퍼티스2 (4) | 2021.07.22 |
(셰이더 그래프)아티스트를 위한 URP 셰이더 Shader #3 - 프로퍼티스 2 (3) | 2021.07.20 |
(셰이더그래프)아티스트를 위한 URP 셰이더 Shader #3 - 프로퍼티스 1 (0) | 2021.07.16 |
(HLSL)아티스트를 위한 URP 셰이더 Shader #2 - 셰이더 이름바꾸기 (1) | 2021.07.15 |
댓글