블로그 이미지
자신의 단점을 메꾸는 것을 단(鍛)이라 하고 자신의 강점을 갈고 닦는 것을 련(鍊)이라 하여, 두가지를 합친 것을 단련이라고 부른다. 붕대마음

카테고리

전체목록 (664)
참고사이트 (8)
Goal (4)
Travel (10)
My Life (103)
Game (35)
Game Review (7)
Game Plan (0)
Books (5)
English (1)
Optimizing (12)
Study (217)
유용한 것들_etc (44)
유용한 것들_func (20)
Unity (48)
Unreal (87)
작업장 (54)
RenderMonkey (6)
정리요망 (1)
따라잡기 시리즈 (0)
링크용 (0)
Total339,492
Today19
Yesterday52

Physically Based Rendering/Shading은 무었인가?

PBR은 단순하게 말해 물리 현상을 기반으로 그리는 기법이다.

물리현상을 기반으로 한다는 것은 어떤 말일까?

물체가 우리눈에 비춰지기 위해서는 첫번쨰로 빛(Light)이 필요하고 이 물체가 빛을 받을 때

어떻게 보이는지는 물체의 재질에 의해 결정된다.

결국 PBR이란 빛과 재질을 기존 보다 좀 더 물리적으로 현상에 맞게 구현한 것이라고 보면 된다.


기존 방식의 렌더링은 어떤식이었는가?

적당한 물리법칙에 적당한 느낌을 내기 위한 적당한 보정 (적당한 수식).

기본적으로 3D 물체처럼 보이기 위해 필요한 것은 음영이며 이 음영을 결정짖기 위해 필요한 것이

빛(라이팅) 정보인데 빛을 적당히 시뮬레이션 하기 위해서 분류를 하자면 

간접광(ambient light), 난반사(diffuse reflection), 정반사(specular reflection)으로 분류할 수 있다.


Diffuse Model (난반사광) : 반사하지 않은 빛이 물질내로 투과되었다가 방출되는 것(굴절)

=> 분자구조에 의해 특정 파장이 흡수된다.

     색이 붙는다

=> 반사(방사)에 지향성이 (기본적으로) 없다.

     분자배열등으로 부터의 기하학적 영향은 있다.

     엄밀히는 에너지 보존법칙등의 영향을 받아 지향성을 가진다.

- Lambert : 물체의 표면이 모든 각도에서 볼 때 같은 복사량(Radiance)를 가진다는 전제.

  빛의 입사벡터 L과 표면의 법선벡터 N이 이루는 각도에 비례한다. 코사인 함수 사용.

  Output.mDiffuse = dot(-lightDir, worldNormal);


- Half Lambert : Lambert의 계산으로는 90도가 넘어가는 cos값은 음수이므로 너무 어둡기에 

  적당한 수치로 보정한다.

  Output.mDiffuse = pow(dot(-lightDir, worldNormal) * 0.5 + 0.5, 4);


- wrapped diffuse : 부드러운 반사를 표현하기 위해 빛이 비치는 반대 부분을 감싸준다.

  loat magicNmuber = 0.5; 

  Output.mDiffuse = (dot(-lightDir, worldNormal) + magicNmuber) / (magicNmuber+1);


Oren Nayar : 표면의 거친 정도를 고려한 난반사광, 모든 표면은 거칠다.

float inten = rho_pi * cosTheta_i * (A + B * max(0, cosAzimuth) * max(sinTheta_r, sinTheta_i) * min(tanTheta_i, tanTheta_r)); 



- energy conserving wrapped diffuse

  float magicV = 0.5;  

  float NdotL = dot(-lightDir,worldNormal);

  Output.mDiffuse = saturate( (NdotL+magicV ) / ((magicV +1)*(magicV +1))  ); 




Specular Model (정반사광) : 물질의 표면에서 반사되는 빛(반사)

=> 반사 색은 광원의 색(정확하게 따지면 아니지만 적당히)

=> 금속 등에서 Specular 반사광에 색이 붙는것이 있다.(선택반사)

     실제로는 Specular에서 단순히 특정 파장의 빛이 흡수되지는 않는다.

=> 미세 레벨의 분자형상(배열)을 반영해서 반사된 빛이 확산한다(광택, glossy)

     반사의 지향성

     빛이 특정 방향으로 집중해서 반사한다.


- Phong : 하이라이트(강한 빛이 반사된 부분)을 표현하기 위한 정반사광

  Lambert에 반사광만 추가한 것. 

  R : -E + 2(N·E)N


- Blinn Phong : Phong 모델의 반사벡터 R을 적당한 연산으로 해서 하프벡터 H로 대체.


- Cook Torrance : 표면의 거친 정도를 표현하기 위한 정반사광


Ambient Light (환경광,주변광,간접광) : 다른 물체에 반사되어 도달하는 간접광

환경광, 주변광, 간접광 등으로 불리지만 그냥 간접광으로 통일.

계산하기도 애매하고 diffuse나 specular에 비해 영향이 적어 적당히 상수로 많이 사용했었다.

하지만 diffuse가 적은 경우에는 ambient에 의한 영향이 무척 크다.

그래서 이 ambient를 상수가 아니라 그럴듯하게 만들기 위해 몇가지 시도가 있었다.

Irradiance Volume(valve), Hemisphere Lighting(메탈기어4), Spherical Harmonics Lighting(IBL SH, Point Clouds SH)...

이에 대한 부분은 내공이 부족해 다음 기회에 정리하기로 ㄷㄷ.


기존의 반사 모델을 어떻게 바꿀 것인가?

빛의 반사를 표현하기 위해 BRDF라는 개념을 사용한다.

간단하게 말하자면 양방향 반사 분포 함수의 뜻으로 반사율 특성을 묘사하는 것이다.

기존에 사용하던 BRDF모델을 좀 더 물리적으로 맞게 바꾸어야 한다.

이를 물리적으로 올바르게 하기 위해 두가지 성질을 갖추도록 해야 하는데 "에너지 보존"과 "상반원리"가 그것이다.

에너지 보존 법칙은 "어떤 한 방향으로 부터 입사한 빛의 에너지는 그 빛이 반사해서 출사한 빛의 총량 보다 크거나 같다"를

나타내며 Helmholtz의 상반성(Reciprocity)은 "BRDF 함수는 입사방향과 출사방향을 바꿔서 입력해도 값이 같다."를 나타낸다.

BRDF에서 추가로 고려해야 할 것이 프레넬 이펙트이며 표면에서 반사된 빛의 양이 시야의 각도에 

영향을 받는것을 고려한 것이다.

거기에 BRDF의 미세표면 이론은 물리기반 셰이더에서 중요한 부분을 차지한다.

물체의 재질을 물리적으로 잘 표현하기 위해 Metallic(물체 특성)을 고려한다.

금속특성이 높을 수록 반사율이 높고 굴절된 빛의 흡수률이 높다.

알루미늄이나 은의 경우 금속에 조사된 백색광은 거의 동일한 파장과 진동수를 방출하지만

금과 구리의 경우 흡수된 빛을 동일한 파장으로 방출하지 않고 특정 파장의 빛만 방출하고

나머지는 흡수하면서 금은 노랑색, 구리는 오렌지색의 반사빛을 띈다.

비금속은 굴절된 빛이 확산되거나 흡수되면서 금속보다 더 작은 빛을 반사시키고 반사색(Albedo)를 가진다.

빛을 계산할 때 올바른 연산 결과를 위해 Linear Space 또한 고려해야 한다.

이에 대한 내용은 "감마보정" 글을 참고하면 된다.

사실 PBR이란 정확하게 정해진 수식이 있지는 않다. 각 엔진에서, 또는 각 렌더링 단에서 적용하는 수식이 조금씩 다르다.

하지만 위의 내용들은 PBR을 구현하기 위해 기본적으로 통용되는 개념이니 이를 기준으로 넓혀나가면 될 것 같다.



그래서 PBR을 왜 써야 하는가?

텍스쳐 리소스를 중복으로 사용할 수 있어 재질 표현에 있어 리소스를 줄일 수 있고,

아티스트의 프로그래머 의존도(또는 게임 내 정해진 규칙?)가 적으며 결과물을 적당히 예측할 수 있고

다양한 조명 환경에서도 수정할 부분이 줄어든다.


그러면 NPR(Non Photorealistic Rendering, 비실사)은 어떻게 할까? 

NPR에 PBR을 효율적으로 썻다는 게임은 아직 못봤다. 불가능 하지 않을까.

NPR이란 말 그대로 비실사, 즉 물리적인 법칙에 맞지 않는 방식이니..


PBR의 구현


Reference Link

- wrapped diffuse

- model tool - Lighting

- 기본적인 반사 벡터

- Not All Materials Are The Same (Oren Nayer)

- BRDF

- GGX

- 감마보정(gamma correction)

model tool - Lighting

- 왜 물은 물처럼 보이는 걸까?

- 기본적인 반사 벡터


- 유니티의 라이팅이 안 이쁘다구요? (A to Z of Lighting)

- Game Development Forever, Oren-Nayar Reflectance Lighting Model

- Game Development Forever, Wrapped Diffuse

- 포프 TV, 물리기반 렌더링

- wikipedia, Diffuse reflection

- Diffuse reflection, Ambient light, Specular Reflection

- Oren Narya shading

- 물리 기반 셰이더의 이해

- The Comprehensive PBR Guide by Allegorithmic

- 렌더링 기법 고찰과 PBR 물리기반 렌더링

- Ambient Light, Diffuse Light, Specular Reflection

- Specular BRDF Reference

- SIGGRAPH 2013 Course : Physically Based Shading in Theory and Practice

- 모바일에서의 물리 기반 셰이딩

- Physically Based Rendering 기초

- Physically Based Shading at Disney

- The Technical Art of Uncharted 4

- NDC2015, 물리기반렌더링 지난 1년간의 경험

- 물질의 광학적 특성

- The Comprehensive PBR Guide by Allegorithmic vol-1, vol-2

- BRDF 기반 사전정의 스킨 셰이더

- UDK로 물리 기반 셰이더 만들기

- 구세대 엔진 신데렐라 만들기 PPT, 영상

- SH & PRT (Kasastudy)

- 물리기반셰이더의 허와 실

- Physically Based Real-time Rendering for Artists

- 언리얼 엔진 4 렌더러 활용하기

-

Posted by 붕대마음

최근에 달린 댓글

최근에 받은 트랙백

글 보관함