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

게임그래픽엔진심화 7강 - [코드로만드는 셰이더2] - 자료형, HLSL의 연산자

NEMORIZE 2022. 9. 30. 20:53

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

 

변수(6강 이어서)

 

 

자료형

쉽게 말해 그릇의 크기라고 생각하면 된다.

메모리 단위 중 가장 작은 단위인 비트(bit)가 있고

약 8비트 = 1바이트

 

 

정수형(int)

 

정수. 수학시간에 많이 들어봤을 것이다.

말 그대로 1, 2, 3, 4, 5... 등을 나타낸다.

 

유니티 셰이더에서는 int형 프로퍼티를 지원하지 않는다.

된다고 해도 float로 작동한다.

 

 

[HLSL] float형 (32b 2진수)

 

1, 1.0, 1.0f 모두 float형으로 작동한다.

(12.345)

 

여기서 1.0f에 f는

소수점 자리만 제외하고 모두 같은 숫자

숫자가 커지면 정밀도가 낮아지는 실수 (소수점)

가수부(24b)

 

 

fioat & half 테스트

float - 32비트면 높은 정밀도임. 10진수로 따져봤을 때 6~7부터 정밀도에 문제가 생긴다.

half - 16비트 낮은 정밀도. 10진수 기준 약 3자리 정도 된다.

 

플랫폼에 따라서 half를 쓰더라도 float을 썼을 때와 같은 모습을 보이기도 한다.

 

 

[HLSL] float? float4?

 

셰이더랩에는 (프로퍼티)Vector2 이런거 없고 무조건 4.

변수가 그릇으로 비교했을 때 float2는 짬짜면 처럼 두개로 나뉘어진 것이다.

 

float4면 그릇이 4개이다. Vector4도 마찬가지.

재질 창에서는 다음과 같이 보인다.

 

[xyzw] 이는 [rgba]와 같은 의미이기도 하다.

 

 

[HLSL] float4의 선언

 

초기 값 없이 선언만 하는 경우

float4 testVar;

 

초기 값과 함께 변수 선언

float4 testVar = float4(1, 2, 3, 4);

 

testVar.xy testVar.zw 이렇게 사용도 가능하다.

testVar.xygb - 에러남. (서로 동의어기는 하지만 섞어서 쓸 순 없다)

 

컴포넌트 위치를 바꾸는 것 - 스위즐

testVar.zxyw - testVar.yzx

 

 

연산자

 

 

[HLSL] 곱셈과 나눗셈 부호

 

x = *

+ = /

^제곱 = pow(a, b)

 

 

간략하게 줄여서 표현 가능하다.

 

color = color * _Value;

color *= _Value;

 

a = a+b;

a +=b;

 

 

벡터의 곱셈(참고)

 

float4 a = float4(1, 2, 3, 4);

float4 b = float4(5, 6, 7, 8);

float4 v = a*b;

 

 

유니티 ShaderLab

 

유니티 자체 스크립트 언어이다.

 

_BaseColor 끝에 꼭 중괄호를 추가해야 한다.

안그러면 다음 코드가 무엇이냐에 따라 에러가 나기도 한다.

 

 

URP Unlit Texture Shader 제작

 

 

만드는 방법은 어렵지 않다.

프로젝트 창에서 마우스 우클릭 → Create → Shader → UnlitShader 생성하기

 

이러면 Unlit 셰이더가 생성된다. 그리고 PPT 자료 링크에 있었던 코드를 복사해 넣는다.

그리고 보면 초록색 글씨로 //어쩌고저쩌고 되어 있는게 보일텐데,

 

이것은 주석이라는 건데, 눈치 빠른 사람이라면 이미 알았겠지만 그냥 알기 쉽게 하려고 메모 해놓는 것이다.

좀 더 사용자가 이해하기 쉽도록 코멘트 달아 놓는 것이라고 보면 된다.

 

개인으로 사용하는 스크립트라고 할지라도 중요한 포인트가 되는 부분은 기록해 놓는 편이 좋다.

다른 사용자가 있다면 더더욱 주석으로 설명을 적어놓는 것이 좀 더 알기 쉽고 작업하기 용이하다.