Unity/URP

210713_ URP 쉐이더 2

minquu 2021. 7. 13. 20:19
반응형

 

버텍스 쉐이더는

 

VertexInput v // 버텍스 버퍼에서 받은 값이 들어오고

어떻게 보간기를 통해서 넘길지 정하는 부분

 

 

vert 버텍스의 값으로 v 로 들어오고

 

보간기를 통하고

 

o 으로 내 보내지는 구조임

 

----

 

공간변환

 

3D 메시의 각 버텍스를 사용하는 툴의 3D 공간을 변환하는 과정을 거치게 된다.

 

월드 변환 (Model View Perspective) // MVP 라고 부르기도한다

- 로컬 위치에 있는 모델링을 월드 위치로 변환하는 것 

- object to world 

 

 

이걸 다시 카메라 뷰로 바꾸는 걸 한다.

 

즉.

이 변환 과정은 간략하게  [오브젝트 공간]  >> [월드 공간] >> [카메라 공간] >> [클립 공간] 으로 거치게 된다

 

 

스크린샷 설명 

 

1. vertex 에 : 현재 오브젝트의 포지션을 담는다.

 

2. 1.vertex의 공간변환을 해준다. (TransformObjectToHJClip은 공간 변환 단계를 한번에 쭉 처리해주는 것)

그리고 매개변수로 들어온 v 의 vertex.xyz 값을 넣어준다.

 

3. vertex의 이 물체의 POSITION 값을 넣어준다.

 

 

-----

프로퍼티로 뚫어서 전체적인 밞기 조정하기

 

먼저 프로퍼티를 뚫어준다.

 

변수의 형식과 선언을 해준다.

 

마지막 픽셀 세이더에서 하는 곳에 

 

인텐시티를 곱해준다. (전체 밝기 조절)

 

 

어느정도 레거시와  구조상 비슷한 부분이 있는 듯 

 

이번에 half4 (Color(이건 3백터) * Intensity(1백터)) 를 해볼 것이다 .

 

그러면 컬러 프로퍼티에서 색도 바뀌고 

 

 

Texture Sampling

메모리에 올려진 텍스쳐를 해당 픽셀에 매핑하는 과정,

 

그게 두 가지 방식으로 이루어짐

 

1. Textures 와 samplers가 같이 이루어지는 

Coupled textures and samplers 방식

 

예전 CG에서는 주로 sampler2D 사용

 

 

CG 때와 비슷하게

 

 

프로퍼티에 선언을 한다.

 

인스펙터에 뚫림

 

tip.

fixed는 12비트 // -2 ~ 2 사이 값만 // 낮은 정밀도, 

half 는 16비트  // 2의 16승을 가진다.

float  // 2의 32승을 가진다. //

 

2 이상 값 이 안 올라가는 것에는 fixed도 좋지만, (ex 벡터, RGB 값들)

요즘은  AP가 좋아서

그냥 half로 처리하는 추세 

 

만약, HDR 를 쓰게되면 float 추천 // 

 

 

 

 

변수 선언에 

 

            sampler2D _MainTex;
            float4 _MainTex_ST;

 

두개를 써줘야한다.

 

기존 레거시 스크립터 작성할때는   sampler2D _MainTex; 만 입력했지만,

 

URP는 float4 _MainTex_ST; (tile과 offset을 사용하기 위한 값.) 도 선언해줘야한다.

 

 

버텍스  퍼버에 uv 값을 불러와준다.

 

 

float2 uv  값에  : TEXCOORD0; uv 값을 넣어준다.

 

그리고 이게 보간기를 통해서 픽셀 세이더로 보내준다. // 버텍스 쉐이더 -> 픽셀 쉐이더로 넘겨 주는 역할 

 

하지만, 버텍스 쉐이더에서도 한번 더 읽줘야한다.

 

            o.uv = v.uv.xy;

 

v로 들어오는 걸 o에 넣어준다.

 

픽셀 쉐이더는 버텍스 쉐이더의 값을 i로 받아오고있다.

 

 

픽셀세이더는 보간기에서 읽어 온 것들을 사용한다.

 

스케일은 곱해주는 것 // 곱하면 늘어나겠지

플러스는 앞으로 보내는 것 // 오프셋임

 

그래서 스케일 값은 곱해주고, 오프셋 값은 더해준다.

 

 

float2 uv = i.uv.xy * _MainTex_ST.xy + _MainTex_ST.zw; //  uv 의 스케일 값과 오프셋 값을 지정해줌

 

 

 

float4 color = tex2D(_MainTex, uv) * _Color * _Intensity; //

tex2D라는 텍스처 샘플링에 대한 함수사용 (텍스트이미지 , uv 값) 넣어준다.

 

 

 

이 곱하고 더하는 값이 중요함

 

Tiling 이 곱해지는 값

Offset 이  더해지는 값임

 

만약에

 

다 지우고 하면 

 

인스펙터에서 틸링 값과 오프셋 값을 조절해도 바뀌지 않는듯

 

 

----

 

2. Textures 와 samplers를 나눠서 하는

Separate textures and samplers 방식

반응형