컴퓨터 그래픽스에서 물 구현 및 물방울, 크리스탈 구현 등 - 1 (정반사, 난반사, 노멀맵) - Whitmem
컴퓨터 그래픽스에서 물 구현 및 물방울, 크리스탈 구현 등 - 1 (정반사, 난반사, 노멀맵)
그래픽 개발
2025-09-14 15:49 게시 484fb5888c3c3a3603b1

0
0
21
이 페이지는 외부 공간에 무단 복제할 수 없으며 오직 있는 그대로 게시되며 부정확한 내용을 포함할 수 있습니다. 법률이 허용하는 한 가이드 라인에 맞춰 게시 내용을 인용하거나 출처로 표기할 수 있습니다.
This page is not to be distributed to external services; it is provided as is and may contain inaccuracies.
이번 프로젝트에서는 다양한 3D 그래픽스의 그래픽 처리 방법을 공부하고 Whitmem 포트폴리오에 적용하는 것을 목표로 하였습니다. 해당 웹 사이트는 리소스를 제법 사용합니다. 3D 그래픽스를 사용하기 때문에 그래픽 사용량이 제법 높습니다, 간단한 스크린샷은 아래와 같습니다.
기본적으로 컴퓨터에서 현실 세계에서의 빛 반사를 시뮬레이션하기 위해서는 어떤 광원의 입사광이 표면에 무수히 반사되어 사람의 눈에 들어오면 됩니다. 컴퓨터에서 할 일은 빛은 무한히 이동하며 표면에 부딪힌 경우 표면의 반사 벡터를 기준으로 반사하게끔 구현하면 됩니다. 이 과정에서 표면의 설정, 예를 들자면 표면의 색상, 즉 흡수 색상, 반사 색상, 반사 정도를 모두 시뮬레이션하면 됩니다.
여기서 중요한 점은 물체 표면의 법선 벡터입니다. 영어로는 Normal Vector 라고 부릅니다. 어떤 입사광이 이동하다가 표면에 부딪히면 어떤 기준으로 반사를 해야합니다. 그 기준을 정하는 벡터라고 볼 수 있습니다. 입사광은 법선 벡터를 기준으로 반사하여 이동해야 합니다. 이러한 과정을 무한히 반복하다가 사용자의 눈에 들어오는 색상을 시뮬레이션해야 합니다. 하지만 여기서 문제가 발생합니다. 현실 세계에서는 반사의 강도에는 제한이 없으며 물체가 다양할 수록 반사해야하는 횟수는 늘어납니다. 횟수가 늘어날 수록 반사 정도를 예측하기 힘들어지며 컴퓨터에서는 일일이 무한한 벡터를 이동시키며 반사시키고 최종적으로 사용자 눈(플레이어)에 들어오는 빛 벡터를 감지해야 합니다. 이것을 우리는 레이트레이싱이라고 부릅니다. 광선을 일일이 모두 추적하며 결과적으로 눈에 들어오는 지점의 픽셀에 색상을 반영하는 것이라 볼 수 있습니다. 물론, 레이트레이싱은 필요에 따라서 최적화 기법을 적용하고 있겠지만요. 실시간 렌더링에는 매우 적합하지는 않습니다. 영화, 매우 실사적인 처리가 필요한 부분에서야 레이트레이싱을 제한 적용할 수 있겠으나, 사실상 좋지는 않습니다.
따라서 게임과 같은 실시간 렌더링을 요구하는 컴퓨터 그래픽스에서는 실제 빛 연산과 유사한 계산 모델들을 사용하며, 미리 계산되거나 연산된 빛 데이터를 사용하기도 합니다. 그렇게하여 실제 반사되는 것 처럼 구현하기도 하고, 다양한 꼼수를 적용하여 3D 그래픽스를 구현하는 것이 오늘날의 대부분 게임이라고 볼 수 있겠습니다. 겉으로 보기에는 그럴싸 하지만 실제 연산 결과는 우리가 살아가는 현실을 비슷하게 모방할 뿐입니다.
위 사진과 같이, 사람 눈에 들어오는 벡터를 감지하는 것이 아니라, 표면의 반사 벡터와 입사 광간의 어떤 연산을 통해 해당 지점의 색상을 바로 파악해내는 모델을 사용할 수도 있습니다. 이런 모델은 이미 과거 그래픽스의 선두 개발자들이 공표해둔 기법들을 이용하는데 대표적으로 퐁 쉐이딩 모델이 있습니다. 제 사이트에 구현한 모델은 퐁 쉐이딩 모델을 베이스로 이용하고 있는데, 그 과정에 대해서 자세히 설명합니다.
기본적인 아이디어
우선 현실 세계의 빛과 최대한 비슷하게 생각하기 위해서 3차원 공간 내 특정 지점 p1에 광원이 존재하고, 어느 한 위치에 표면이 존재한다고 가정하겠습니다. 표면은 단순 면으로 꺾이지 않은 평면을 나타낸다고 가정하겠습니다. 이 때 광원이 표면의 지점을 가르키는 방향 벡터, 즉 입사 벡터와 표면의 법선 벡터간의 코사인 값을 구합니다.
표면의 법선 벡터는 표면위의 정점 어디에서나 동일합니다. 따라서 표면위의 정점에서 광원의 좌표를 빼주면 알아서 광원에서 표면위 한 점으로 향하는 입사 벡터가 완성됩니다.
LightToSurfacePoint=SurfacePoint-LightPoint
예를 들어, 아래 그림과 같이 입사광과 법선 벡터가 45도 각도를 하고 있을 때 코사인 값은 약 0.70 입니다.
입사광과 법선 벡터가 수직인 관계에서는 코사인 값은 약 0 입니다.
입사광이 법선 벡터와 동일한 관계에 있을 때에는 코사인 값이 약 1입니다.
즉 입사광과 법선 벡터간의 내각도의 코사인 값은 해당 표면의 빛 세기로 사용하기 적합한 값임을 알 수 있습니다.
원 구가 존재한다고 가정할 때, 위 계산 식을 통해 쉐이더를 적용하면 아래와 같은 결과가 도출됩니다.
이것은 기본적으로 물체가 띄는 Diffuse 색상이라고 볼 수 있습니다.
어느 방향에서 보든지 빛에 가까운 부분이 제일 밝아집니다. 기본적인 방법들은 모두 코사인 계산을 통해 빛과 제일 가까운 표면을 밝게, 먼 표면을 어둡게 표현할 수 있습니다. 물론, 거리에 따른 감쇠는 논외로 합니다.
정 반사광
다음으로는 정반사광 입니다. 정 반사광은 빛이 반사되어 우리 눈에 들어오는 부분을 의미합니다. 즉 빛이 반사되는 방향이 우리가 바라보는 눈의 방향에 딱 맞아 들어오는 경우 물체가 밝게 빛나는 모습을 표현합니다. 흔히 쇠 구슬과 같이 빛이 반사성이 높은, 또는 거울과 같은 물체에서 발생합니다 . 이를 실시간 렌더링에서 구현하기 위해 먼저 빛의 반사벡터와 카메라간의 내각에 대한 코사인을 구합니다. 그러면 빛의 반사벡터가 카메라의 방향벡터와 일치할 때 내적이 1로 최댓값이 되는 계산 값을 구할 수 있습니다.
즉 빛이 입사하여 반사된 반사 벡터와 카메라 간의 내적을 구하면 됩니다. 물론 카메라의 벡터와 반사 벡터는 모두 표면에서 바깥으로 향하는 단위 벡터여야 합니다.
그러면 카메라가 바라보는 방향에 따라 조금씩 움직이는 것 같은 정반사광을 구현해 낼 수 있습니다. 다만, 정반사광의 강도가 세질수록 흐릿한 효과는 적고 면적도 적어집니다. 이를 구현하기 위해 정반사광 세기에 n 제곱을 하여 흐릿한 부분의 경계는 줄이고 강도를 세지게 합니다.
노말 맵
아무튼 위 계산들은 모두 객체의 노말 벡터의 영향을 받고 있습니다. 하지만 컴퓨터 게임이나 실시간 렌더링에서는 아직도 한 가지 문제가 존재합니다.
위 사진은 3D 소프트웨어에서 각 버텍스의 법선 벡터를 나타낸 것 입니다. 당연히 모든 빛 연산은 각 표면의 법선 벡터와 연산을 수행합니다. 예를 들어 현실에서 땅, 해안가 모래를 표현하기 위해서 수많은 모래, 땅의 재질을 표면에 구현해야 합니다. 즉 굴곡이 생길때 마다 반드시 정점 하나가 생겨야 하고, 정점 개수가 많아질수록 더 자세한 객체의 재질을 나타낼 수 있게 됩니다.
하지만 객체의 버텍스가 늘어나면 늘어날수록 3D 실시간 연산에서 시간이 기하급수적으로 올라간다는 문제가 발생합니다. 결국 광원과 표면의 법선 벡터를 통해 어떤 빛 연산을 하나 하나 수행해야 하기 때문입니다.
게다가, 해안가 모래 같은 경우는 멀리서 보는 경우 그 재질을 제대로 인식할 수는 없습니다.
즉 멀리서 보기 위해서 이런 표면 객체를 수 없이 정점으로 나누고 굴곡을 생성하는 것은 매우 비효율적인 방법입니다. 따라서 우리는 이런 경우에 법선 맵이라는 꼼수를 사용합니다. 흔히 영어로는 Normal Map 이라고 부릅니다.
위 이미지를 노말 맵이라고 부릅니다. 노말 맵은 보통 파란색 또는 초록색 계열을 띄는데, 이미지 색상 R,G,B 에 각각 방향 X,Y,Z 벡터를 담아둔 것입니다. 해당 픽셀에 대한 법선 방향 X,Y,Z 를 이미지에 담아둔 것 입니다.
즉 평면상에 이미지를 씌워 이미지 픽셀로 법선 좌표를 읽어와 가짜 법선 벡터와 실제 빛 연산을 수행합니다. 기본적으로 픽셀이 몇 천개 있는 것 보다 텍스처에 담아 이렇게 처리하는 것이 속도도, 공간상 성능이 매우 향상됩니다.
위 평면은 정점 4개지만 노말 맵을 적용하여 빛의 방향에 따라 아래와 같이 연산되는 것을 확인할 수 있습니다.
즉 물 구현을 하기 위해서는 이러한 기본 요소를 활용하여 랜덤 효과, 반사 효과, 굴절 효과를 적절히 활용하면 손 쉽게 구현할 수 있습니다. 반사 효과, 굴절 효과, 환경 맵핑에 대해서는 다음 공부 기록에 작성하겠습니다.
댓글 0개
댓글을 작성하는 경우 댓글 처리 방침에 동의하는 것으로 간주됩니다. 댓글을 작성하면 일회용 인증키가 발급되며, 해당 키를 분실하는 경우 댓글을 제거할 수 없습니다. 댓글을 작성하면 사용자 IP가 영구적으로 기록 및 부분 공개됩니다.
확인
Whitmemit 개인 일지 블로그는 개인이 운영하는 정보 공유 공간으로 사용자의 민감한 개인 정보를 직접 요구하거나 요청하지 않습니다. 기본적인 사이트 방문시 처리되는 처리 정보에 대해서는 '사이트 처리 방침'을 참고하십시오. 추가적인 기능의 제공을 위하여 쿠키 정보를 사용하고 있습니다. Whitmemit 에서 처리하는 정보는 식별 용도로 사용되며 기타 글꼴 및 폰트 라이브러리에서 쿠키 정보를 사용할 수 있습니다.
이 자료는 모두 필수 자료로 간주되며, 사이트 이용을 하거나, 탐색하는 경우 동의로 간주합니다.