Daily Life of BlueRose

컴퓨터 & 코딩 공부/컴퓨터 그래픽스 & 언리얼 엔진

컴퓨터 그래픽스 - 모델링(폴리곤 메시, 정점(버텍스), 노멀(법선)의 관계)

푸른로즈 2024. 9. 6. 16:46
728x90

여는 글

언리얼 엔진이 무료화되고 얼마 지나지 않아 엔진을 다루는 방법을 배워보려고 고군분투했던 때가 있었습니다.

 

언리얼 엔진의 기본강의로 머티리얼이 있었는데요. 버텍스의 개념을 몰라서 상당히 헤맸던 기억이 납니다. 머티리얼을 생성하고 다룰때마다, 버텍스 셰이더가 어쩌고, 픽셀 셰이더가 어쩌고... 버텍스의 상대 좌표계의 Y축 값을 기준으로 값이 낮아질 수록 알파값을 높이네 어쩌네 하는 등....

 

버텍스, 노멀의 개념을 알면 크게 어렵지 않았겠지만, 당시엔  버텍스나 노멀이 어떤 개념인지 모르는 상태로 무작정 머티리얼 작성법 강의를 듣고 있던터라, 학창시절 수학 공식을 무작정 외우는 느낌이 들어서 영 와닿지가 않더라구요.

 

특히, 꼭지점, 법선 등의 한글 용어로 중고등학교 수학을 배워온 저로서는 버텍스, 노멀 등의 용어가 무엇을 지칭하는 지 몰라서 많이 힘들었습니다.

 

 

폴리곤 메시

폴리곤 메시를 사용하는 이유

각종 개체를 표현함에 있어, 가장 자연스럽게 그래픽을 표현하는 방법은 방정식을 이용하여 온전히 표현하는 방식이겠지만 이는 상당한 그래픽 처리량을 필요로 합니다. 가령 구를 표현하는 방법은 음함수를 사용하는 방법입니다만은, 일반적으로 이 방식은 상당히 비용효율성이 떨어지므로 폴리곤 메시를 사용하게 됩니다.

 

아울러 폴리곤 메시를 사용하는 이상 아무리 정교해보여도 근사적 표현법이라는 사실을 우리는 인식해야합니다. 이는 정점노멀을 계산하는 등 작업을 수행할 때, 일반적인 수학적 계산법과는 달리 접근해야 함을 의미합니다.

 

폴리곤 메시의 사용

게임에서의 폴리곤 메시는 삼각형을 사용하는 것으로 잘 알고 있지만, 모델링 분야에서는 사각 폴리곤을 사용합니다. 이렇게 사각 폴리곤으로 만든 모델링은 게임에서 사용할 때는 절반으로 갈라서 삼각형 폴리곤 메시로 변경하여 사용합니다.

 

폴리곤 메시의 해상도

해상도(resolution/level of detail)라고 하면 일반적으로 화면의 픽셀 수로 받아들이지만, "메시의 해상도"라는 표현은 정점의 개수를 의미합니다. 정점(버텍스)이 적으면 해상도가 낮다고 표현합니다.

 

폴리곤 메시의 프로그램 속 표현방법

폴리곤 메시를 표현할 때는 정점의 위치를 순서대로 나열하여 상호간 선을 이어주어 면이 생성되도록 프로그래밍 합니다.

 

가장 간단하게는 삼각형 하나마다 순서대로 정점의 위치를 전부 나열하는 방법이 있겠습니다만은, 하나의 정점은 여러개의 삼각형에서 동시에 사용될 수 있는 만큼 하나하나 모두 나열하는것은 비효율적입니다. 따라서 일반적으로는 정점 정보를 중복으로 입력할 필요가 없도록 정점의 목록을 추출하여 중복값을 제거한 후, 인덱스(순번표)로 만듭니다. 이를 통해 삼각형의 표현 시 각 정점의 정보는 인덱스를 활용하여, 정점 정보를 중복으로 사용하지 않도록 할 수 있습니다.

 

언뜻, 숫자 3개(x,y,z) 정도인데 이렇게 굳이 중복값 제거를 해야 하는가 싶을 수 있겠지만, 우선 하나의 메시에도 수백 개 이상의 정점 정보가 포함되는 경우도 있으며, 정점 정보에는 위치만 포함되는 것이 아니라 필요에 따라 투명도, 법선 정보 등 다양한 정보가 포함되므로 실제로는 상당한 데이터량을 차지할 수 있습니다.

 

 

표면노멀

노멀(Normal)

일반적으로 정상이라고 번역되는 단어지만, 수학에서는 법선이라는 뜻이 있습니다. 법선이란 어떤 표면에 수직인 벡터를 의미하는데요. 그래픽스에서는 이러한 법선정보를 통해 주변 빛과 물체의 상호작용을 계산하는 등 계산 작업을 위한 토대가 되므로 중요합니다. 이때 일반적으로 그래픽스에서는 법선은 물체의 중심에서 바깥 방향으로 생성됩니다.

 

삼각형 노멀(Triangle Normal)

삼각형을 이루는 세 꼭지점 중, 노멀을 구할 점 하나에서 나머지 둘로 향하는 벡터 2개의 벡터곱이 곧 삼각형 노멀이 됩니다. 다만 그래픽스에서는 단위벡터로 표현하므로, 벡터곱을 자신의 크기로 나눠 단위벡터화 해주는 작업이 필요합니다. 아울러 물체의 바깥 방향을 향하도록 법선을 생성해야 하므로, 벡터곱의 순서는 아래와 같이 반시계 방향으로 곱해야 합니다.

 

삼각형 노멀의 값 :  (v1 ㆍ v2) / || (v1 ㆍ v2) ||
  * v1 : 법선을 생성할 정점 → 반시계 방향으로 가까운 정점
  * v2 : 법선을 생성할 정점 → 반시계 방향으로 멀리있는 정점

 

정점 노멀(Vertex Normal)

게임 엔진을 사용하면서 삼각형 노멀에 대해 들어본적이 있으신가요? 제 경우에는 애초에 그런 용어가 있었는지 충분히 생각해볼만큼 사용이력이 길지는 않으나, 짧은 시간동안에도 정점(버텍스) 노멀에 대하여는 많이 들어보았으나 삼각형 노멀은 들어본 기억이 딱히 없네요. 즉, 실제 컴퓨터 그래픽스에서 중요한건 정점 노멀이란겁니다.

 

삼각형 노멀이 해당 삼각형에 대해서 수직인 만큼, 해당 삼각형 만을 대표하는 법선이라고 본다면, 정점 노멀은 해당 정점이 곡면상에 있다고 가정했을 때(메시는 근사적 표현이므로 곡면이 아님), 해당 정점과 접하는 평면에 대한 법선이라고 볼 수 있습니다.

 

정점 노멀을 산출하는 방식은 여러가지가 있지만, 일반적으로는 해당 정점과 접한 모든 삼각형의 삼각형 노멀의 평균을 내는 것이 하나의 방법이 될 수 있습니다.

반응형