PBR (Physical base rendering)

 https://namu.wiki/w/%EB%AC%BC%EB%A6%AC%20%EA%B8%B0%EB%B0%98%20%EB%A0%8C%EB%8D%94%EB%A7%81


https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=fah204&logNo=221587912963


https://github.com/JJJohan/PBR/blob/master/PBR/PBR.shader


https://lifeisforu.tistory.com/306


PBR-Shaders/PBRLib.cginc at master · penumbra23/PBR-Shaders · GitHub

UE4, Unity 5, Frostbite, CryEngine 등과 같은 유명한 상용엔진들로 만든 게임들은 이제 기본적으로 PBR( Physically-Based Rendering )을 택하고 있습니다. 많은 AAA 급 타이틀들이 PBR 의 우수함을 증명했습니다. 우리나라야 이제 게임 기술 후진국이 되어 가고 있기 때문에( 주관적 판단임 ) 인기가 시들하고 개념을 모르는 사람도 많지만, 카더라 통신에 의하면 중국마저도 다들 PBR 에 꽂혀 가고 있다고 하더군요.


아티스트가 PBR 을 처음 접하면 매우 어렵습니다. 일종의 라이팅 패러다임의 변화이기 때문입니다. 그러나 조금 익숙해지면 기존의 라이팅 모델들보다 훨씬 적은 매개변수만을 사용해 라이팅을 제어할 수 있어서 PBR 을 선호하게 됩니다. 그리고 라이팅 환경이 바뀌어도 일관된 결과를 보여 준다는 점에서 매우 매력적입니다.


하지만 프로그래머에게 있어서는 지옥의 시작입니다. 모르는 단어들도 수두룩하게 나오는 데다가, 비용도 비싸기 때문에 최적화에 어려움을 겪게 됩니다. 게다가 자료도 그리 많지 않은 편입니다. 구글링을 해 보시면 알겠지만, PBR 구현에 대해 명료하게 다루는 글들이 많지 않습니다. 특히 PBR 구현에 있어 대세인 Cook-Torrance 에서 사용하는 GGX 라는 것은 검색해도 개념을 설명하는 글들을 찾기 힘듭니다. 


그래서 이 문서에서는 GGX 라는 것이 어떻게 나오게 된 것인지 가이드를 제공하고자 합니다. GGX 에 대해서 파고 들어 설명하는 글은 아닙니다. 이것을 이해하기 위해서 봐야 될 문서를 정리했다고 생각하시면 됩니다( 제가 실무를 통해 직접 구현해 본 것이 아니기 때문에 이해도가 낮습니다 ).


Cook-Torrance



참고 자료 : Cook-Torrance

참고 자료 : Specular BRDF Reference


우리가 기존에 다루었던 라이팅 모델들은 대부분 어느 정도는 미세면( microfacet )에 대해서 고려하고 있습니다. 이 표면의 거칠기를 어떻게 근사계산하느냐에 따라서 여러 가지 모델들이 나뉘게 됩니다. 이 거칠기에 의해서 reflectance model 이 결정되는데요, 아마 PBR 을 검색해서 이 문서를 찾으실 정도의 분들이라면 BRDF( Bidirectional Reflectance Distribution Function )의 개념에 대해서는 이해하고 계실 것이라고 가정합니다. 


만약 BRDF 가 뭔지 모르겠다는 분들이 있다면 그것부터 공부하고 오시는 것이 좋을 것이라 생각합니다. 그렇지 않다면 이 문서를 더 봐도 무슨 말을 하는지 이해하기 어려울 수 있습니다. 어쨌든 미세면 개념은 매우 중요합니다. 그리고 이와 관련한 많은 쉐이딩 이론이 존재합니다. 하지만 여기에서는 Cook-Torrance 모델에 대해서만 다루도록 하겠습니다.


Cook-Torrance 는 Robert L. Cook 과 Kenneth E. Torrance 에 의해 개발된 라이팅 이론입니다. 이는 Phong 이나 Blinn-Phong 보다는 좀 더 물리적인 현실감을 제공합니다. 이 모델은 오브젝트의 표면이 매우 많은 미세면에 의해 구성되어 있다고 가정합니다. 이 미세면들은 개별적으로 들어 오는 빛을 반사하게 되는데요, 이것이 거치냐 매끄럽냐에 따라서 반사하는 패턴이 달라지게 된다는 것입니다. 물론 실제로 그것을 다 계산해 주면 좋겠지만, 컴퓨팅 파워 및 메모리의 부족으로 인해 분산함수를 사용하게 됩니다.


Cook-Torrance 에서는 대부분의 쉐이딩 모델과 마찬가지로 ambient, diffuse reflection, specular reflection 항을 사용합니다. 그 중 diffuse reflection 을 위해서는 Lambert reflection( N dot L )을 사용합니다. 대부분의 계산은 specular reflection 에 초점을 맞추고 있습니다. 이 모델의 최종 공식은 다음과 같습니다.



여기에서 k 는 diffuse 계수입니다. ( 1 - k ) 가 들어 가는 것은 에너지 보존을 위해서입니다. 그리고 rs 는 specular 항입니다.


이 specular 항은 다음과 같이 계산됩니다.



F 는 Fresnel 항이고, D 는 Distribution 항이고, G 는 Geometric shadow( Geometric attenuation ) 항입니다. 각 항에 대한 자세한 설명은 [ Cook-Torrance ]에서 확인하시기 바랍니다. 


이제 각 항에다가 어떤 공식을 넣느냐에 따라서 변종이 발생합니다. 그 변종들의 공식에 대해서는 [ Specular BRDF Reference ] 라는 기사에 잘 정리되어 있습니다. 이 중에 요새 GGX 가 대세라 하더군요. 


GGX?



참고 자료 : Microfacet Models for Refraction through Rough Surfaces


GGX 라는 것은 [ Microfacet Models for Refraction through Rough Surfaces ] 에서 처음 소개된 것으로 보입니다( 번역 : http://lifeisforu.tistory.com/352 ). 이 논문의 저자로 Kenneth E. Torrance 가 포함되어 있네요.


We also introduce a new microfacet distribution, which we call GGX, that provides a closer match for some of our surfaces than the standard Beckmann distribution function.


출처 : Microfacet Models for Refraction through Rough Surfaces


 

말 그대로 이 논문에서 새로운 미세면 분산 함수인 GGX 를 소개했습니다. 그런데 이 문서에서도 "GGX 가 뭐의 약자이다" 라는 식의 이야기는 없습니다. 그냥 제가 추측하기로는 shadow visibility 를 구할 때 G1 을 두 번 곱하게 되는데, 그래서 GG 가 아닐까 싶네요. X 는 eXtended multiply 정도의 느낌이랄까... 이것에 대해 정확하게 아시는 분이 있다면 댓글 달아 주시면 좋겠습니다.


PBR은 Physically Based Rendering의 약자로 물리적으로 그럴듯한 방법으로 빛을 모방하는 것을 목표로 하기 때문에 일반 Phong 이나 Blinn-Phong보다 현실적이다. 보다 좋게 보일 뿐만 아니라, 실제 물리를 바탕으로 근사치를 구하기 때문에, 조명을 보다 좋게 만들기 위해서 값싼 작업을 하지 않고도, 매개변수만으로 표면 결과를 조작할 수 있다. 이런 매개변수에 기반한 조작의 큰 장점중 하나는, 조명에 관계없이 잘 적용이 된다는 것이다.



PBR은 여전히 현실의 근사치이다. 그렇기 때문에 (물리 렌더링)Physical Rendering이라고 하지 않고 


(물리적 기반 렌더링)Physically Based Rendering이라고 하는 것이다. 이런 물리적 기반 렌더링이 이루지기 위해서는 다음 3가지 조건을 만족해야한다.



1. Be based on the microfacet surface model


2. Be energy conserving.


3. Use a physically based BRDF.



Microfacet model


PBR은 microfacet 이론에 기반한다. microfacet 이론은 표면을 아주 크게(microscopic scale) 봤을 때 모든 표면이 microfacet 이라고 불리는 매우 작은 반사되는 거울과 같다는 이론이다. Roughness 에 따라 얼마나 반사되는지가 상당히 차이가 많이 난다.




위 그림과 같이 거친 표면은 빛이 서로 완전히 다른 방향으로 반사된다. 반면 매끄러운 표면은 대부분 같은 방향으로 반사된다. 이렇듯 거친 표면은 빛의 반사가 흐리게 퍼지듯이 생길 것이고, 매끄러운 표면은 빛의 반사가 뚜렷하게 생길 것이다.



microscopic scale에서 봤을 때는 어떤 표면도 완벽하게 매끄럽지는 않다. PBR 모델은 이런 표면을 표현하기 위해서 roughness map이라는 것을 사용하고 픽셀마다 표면이 거친 정도를 나타낸다. 이 값을 가지고 Blinn-Phong Shading에서 사용된 half vector와의 각을 계산해서 각이 작을 수록(halfway vector와 가까울 수록) 빛의 반사가 뚜력하고 강할 것이고, 클 수록(halfway vector와 멀 수록) 빛의 반사가 흐리고, 퍼질 것이다. 



Energy conservation


Microfacet 근사법은 에너지 절약(Energy conservation)의 법칙을 따른다. 에너지 절약이란, 나가는 에너지는 들어오는 에너지를 초과해서는 안된다는 것이다. 위 이미지를 보면 roughness가 커질 수록 specular의 영역이 증가하는 것을 볼 수 있다. 이때, specular의 강도가 각 픽셀마다 동일하다면 roughness가 커질 수록 더 많은 에너지를 방출하게 되어 에너지 절약 원칙에 어긋나게 된다.



이런 에너지 절약 원칙을 나타내기 위해서는 diffuse와 specular의 뚜렷한 구분이 필요하다. 빛이 표면을 닿았을 때 refraction(굴절)과 reflection(반사) 두 종류로 나뉜다. reflection은 빛이 표면을 닿았을 때 바로 반사하고, 표면 안으로 들어가지 않는다. 이것을 specular lighting이라고 한다. 그리고 refraction은 빛이 표면에 닿았을 때 표면에 들어가서 흡수된다. 이것을 diffuse lighting이라고 한다.



하지만, 빛의 흡수는 빛이 표면에 닿자마자 이루어지는 게 아니라, 물체의 입자와의 충돌에 의해서 서서히 흡수 되는 것이다. 이 입자들이 빛과 충돌 할 때마다 빛을 흡수한다.







1. 개요[편집]

물리 기반 렌더링(Physically Based Rendering, PBR) 또는 물리 기반 셰이딩(Physically Based Shading, PBS)은 표면의 재질에 따른 빛의 반사가 물리적으로 어떻게 이루어지는지를 시뮬레이션해서 그래픽을 표현하는 기법이다.

2. 특징[편집]

기본적으로 물체는 고유의 색을 가지고 있다. 그리고 현실에서는 극히 제한적인 경우를 제외하면 빛에 의하여 난반사(Diffuse)와 정반사(Specular)라는 현상이 일어나는데, 정반사는 빛이 매끄러운 표면에서 평행하게 반사되는 현상이고 반대로 난반사는 빛이 표면에서 평행하게 반사되는 것이 아니라 흐뜨려져 반사될 때 나타나는 현상이다.

여기서 입사광이 흰색이라는 전제하에 보통 정반사가 일어나는 표면은 색을 잃어 흰색으로 빛이 맺혀지기 마련인데, 특별히 금속의 경우는 정반사에서 기본색을 유지한다. 그리고 물체의 거칠기(Roughness)에 따라 정반사와 난반사의 비율이 바뀌는데, 보통 표면이 거칠수록 난반사의 비율이 커지고 반대로 표면이 매끄러울수록(Glossness) 정반사의 비율이 커진다.

여기까지가 사실상 PBR의 원리이자 핵심이다.[1] 즉 정반사와 난반사를 구체적으로 어떻게 계산하느냐에 따라 표면의 특성이 정해진다는 것을 이용한 재질 렌더링 방식을 PBR이라고 부른다.[2]

여기서 이 정반사와 난반사를 표현하는 방식에 따라 여러 방식의 워크플로우가 존재하는데 보통은 Metallic/Roughness와 Specular/Glossness라는 2가지 방식을 따른다. 이 둘에 대한 비교는 후술하겠다.

추가적으로 Specular/Glossness 방식에 대한 오해가 만연해 있는데, 사실 CG계에 PBR이란 개념이 구체적으로 등장하기 이전에도 스페큘러와 디퓨즈를 기반으로 한 매핑 방식은 존재했었다. 때문에 스페큘러 방식을 PBR이 아닌 레거시 렌더링이라고 구별하는 경우가 종종 있다. 이런 오해가 생긴 배경에 대해 설명하자면 당시 게임엔진에서는 메탈릭 기반 PBR의 Roughness에 해당하는 Glossness를 지원하지 않았기에 정반사와 난반사를 원하는 대로 조정하기가 쉽지 않아 디퓨즈맵에 있어서는 안 될 양감과 음영을 손으로 그려 넣고는 하였다(...). 이러한 방식은 당연하지만 PBR에 맞지 않으며 이는 게임엔진이 지원하던 셰이더의 문제였지 스페큘러 워크플로우의 문제는 아니었고 당시에도 이미 레이트레이싱 기반 오프라인 렌더러들은 지원하고 있었다. 현재 레거시 방식이라 언급되는 것은 스페큘러 워크플로우를 말하는 게 아니라 손맵이라는 방식을 의미한다.

기존의 엔진에 물리 기반 렌더링을 지원을 추가하는 일은 셰이더 효과 하나 추가하는 정도로 간단히 이루어진다. 언리얼 엔진유니티 엔진크라이엔진프로스트바이트 엔진 등의 상용 게임 엔진들의 최신 버전에서는 물리 기반 렌더링을 지원하고 있으며 최신 게임들의 그래픽 역시 물리 기반 렌더링을 활용해서 개발되는 추세다. 물리 기반 렌더링 방식이 기존의 레거시 렌더링으로 작업하던 그래픽 디자이너들에게는 생소하게 낯선 개념일 뿐 익숙해지면 오히려 레거시 렌더링보다 간결하며 그래픽 리소스를 줄이면서도 레거시 렌더링보다 사실적인 그래픽 구현이 가능하고 최적화에도 더 용이한 편이다.

2.1. Specular과 Metallic 워크플로우 비교[편집]

두 가지의 PBR 워크플로우를 간단히 비교하자면 다음과 같다.
구분
Specular/Glossiness
Metallic/Roughness
재질의 기본색
난반사(Diffuse) 텍스처
기본색(Base Color) 텍스처
재질의 반사광
정반사(Specular) 텍스처 (또는 값)
금속성(Metallic) 값
재질의 거칠기
매끄러운 정도(Glossiness) 텍스처 (또는 값)
거칠기(Roughness) 텍스처 (또는 값)

1. 빛은 재질의 표면에 흡수되어 해당 표면이 가진 색의 파장만을 다시 반사 시키는 데 이것을 난반사광 (Diffuse Lighting)이라고 한다.

스페큘러에서는 디퓨즈, 그리고 메탈릭에서는 베이스 컬러 혹은 알베도(Albedo)가 서로를 대응하는데, 기존 문서에서는 스페큘러 워크플로우에서 난반사를 추상적으로 구별 짓는다고 하지만 이는 속칭 손맵을 그리던 시절에서나 통용되는 이야기이고 기본적인 역할은 메탈릭의 알베도와 동일하다. 다만 금속성 재질의 경우 메탈릭 워크플로우에서는 금속의 색을 베이스 컬러에서 같이 취급하지만 스페큘러 워크플로우에서는 디퓨즈맵에서 금속의 색을 취급하지 않기 때문에 금속 부분은 검은색으로 통일된다.

2. 모든 표면은 색을 나타내는 난반사 외에도 빛을 받는 위치와 각도에 따라 어느 정도 빛 자체를 반사하며 이것을 정반사광(Specular Lighting)이라고 한다.

메탈릭 워크플로우에서는 해당 재질이 금속이냐 아니냐를 값으로 따지면 1과 0, 이미지맵으로는 흰색과 검은색으로 결정하는 Metallic이란 맵이 존재한다. 현실에서는 금속과 비금속으로 나누어지기 때문에[3] 당연하지만 중간값은 원칙적으로 허용해서는 안 되나 한 재질 안에 금속과 비금속이 같이 존재하여 서로 붙어있는 경우, 혹은 비금속이지만 일반적인 반사광으로는 표현이 힘든 재질을 표현하기 위해 임의로 메탈릭을 올려야만 하는 경우[4]를 위해 어쩔 수 없이 중간값을 남겨두고 있다.
반면 스페큘러 워크플로우에서는 금속 재질의 특성이 정반사에서 본연의 색을 유지한다는 원리에 기반하기 때문에 만약 금속 재질에 색이 존재한다면 정반사(스페큘러) 맵에 색을 지정하게 된다. 그리고 모든 물체는 스페큘러를 띠고 있기 때문에 기본적으로 어두운 회색을 유지한다.

3. 모든 표면은 거칠기(Roughness)를 가지고 있으며 거칠기 정도에 따라 표면의 반사 정도가 반비례하는 데 거칠지 않고 매끈할수록 마치 거울과 같은 전반사(Total Reflection) 성질을 띠며 표면이 거칠수록 그 반사의 선명한 정도가 줄어든다.

PBR에서는 표면의 거칠기 정도에 따라 해당 표면의 정반사성을 결정한다. 여기서 각 워크플로우에 따라 Roughness와 Glossiness로 구별되는데 사실 용어를 직역해보면 알겠지만 그냥 서로 반대되는 값을 가지고 있을 뿐 원리는 똑같다. 막말로 Glossiness맵을 포토샵에서 색 반전을 시키면 그대로 Roughness맵에 적용할 수 있다. 공통적으로 꼭 지켜야 할 부분은 Roughness와 Glossiness 둘 다 완전한 검은색이나 완전한 흰색은 존재하지 않는다는 점이다. 예외적으로 워크플로우와 관계없이 Smoothness라는 명칭의 맵을 사용하는 경우도 있는데 대표적으로 유니티 엔진이 있다.

이상 위의 3가지가 기본적인 재질에 대한 빛의 물리적 반사 현상을 시뮬레이션하는 가장 기본적인 부분이 변경된 것으로서 재질의 질감에 관련된 핵심 요소다.

각 방식에는 장단점이 존재하는데, 메탈릭 워크플로우는 기본적으로 메탈이냐 아니냐를 구별하기 때문에 다소 애매한 구석이 있는 스페큘러에 비해 접근이 쉽지만 소위 말하는 메탈릭 엣지라는 현상이 발생하게 된다. 메탈릭 엣지란 금속과 비금속이 겹쳐지는 부분에 뚜렷한 라인이 생기는 현상인데, 아무리 이미지에서 금속과 비금속의 영역이 칼같이 딱 맞아떨어지더라도 이미지 내부 보간이 발생하면 존재해서는 안 될 중간값이 발생해 버리고 이 중간값에 의해 해당 현상이 일어난다. 해결 방법은 금속인 부분과 그렇지 않은 부분을 완전히 분리하는 방법이랑 이미지 해상도를 무식하게 키워내는 방법, 혹은 금속과 비금속이 접하는 부분에 블러를 적용하여 금속과 비금속 사이를 자연스럽게 이어나가는 방법이 있다.

스페큘러 워크플로우는 금속이냐 아니냐라는 엄격한 구분을 짓는 것이 아니기 때문에 해당 문제에서 자유로우며 메탈릭에 비해 상대적으로 금속의 색을 컨트롤하기가 쉽고 심지어 정반사와 난반사가 다른 재질도 구현이 가능하다. 하지만 금속이냐 아니냐로 구별하는 메탈릭 방식에 비해 직관성이 떨어지며 다루어야 할 채널 수도 더 많기 때문에 접근성도 떨어지고, 이러한 단점에 의해 메탈릭에 비하면 사용하는 프로그램이나 유저가 상대적으로 적다.[5]

이 외에도 발광(Emissive), 불투명도(Opacity), 표면하산란(Subsurface Scattering), 굴절(Refraction), 왜곡(Distortion), 알베도(Albedo), 프레넬(Fresnel) 같은 기법도 추가로 들어갈 수 있으나 이것들은 다 기존의 레거시 렌더링 및 PBR에 모두 적용 가능한 것들이며 단지 부가적인 효과를 주는 요소들일 뿐이다.

2.2. 노멀 매핑과의 관계[편집]

물리 기반 렌더링이 노멀 매핑보다 발전된 기법이라고 잘못 알려진 경우가 있으나, 노멀 매핑과 물리 기반 렌더링은 전혀 다른 별개의 분야다.

노멀매핑은 노멀맵 및 범프맵 텍스처와 픽셀 단위 라이팅을 이용해 하이폴리곤 효과를 로우폴리곤에서 볼 수 있도록 한 기법이며, 물리 기반 렌더링은 난반사와 정반사를 기반으로 한 레거시 렌더링에서 사용된 표면의 재질감을 텍스처 방식에서 알고리즘 방식으로 대체하는 기술이다.

노멀매핑은 하이폴리곤의 음영을 로우폴리곤에 입히기 위한 기술이다. 이는 단지 로우폴리곤으로 만들어진 저퀄리티의 표면을 하이폴리곤과 동일한 고퀄리티의 표면과 같이 라이팅이 반응하게 만들어 줌으로써 세세한 디테일을 살려주는 역할일 뿐, 레거시 렌더링에서 물리 기반 렌더링으로 전환되는 재질 셰이딩의 대체와는 전혀 무관하다.

노멀 매핑 외에도 하이트맵을 이용해 이미지를 왜곡해서 시각에 따라 텍스처에 입체감을 주는 시차 매핑(Parallax Mapping)이나 시차 가려짐 매핑(Parallax Occlusion Mapping) 역시 레거시 렌더링 기법이 물리 기반 렌더링으로 대체되는 것과는 전혀 관계가 없는 별개의 기술이다.

노멀 매핑, 시차 매핑, 시차 가려짐 매핑 등은 물리 기반 렌더링과 동시에 사용 가능하며, 최신 게임들에서도 당연히 둘 다 동시에 사용되고 있다.

2.3. 레이 트레이싱과의 관계[편집]

노멀매핑과 물리 기반 렌더링의 관계처럼 물리 기반 렌더링보다 더 발전된 개념이 레이 트레이싱이라고 잘못 알려진 경우도 있다.

레이 트레이싱은 단어의 뜻 그대로 광선을 추적하는 기법이며 광원에서 뻗어나온 빛이 표면에 닿는 대로 여러 번 반사해서 글로벌 일루미네이션[6]을 비롯한 다양한 효과를 만들 수 있다. 레이 트레이싱을 사용하지 않는 현대의 실시간 그래픽에서는 별도의 계산으로 그림자를 만들어주지만 레이트레이싱을 사용한다면 빛이 닿지 않는 부분이 곧 그림자가 되므로 별도의 계산을 통해 그림자를 만들어 줄 필요가 없다. 그 외에도 현대 실시간 그래픽에서 표현하는 여러 가지 효과들을 조금 더 실제 빛의 반사효과와 비슷한 방식으로 구현도 가능하며 레이 트레이싱을 통해 여러 가지 효과를 만드는 것을 패스 트레이싱(Path Tracing)이라고 부른다.

하지만 위에서 언급된 노멀매핑과의 관계처럼 머티리얼이 레거시 렌더링에서 물리 기반 렌더링으로 전환되는 것과는 전혀 무관한 별개의 분야다. 레스터라이저(레이 트레이싱이 아닌 기존의 라이팅)에서 레이 트레이싱으로 전환되는 것은 라이팅의 동작 기법에 관한 것이고, 레거시 렌더링에서 물리 기반 렌더링으로 전환되는 것은 라이팅에 반응하는 표면의 재질을 결정하는 기법이다. 즉, "PBR보다 발전된 방식이 레이 트레이싱이다."라는 말은 완전히 틀린 말이다. 물론 성능이 무한대라면 광선 추적만으로 모든 재질을 표현할 수도 있다. 그럴 경우 텍스처를 기반으로 재질을 만들어내는 현대의 렌더링 기법이 완전히 사라지고 지오메트리를 매우 작게(모니터의 픽셀보다 훨씬 더 작게) 쪼개거나, 또는 복셀을 초고밀도(이 역시 모니터의 픽셀보다 훨씬 더 작게)로 만들거나, 아니면 전혀 다른 방식으로 예를 들어 원자 단위 등으로 3D 그래픽 구현한 다음 그 모니터의 픽셀보다 작은 각각의 표면(또는 원자 단위 등)마다 빛을 어떤 각도로, 어떤 파장을, 어떤 성질의 얼마나 반사할지의 정보를 모두 담고 있어야 한다. 하지만 이것은 애초에 말도 안 되는 발상이기 때문에 언급할 가치도 없다.


댓글

이 블로그의 인기 게시물

About AActor!!! "UObject" has no member "BeginPlay"

UNREAL Android build information

C++ 생성자 위임 (delegating constructor)