반응형
SMALL
쉐이더 구조
1. CGPROGRAM영역

- CGPROGRAM ~ ENDCG 부분은 유니티 자체 스크립트가 아닌 CG언어가 사용된다.

- 전처리 영역 (스니핏 snipet)
- 이라고도 부른다
- 쉐이더의 조명계산 설정, 기타 세부적인 분기를 정해주는 부분

- 인풋 구조체 Input Structure
- 구조체로 엔진으로 부터 받아와야 할 데이터 들이 들어간다.

- Surf 함수
- 함수 영역으로 색상이나 이미지가 출력되는 부분이다.
2. 색상 출력
- 출력은 Surf 함수 내에 작성

- 함수에 대한 세부 설명은 이미지를 참조
- 인자로 받는 SurfaceOutputStandard 구조체의 경우 쉐이더 파일 내부에서 확인이 불가하며 유니티 내부 include 파일에 정의되어있다

- 타입중 Half의 경우 float의 절반크기이며 그보다 더 작은 fixed 가 있다.
- 컬러나 벡터 길이는 fixed로 충분하며 정밀도가 필요한것은 half, 나머지는 float을 쓰는 것 이 좋다.
- 실제로 float 대신 half 타입을 사용시 엔비디아 GPU 쪽에서는 연산수가 2배로 빨라진다고 한다.
3. Albedo값 수정
- Albedo값 수정시 빛의 영향을 받는듯 음영이 생긴다.
- 이는 조명연산이 추가되기 때문
void surf (Input IN, inout SurfaceOutputStandard o)
{
// Albedo 값 변경시 빛의 영향을 받는 듯한 모습으로 출력
o.Albedo = float3(1,0,0); // fixed3 (R,G,B)
o.Alpha = 1;
}

4. Emission 값 수정
- Emission값 수정시 빛의 영향을 받지않는 모습으로 출력된다.
- 조명 연산이 추가되지 않기 때문에 순수한 결과물을 보고 싶을때 사용한다.
void surf (Input IN, inout SurfaceOutputStandard o)
{
// Emission 값 변경시 빛의 영향을 받지 않는 모습으로 출력
o.Emission = float3(1,0,0); // fixed3 (R,G,B)
o.Alpha = 1;
}

5. 색상 사칙연산
- 각 연산별 결과물은 스크린샷을 참조



- RGB 각각 1이 넘어가는 값을 할당시에는 값을 1 할당했을때와 다른 부분은 없다.
- 이유는 모니터에서는 0이하의 색상과 1이상의 색상 전부 0이나 1로 보이기 때문
- 1보다 크고 0보다 작은 숫자가 존재하고 계산되는 상태를 우리가 흔히 모니터나 티비의 사양에서 확인 가능하나 HDR(High Dynamic Range) 라고 한다.
- 하지만 내부적인 데이터는 float3(2,0,0)으로 값이 저장되기 때문에 주의 할 필요가 있다.
- 연산시 주의점
- 연산은 같은 자릿수 끼리 가능 (하지만 예외적으로는 1자리 끼리는 가능하다.)
- float + float (0)
- float4 + float (X)
- float3(1,0,0) + 1 = float3(2,1,1) (0)
다음 포스팅은 변수 이용을 통한 쉐이더 수정.
반응형
LIST
'게임 그래픽 프로그래밍 > 개인공부' 카테고리의 다른 글
| 서피스 쉐이더 - 외부의 입력값 출력 (0) | 2023.12.20 |
|---|---|
| 서피스 쉐이더 - 변수 활용 (0) | 2023.12.19 |
| 서피스 쉐이더 - 쉐이더 Properties (0) | 2023.12.14 |
| 서피스 쉐이더 - 마테리얼, 쉐이더 생성 및 오브젝트 적용방법 (0) | 2023.12.13 |
| 그래픽 쉐이더 - 렌더링 파이프라인 (0) | 2023.12.12 |