셰이더그래프
-노드 기반 셰이더 작성
코드로 직접 작성 ( 유니티 그룹에서 셰이더 그래프와 구분짓기 위 커스텀 셰이더 라고 지칭함 )
HLSL ( SRP 전엔 CG사용 했음 )
사실 2022.6.15일 현재까지도 유니티 2020, 2021 버전대에서 create->unlitshader를 하면 cg를 사용하는 srp 태그 없는 레가시 셰이더가 생성 된다. 2022에서는 어떻게 진행 되는지 모르겠지만 일단은 create 한 뒤 srp hlsl 형식으로 변환 해 주면 된다.
///
셰이더랩
유니티에서 커스텀 셰이더를 생성하면 HLSL파일이 아닌 HLSL을 감싸고있는 shader 확장자의 파일이 생성 되는데, 유니티에서 잡다한 설정들을 때려넣기 위해 별도의 문법을 추가한게 셰이더 랩이다. 셰이더 랩은 유니티 자체 규칙들과 hlsl 문법을 담고 있다
크게 프로퍼티, 서브셰이더 구문으로 나뉜다
a.프로퍼티
셰이더그래프의 블랙보드와 같은 기능으로 메터리얼에서 접근 할 변수를 등록 한다.
https://docs.unity3d.com/kr/530/Manual/SL-Properties.html
ex)
프로퍼티속성(없어도 됨) 변수명 노출 변수명 자료형
[MainColor] _BaseColor("Base Color", Color) = (1,1,1,1)
b.서브쉐이더
하나이상을 가질 수 있고, Render 설정값을 가지고 있는 Tags와, hlsl 본문을 포함하고있는 Pass로 나뉜다
SubShader가 여러개면 현재 하드웨어에서 지원하는 SubShader중 가장 위에것을 사용한다
b-1 Tags
https://docs.unity3d.com/kr/2021.3/Manual/SL-SubShaderTags.html
b-2 Pass
Pass 는 Command, Name, Tags, 본문으로 나뉜다. Command는 알파나 그리기 관련 각종셋팅값이고, Name은 다른 Pass에서 UsePass 할 때 참조용이고, Tag는 LightMode를 셋팅 해 주는데, 현재 자기 자신을 넣으면 사용한다는 뜻이고, 다른 값을 넣으면 현재 패스를 사용하지 않게 된다.
Pass는 보통은 한개이고 여러번에 걸쳐 그릴 때 Pass를 여러개 사용하면 된다.
Pass를 직접 선언하는 방법 외에도 UsePass 로 include 하는 방식도 있다.
Commands EX)
Blend One One
ZWrite Off
Cull Off
HLSL에서 사용할 변수는 SRPBatcher 최적화를 위해 아래 처럼 CBUFFER 안에 넣어준다. 예외 : 텍스쳐,샘플러
CBUFFER_START(UnityPerMaterial)
half4 _BaseColor;
half4 _BaseColor2;
CBUFFER_END
다른 재질을 사용하더라도 같은 셰이더를 사용하는경우 CBUFFER 메모리 영역에 프로퍼티 값을 저장해둬서 setpasscall을 최소화한다
이렇게 작업 해 주면 셰이더 익스펙터에 SRP Batcher compatible 이 표시된다.
텍스쳐 출력 까지만 해도 기본 HLSL과 문법이 많이 달라서 기본 폼 첨부한다
스위즐링
float4 xyzw;
xyzw.xz = float2(3,4);
파라미터 in, out, inout
기본적으로 파라미터는 in 셋팅이고, in out 모두 쓸 경우 inout을 붙여줘야한다
매크로나 include에서 가져온 함수 원형을 찾을 때 찾는 폴더를 기본 Asset으로 돼 있던걸 상위 전체 폴더로 변경 해 줘야 패키지도 포함해서 찾아준다.
다양한 디바이스에서 자동으로 치환되게 하기 위해 매크로를 사용한다.
샘플링
텍스쳐에서 실체 색을 얻어오는 행동
샘플러스테이트
컬러값 외에 clamp라든지 기타 텍스쳐 상태 정보 저장소이다. 과거 PC에서 hlsl 할 때는 샘플러를 따로 받아오지 않았는데, 요새 이러는 이유는 보통 샘플러와 텍스쳐의 사용 가능 갯수가 다르기 때문이다. 텍스쳐는 128개, 샘플러는 16개 사용 가능한데, 이걸 합쳐서 표현하면 텍스쳐도 16개 까지밖에 못 쓰기 때문에 이렇게 따로 구분 해주는 방법을 사용한다. 실제로 셰이더 하나에 텍스쳐 16개 이상 쓸 일이야 없겟지만.
include
hlsl에서 하던 많은 동작들을 #incldue "xx" 로 단축시켜놨다. 처음 shaderlab을 접할때는 오히려 유니티에서 래핑해놓은 함수를 써야해서 혼란스러울수있다.
UsePass
shaderlab 문법.
ex) 그림자 사용 UsePass "Universal Render Pipeline/Lit/ShadowCaster"
쉐이더랩 문법 하이라이트
아래 처럼 추가 해 줬는데, 하이라이트 되진 않고, 방법을 찾아봐야할듯