교내 활동/게임그래픽엔진심화

게임그래픽엔진심화 8강 - Lambert 셰이더 맛보기, ShaderLab

NEMORIZE 2022. 9. 30. 20:54

※ 이 게시글은 5월 4일 작성 되었습니다. (원본 링크)

 

지난 강의 보충

 

반투명 오브젝트 소팅 - 2Pass ZWrite

1번은 라이트모드 활성화

2번은 Transparnt 2Pass 활성화

 

두 방법 모두 반투명하지만 Z-Buffer에도 존재한다.

 

.

2번 방법.

앞에 공은 존재하지 않음. 디폴트 릿 셰이더

 

URP방식 중 특정 LightMode 태그 셰이더만 패스 추가

 

 

벡터곱

 

7강 내용에서 HLSL 벡터의 곱셈은 이름이 벡터과 비슷하다.

 

하지만 벡터곱은 cross이며 완전 다른 연산이다.

내적(dot))(V1·V2)도 아니다.

 

 

8강, 셰이더 코드 실습 - UV 스크롤

 

ShaderLab (2021.2)

유니티의 셰이더 언어이며, HLSL, CG기반으로 작동한다.

 

 

Custom Shader

커스텀 쉐이더의 역할을 그대로 모방한 것이 쉐이더그래프이다.

버텍스 셰이더, 프래그먼트 셰이더를 구체적으로 제어할 수 있다.

 

버텍스셰이더? 프래그먼트 셰이더?

 

버텍스 셰이더 - 물체 정보에 버텍스 연산을 한다.

프래그먼트 셰이더 - 화면상에 보이는 모든 픽셀들을 계산해 실행한다.

 

 

스크립트의 세미콜론

셰이더 코드 내에 세미콜론은 문장 끝에 있는 세미콜론에 대해 알아보자.

 

따로 규칙이 존재하긴 하지만 일단 너무 복잡하다.

어떤경우는 콜론이 있지만 어떤경우는 또 콜론이 없다.

 

그래서 그냥 외우면서 적응하는 수 밖에 없다.

하면서 익숙해지는게 제일 현실적인 방법이다.

 

※ 규칙은 강의자료 참조

 

 

주석(Comment)

 

더블슬래시 // 이후는 말 그대로 메모장이나 다름 없다.(코멘트 or 설명서)

무슨 말을 적든 내용은 실제 적용되지 않는다.

 

// 이외의 /* */ 같은 형식도 있는데 이것은 여러 줄로 되어 있는 문장일 경우에 주로 사용한다.

 

 

셰이더 카테고리

셰이더를 분류하는 기준이 되는 부분이다.

 

슬래시 /를 이용하여 폴더를 구분한다.

따옴표로 시작과 끝을 구분한다.

 

 

프로퍼티 (Properties)

셰이더의 블랙보드 역할을 한다. (키워드 부분 제외)

(재질 인스펙터 창에 보이는 부분)

 

셰이더 코드에서 _BaseMap 앞에 _를 볼 수 있는데 이는 셰이더 코드에서 쓰는 실제 변수이다.

재질 인스펙터 창에는 _없이 "BaseMap"으로 보인다.

 

블랙보드와 프로퍼티를 비교한다면 이렇다.

코드로 저렇게 나와 있어서 그렇지, 실제로 많이 보던 블랙보드의 개념과 같다고 보면 된다.

 

 

메인컬러, 메인텍스처

[MainColor]는 프로퍼티 속성(Attribute)이다.

 

이 속성은 필요에 의해 선택적으로 사용하며

_BaseColor 프로퍼티가 ‘메인 컬러’ 라는 사실을 엔진에 알려준다.

 

프로그래머나 테크니컬 아티스트의 요청이 없으면 [MainColor]는 안 써도 된다.

 

 

프로퍼티선언과 HLSL선언

결론적으로 프로퍼티선언과 HLSL선언을 같이 해야 한다.

 

프로퍼티에서 선언했던 것은 제질 편집기에서 보이는 것이지,

실제 코드안에서 사용될려면 한번 더 선언을 해주어야 한다.

 

 

SubShader

 

여러개의 서브셰이더를 구성할 수 있고, 셰이더에서 사용할 수 있다.

현재 하드웨어에 지원되는것 중 첫 번째 것이 사용된다.

 

 

Tags

 

렌더링 방법과 시기를 지정한다.

햇갈리는 것이, 서브셰이더에도 태그가 있고 패스에도 태그가 있다.

 

◇ Tag - Queue

렌더링 순서를 정할 수 있게 된다.

어떤 순서로 그려지는지를 명시해 주어야 한다.

 

상대적인 숫자를 넣을 수도 있고 직접 숫자를 지정해 줄 수도 있다.

 

◇ Tag - RenderType

일종의 구분짓는 경우, 일반적이지 않는 경우이다.

(사실상 쓰는 경우를 많이 못봄)

 

자신 프로젝트에 맞게 그룹화 하는 목적으로 주로 쓰인다.

 

◇ Tag - RenderPipeline

URP 혹은 HDRP를 사용할지 말지 선언하고, 지정하지 않는다면 레거시가 된다.

 

 

Pass

Pass는 일반적으로 여러개 존재할 수 있으며 Pass의 갯수만큼 여러번 반복하게 그려진다.