KoreanFoodie's Study

[OpenGL ES] 3강 : 모델링, 폴리곤 메시, 표면 법선(Surface Normal), 정점 법선(Vertex Normal) 본문

Game Dev/OpenGL ES

[OpenGL ES] 3강 : 모델링, 폴리곤 메시, 표면 법선(Surface Normal), 정점 법선(Vertex Normal)

GoldGiver 2023. 4. 11. 21:02
이 강의는 유투브에 무료로 공개되어 있는 한정현 교수님의 컴퓨터 그래픽스 강좌를 정리한 글입니다. 자세한 내용은 강의를 직접 들으시거나 을 구입하셔서 확인해 보세요. 강의 자료는 깃헙 링크에 올라와 있습니다.

요약 :

1. 그래픽스에서는 물체를 폴리곤 메시의 조합으로 표현한다. 이때 폴리곤으로는 일반적으로 삼각형을 사용한다.

2. 폴리곤 메시들의 정점 좌표와 Normal 은 Vertex Array 의 형태로 저장한다.

3. 표면 법선(Surface Normal)은 폴리곤 메시 삼각형의 Normal 벡터이며, 정점 법선(Vertex Normal) 은 특정 Vertex 에서의 Normal 벡터이다. 매끈한 물체를 표현할 때는 Vertex Normal 이 매우 유용하다.

폴리곤 메시 (Polygon Mesh)

폴리곤 메시는 리얼타임 렌더링에서 사용되며, 각 메시의 꼭짓점들은 실제 오브젝트를 표현했다기 보다는 샘플링을 한 대략적인 정도를 표현한다.
 

실시간 그래픽스에서는 위와 같이 삼각형 모양의 폴리곤 메시를 주로 사용한다.
 

폴리곤 메시의 꼭짓점 갯수는 resolution 또는 LOD(level of detail) 로 묘사된다. 꼭짓점 갯수가 많을 수록, 현실 객체와 가깝게 부드러운 처리가 가능할 것이다. 하지만 대신 그만큼 연산을 많이 필요로 하게 된다.
 

그렇다면 컴퓨터는 이러한 꼭짓점들을 어떻게 저장할까?
한 가지 방법으로는 Non-indexed Reprsentation 이 있다. 즉, 각각의 꼭짓점을 그냥 배열에 나열한 다음, 3개씩 묶어 각 폴리곤 메시 삼각형에 대응시키는 방식이다.
하지만 위 방법을 사용하면, 폴리곤 메시들이 공통으로 사용하는 꼭짓점들이 중복해서 저장된다는 단점이 있다.
 

그럼 어떻게 해야 위의 중복을 잘 처리할 수 있을까?
한 가지 방법으로는, vertex array 에 모든 꼭짓점을 저장한 후, 각각의 vertex 의 index 를 조회하는 index array 를 따로 두는 것이 있다. index array 는 vertex 에 대한 정보를 전부 담는 것이 아니라, 대응되는 index 를 vertex array 로부터 체크하기만 하면 된다!
 
 

표면 법선 (Surface Normals) 과 정점 법선 (Vertex Normal)

Surface Normal, 한국어로 표면 법선에 대해 알아보자.
꼭짓점 <p1, p2, p3> 로 이루어진 삼각형이 있을 때, 해당 삼각형의 법선 벡터는 어떻게 알 수 있을까?
일단, p1->p2 를 v1 벡터로 정의하고, p1->p3 를 v2 벡터로 정의한다. 그럼 v1 x v2 는 위 그림에서 p1으로부터 뻗어나온 벡터처럼 나올 것이다(법선 벡터는 유닛 벡터로 만들어야 함).
한 가지 기억해야 할 것은, p1, p2, p3 가 시계 반대 방향으로 정의(Counter-Clockwise ; CCW)되었다는 것이다.
 

만약 꼭짓점이 위 그림과 달리 <p1, p3, p2> 순으로 나열되었다면 어떻게 될까?
그럼 벡터 v1 은 p1->p3 가, v2 는 p1->p2 가 되어 오른손 법칙을 사용하면 법선 벡터가 구를 뚫고 들어가는 방향으로 나올 것이다. 즉, 표면 법선은 꼭짓점이 어떤 순서로 정의되었는지에 따라 방향이 달라진다.
그래픽스에서는, 표면 벡터가 물체의 바깥쪽을 향해 있어야 한다. 그러므로 <p1, p3, p2> 처럼 시계 방향으로 꼭짓점이 정의된 녀석이 아닌, <p1, p2, p3> 처럼 반시계 방향으로 꼭짓점이 정의된 폴리곤 메시가 필요하다!
 

위 그림을 보면, 삼각형 t1 은 (0, 1, 2), 즉 <p, q, r> 순으로, 삼각형 t2 는 <s, q, p> 순으로 정의된 것을 확인할 수 있다(반시계 방향).
 

위에서는 triangle normal 을 알아봤는데, 사실 더 중요한 건 vertex nomal 이다. 매우 매끈한 물체의 노말을 구하기 위해선,  폴리곤 메시의 노말로는 정보가 불충분할 수 있기 때문이다. vertex normal 은 특정 꼭짓점에서의 normal 을 의미한다.
vertex normal 은 비교적 간단히 구할 수 있는데, 바로 '해당 vertex 를 이용하는 모든 삼각형들의 노말'을 더한 다음, 이를 단위 벡터로 만들어 주면 된다(크기로 나누기)!
 

폴리곤 메시와 관련 데이터들은 마야 같은 프로그램으로 생성되어 전달된다.
export 는 다른 프로그램에 import 하기 적절한 형태로 데이터를 저장하는 것을 의미한다. 유명한 확장자 형식으로는 .obj 가 있다.
 

낮은 해상도의 구를 .obj 파일이 어떻게 표현하는지 한 번 보자. 위의 메시는 26개의 꼭짓점과 48개의 삼각형으로 이루어져 있다. 
제일 왼쪽에는 각 꼭짓점의 좌표 배열이, 중앙에는 각 꼭짓점에 대한 vertex normal 이, 제일 오른쪽은 각 삼각형들의 꼭짓점 좌표가 index array 형태로 표현이 되어 있다.
첫 번째 face 는 index 1, 2, 3 을 사용하는데,  위 그림의 왼쪽에 빨간 색으로 그려진 삼각형을 표현한다고 이해하면 된다!
 

위 그림은 실제 런타임에서 메시 정보를 import 할 프로그램이 위에서 전달받은 정보를 어떻게 저장할지 조금 더 깔끔하게 정리한 것이다.
position 은 vertex array 의 정보를, normal 은 vertex normal 의 정보를 갖고 있다.
마지막으로, index array 는 각 삼각형의 꼭짓점 좌표를 index 의 형태로 저장하는데, 위의 메시는 총 48개의 삼각형이 있으므로, 48 * 3 = 144 길이의 index array 가 생성된 것이다!

 
Comments