본문 바로가기
Shader

Normal Blending (Detail map)

by 대마왕J 2021. 2. 22.

Normal을 Blending 하는데 그냥 쉽게 더해서 나누는 것만으로 해결되지 않는듯. 

 

노말 블렌딩 공식이야 정형화되어 있지 않다고 하지만 일단 유니티에 있는 것을 따라하고 해석하는게 먼저일듯 하다 

생각해 보면 그렇다. 노말을 블렌딩한다고 간단히 생각할 수 있는데, 노말이란게 그냥 칼라가 아니라 기울어진 입체의 방향 아닌가. 이건 즉 '이미 기울어진 면 위에 다시 추가로 기울어진 면을 생성' 하는 것이란 말이다. 

 

즉 A라는 노말맵과 B라는 노말맵을 합칠 때, A와 B가 전환되는 기능을 원한다면 그냥 더한 뒤 나누거나 lerp 해도 문제 없지만, 디테일 맵처럼 A위에 B 를 얹을 때에는, 그냥 lerp 만으로는 A 를 B 가 눌러버리는 현상이 일어나게 된다는 것이다. 

 

이걸 분석해놓은 좋은 블로그가 있다. 

blog.selfshadow.com/publications/blending-in-detail/

 

Blending in Detail

The x, why, z It’s a seemly simple problem: given two normal maps, how do you combine them? In particular, how do you add detail to a base normal map in a consistent way? We’ll be examining several popular methods as well as covering a new approach, Re

blog.selfshadow.com

그리고 유니티의 디테일 노말 방법은 두 가지가 있다. 

첫 번째 방법은 저사양에서도 충분히 사용가능한 방법과 

두 번째 방법은 Reoriented. 즉 A 에 맞게 B의 벡터를 돌려서 계산하는 법. 


Default

void Unity_NormalBlend_float(float3 A, float3 B, out float3 Out)
{
    Out = normalize(float3(A.rg + B.rg, A.b * B.b));
}


Reoriented

void Unity_NormalBlend_Reoriented_float(float3 A, float3 B, out float3 Out)
{
    float3 t = A.xyz + float3(0.0, 0.0, 1.0);
    float3 u = B.xyz * float3(-1.0, -1.0, 1.0);
    Out = (t / t.z) * dot(t, u) - u;
}

반응형

'Shader ' 카테고리의 다른 글

#ifndef 이게 뭘까  (0) 2021.04.08
URP 2019 에서 2020으로 업그레이드 할 때 Shader Error  (0) 2021.03.24
Texcoord. xyzw와 UV1, UV2와의 관계  (1) 2021.02.11
돋보기 효과 만들기  (0) 2021.02.11
Shader.PropertyToID  (2) 2021.02.09

댓글