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

게임그래픽엔진심화 10강 - 함수와 구조체, 시멘틱, 전처리, 네이밍 관례, if분기, 좌표계

NEMORIZE 2022. 9. 30. 20:57

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

 

지난 강의 보충

 

함수의 매개변수와 인수

 

선언과 사용을 동시에 한다.

함수의 선언이라는 것은 함수가 어떤 데이터 파일이고

어떤 값을 받아들이느냐가 중요하다.

 

 

#pragma

 

지오메트리 셰이더

 

10강

 

[HLSL] 시멘틱(Semantics)

 

변수가 어떤 의미인지를 알려주기 위한 표시를 나타낸다.

함수 반환값이 의미하는 것을 직관적으로 보여준다.

 

OpenGL, DirectX등 파이프라인이 있다.

Attributes 구조체는 최초로 셰이더를 엔진에 받아온다.

 

 

버텍스 셰이더에서 중요한 것들이다.

 

 

주요 시멘틱

입력 멤버 변수의 의미를 명시할 필요가 있다.

 

- 포지션: POSITION0, POSITION1, POSITION2 ...

- UV 좌표: TEXCOORD0, TEXCOORD1, TEXCOORD2 ...

 

 

프래그먼트 셰이더의 출력

 

SV_Target을 사용한다.

 

리턴된 함수는 결국 이 뜻을 가진다.

(프래그먼트는 Half4의 성질을 가지는데 이것을 SV타겟에 넣는다는 뜻)

 

 

[HLSL] 구조체 (Structure)

 

원래 일반적인 프로그래밍 언어에서 구조체의 개념은 함수도 멤버로 존재한다.

함수에다가 매개변수로 전달할 때에는 통째로 넘긴다. (밥상을 통째로 넘기듯이)

 

구조체를 안쓰면 하나하나 입력 변수로 넣어줘야 하는데

구조체를 사용함으로서 간결하게 표시할 수있다.

 

 

[HLSL] 변수의 Scope

함수 밖에서 선언한 것은 안에서 사용해도 되는데,

안에서 사용한 것은 밖에서 사용할 수 없다.

 

자신이 속한 중괄호 안쪽만 유효하다.

 

 

전 처리 지시어 (Preprocessor Directives)

 

 

전처리 지시어

셰이더 그래프의 키워드 분기 또한 전 처리의 한 종류라고 볼 수 있다.

 

 

지시어 종류 (중요한 것만!)

#define - 상수나 매크로 정의

조건 분기 - #elif #else #endif #if #ifdef #ifndef → 정적 분기

#include - 외부 파일의 코드 삽입

#pragma - 하드웨어나 OS별 기능을 제공

 

 

전처리 지시어와 정적 분기

토글 테스트. 토글 테스트를 off하면 설정한 R, G, B값이 적용된다.

반대로 토글 테스트를 활성화 하면 무조건 노란색이 된다.

 

 

정적 분기를 위한 키워드는 재질에 저장된다.

코드 없이도 재질에 키워드를 세팅해주는

MaterialPropertyDrawer 가 있다. → [Toggle] 과 [Enum]

 

토글 키워드는 On에 해당하는 키워드 하나만 설정한다.

 

토글이라는 Attributes를 만나면 자동으로 해준다.

셰이더에서 컬러값은 텍스처도 리턴하지만 라이트 결과값도 똑같이 리턴한다.

 

 

네이밍 관례와 표준

 

 

네이밍 관례? (Convention)

프로그래밍 언어로 작업하는 스크립트는 여러 작업자가 사용하는 경우가

많다. 그렇기 때문에 가독성과 통일성을 위해 관례적으로 지켜야 하는 규칙들이 있다.

 

관례를 지키지 않아도 시스템상 문제가 발생하지는 않는다.

하지만 관례라는 것 자체가 따로 규정해 놓은 규칙이고,

좀 더 편리한 방식과 효율적인 방식으로 개발하기 위한 과정이기 때문이다.

 

'그렇게 하면 좋다' 라는 경험을 정리 해 둔 것이라서 신입이라면 일단 관례를 따르는 것이 좋다.

업계별로 특정 스타일이 다 다르기 때문이다.

 

 

[유니티 HLSL] 셰이더의 네이밍 관례

 

프로퍼티는 밑줄과 대문자로 시작한다.

 

구조체는 대문자, 멤버는 소문자로 사용한다.

 

 

셰이더의 if 분기

 

 

[HLSL] 셰이더에서 if 분기를 대하는 자세

셰이더 if 분기를 사용하려면 셰이더 내부의 작동 방식을 자세히 이해하고

알고 있어야 한다. 그러나 난이도는 높다.

 

대체로, if 분기 사용은 가급적이면 자제하되 필요하면 사용한다 정도의 기준으로 사용하면 된다.

 

 

좌표계, 벡터, 행렬

엔진, 노드, 코드를 불문하고 중요한 개념이다.

셰이더 가장 기본적인 개념이기도 하다.

엄청 중요하다는 뜻이다.

크게 세가지가 있다.

 

- 좌표계 - Coordinate System

- 벡터 - Vector

- 행렬 - Matrix

 

 

데카르트 좌표계

그냥 모눈종이 있다면 데카르트다 라고 알고 있자

 

 

유니티에서 살펴보는 좌표계

좌표계는 MVP 변환의 중요한 개념.

 

 

셰이더에서 다루는 공간

- 오브젝트 공간, 로컬 공간(Object Space, Local Space)

- 월드 공간(World Space)

- 뷰 공간(View Space)