※ 이 게시글은 4월 12일 작성 되었습니다. (원본 링크)
지난 강의 보충된 내용 정리
인풋 - 지오메트리 안에 중요 노드들
- Position
- Screen Position
- UV
- Vertex Color
- Normal Vector
Position

픽셀의 위치 값이며, 어떤 식으로 볼지 Object, View, World, Tangent 네가지의 옵션이 있다.
전에부터 궁금증은 가지고 있었지만 비슷하다고 생각해 별 대수롭지 않게 여겼던
World와 Absolute World의 차이!
Absolute World는 모든 SRP에서 절대적인 월드값을 말한다.
그렇지만 World는 다르다! 어떤 파이프라인이냐에 따라 명칭이 달라진다고 생각하면 된다.
URP에서는 Absolute World지만 HDRP에서는 Camera Relative가 된다.

Object 옵션. 오브젝트를 기준으로 삼는다.

View 옵션. 보는 방향에 따라 달라진다.
화면을 가로X, 세로Y로 본다.
ex) 화면을 오른쪽으로 - 하얀색, 왼쪽으로 - 검은색



View 옵션 설정 후 찍은 스크린샷들

World 옵션. 월드의 중심점 축을 기준으로 보고 움직일 때 변형된다.



World 옵션 적용 후 각각 왼쪽: 오른쪽으로 이동 / 가운데: 회전 / 오른쪽: 왼쪽으로 이동

추가로 이런식으로 Fraction 노드를 써서 스크롤 시킬 수도 있다.
(실제로는 한 방향으로 움직이는 중)
Normal Vector

픽셀의 방향 벡터이다.

월드좌표의 X값만 시각화 하겠다 하면 하얀 박스가 된다.
화면을 돌리면 X좌표쪽으로 오는 다른 면이 하얗게 변한다.
Screen Position


아까 위에서 설명했던 View방식과 비슷하게 스크린 포지션도
화면 위치(방향)에 따라 다르게 보인다.
UV


Particle System의 커스텀 데이터가 이쪽으로 전달된다.
Z-Test와 Z-Write

Z-Test = Z-Read
1. 현재 그릴려던 픽셀을 기존의 버퍼 내용과 비교한다. (Z-Test)
(오브젝트의 Z값을 읽음)
2. 그려도 된다고 판단하면 그 때 Z-Buffer에 거리 내용을 기록한다. (Z-Write)
(Z값을 읽고 그 깊이값을 계산한 후 사용하는 것)
반투명 오브젝트의 소팅(6강)

유니티방식(레거시) - 2Pass로 진행, 처음에는 Z_Buffer에만 기록하고(검토)
판단 후에 두번째에서 최종적으로 렌더링한다.
하지만 언리얼 방식에서는 2Pass가 안된다.
그럼 어떻게 하냐면,
눈에 보이지 않는 메쉬를 겹쳐놓고 Depth만 처리하는 식으로 진행한다.
Early-Z, Early depth test

그래픽 파이프라인 중 일부 사진
그림을 보면 Pixel-Shader를 거쳐 Output-Merger에서 Depth Test를 수행한다.
그렇지만 오버드로우가 발생할 수 있으므로 Pixel-Shader 연산 이전에 Depth Test를 먼저 한다.
Render Queue

반투명 오브젝트는 기본적으로 Z-Write가 적용되지 않았을 경우 Z-Buffer에 기록되지 않는다.
불투명 오브젝트와 반투명 오브젝트가 같이 존재할 경우
불투명-반투명 순서로 오브젝트가 그려지면 문제가 없다.
반대로 반투명-불투면 순서로 오브젝트가 그려지면 문제가 생긴다.
왜냐하면 반투명은 Z버퍼에 존재하지 않기 때문이다.
그래서 렌더큐를 통해 어떤것을 먼저 그려줄지 정해준다면
앞-뒤 구분이 명확해질 것이다.
유니티는 기본으로 셋팅되어 있는 값이 있다. (자동 생성)
Opaque = Render Queue 2000
Transparent = Render Queue 3000
렌더큐를 제어하는 방법
- URP Lit
- Shader Graph
- Custom Shader
기본적으로 오파큐로 설정하면 2000으로 셋팅되어 있다.
Priority로 조정이 가능하다.

방법 ①

방법 ②

방법 ③
Transparent Alpha의 그리는 순서 문제
에드, 멀티플라이 등 순서 상관 없는데 알파는 순서가 중요하다.
소팅이란?
거리에 따라 그리는 순서를 변경하는 것이다.
알파 재질 사용 시 순서 제어를 위해 Sort Mode 제공한다.
알파 클리핑(컷아웃)

알파 클리핑이란? 다른말로 알파맵 제작 시 주로 맥스 같은 프로그램에서 자주 볼 수 있는
컷아웃이 있고 그밖에 알파테스트, 알파 클리핑 등으로 불리기도 한다.

알파클리핑을 적용한 모습이다.
알파클리핑을 켜 놓으면 알파텍스처끼리 겹쳐 놓아도 텍스처 경계가 보이지 않게 문제 없이 나타내준다.
단, Opaque에 사용해야 Z버퍼에 기록되며,
알파클리핑을 적용하게 되면 그림자까지 알파 채널 모양대로 Z버퍼에 기록된다.
(알파채널 모양대로) 소팅 이슈도 없다. (Z-Buffer에 기록되기 때문)
처음에 과거에는 알파클리핑을 쓰게 되면 부하가 심했었다. (모바일에서 많이 느려졌었음)
(모바일 기기의 Tile Based 하드웨어 특성때문)

알파클리핑은 주로 어디에 쓰이냐면, 풀이나 나뭇잎등에 자주 쓰인다.
변수와 자료형
자, 지금부터는 조금 긴장할 필요가 있다.
사실 이미 많이 긴장했다.
올것이 왔기 때문에..
하이라이트는 지금부터라고 할 수 있다.
물론 지금은 아직 기초에 불과하기 때문에 예상했던 것 만큼 어렵지는 않을 수도 있다.
[HLSL] 변수
한마디로 쉽게 말해 담는 그릇과 같다.
변하는 값을 담는 저장 공간인 것. 저장소(메모리)
변수는 선언 후 사용한다.
동시에 선언도 같이 할 수 있다.
(하지만 둘중 하나로 해야 한다. 선언을 이미 했다면 선언과 동시에 값을 지정하는 것 또한 안된다.
에러가 발생하기 때문)
float a; //변수 선언
float a = 10 //변수 선언과 동시에 값을 지정. 함께 선언함.
한번 선언한 변수는 일단 a만 사용할 수 있게 된다.
상수 (Constant)
변하지 않으며, 언제나 같은 값이다.
ex) const float threshold = 0.2f
변수를 상수처럼 써도 되지만 비효율적이다.
'교내 활동 > 게임그래픽엔진심화' 카테고리의 다른 글
게임그래픽엔진심화 8강 - Lambert 셰이더 맛보기, ShaderLab (1) | 2022.09.30 |
---|---|
게임그래픽엔진심화 7강 - [코드로만드는 셰이더2] - 자료형, HLSL의 연산자 (0) | 2022.09.30 |
게임그래픽엔진심화 5강 - 셰이더 일반, 반투명, Z-Buffer (1) | 2022.09.30 |
게임그래픽엔진심화 4강 - 키워드, 커스텀 라이팅 (1) | 2022.09.30 |
게임그래픽엔진심화 3강 - 색을 숫자로 생각하기, UV (1) | 2022.09.30 |