CS/그래픽스

[홍정모의 그래픽스 새싹코스 Part1] 퐁 쉐이딩으로 구 만들기

겜도리도리 2023. 12. 7. 14:15
반응형

앞서

이 포스팅은 홍정모의 그래픽스 Part1을 수강하고 작성한 내용입니다.

강의의 세부 코드는 첨부하지 않고, 결과와 이론 위주로 포스팅했습니다.

 

개요

퐁 쉐이딩(Phong reflection model)은 1975년 Bui Tuong Phong가 발표한 기술로, 광원에 따라 물체를 Ambient, Diffuse, Specular로 나눠 그리는 방법이다. 최근에는 훨씬 더 발전했기 때문에, 퐁 쉐이딩으로 물체를 그리는 것보다 더 실감 나게 그릴 수 있는 기술들이 많이 나왔다고 한다.

Ambient

ambient는 조명에 영향을 받지 않는 그 물체의 단순한 색상을 나타낸다. 따라서 조명이 없어도 ambient의 색깔이 기본적으로 나오게 되는데, 그래서 물리적인 사실과는 거리가 있다는 것을 숙지해야 한다.

ambient를 적용한 구는 위 이미지와 같다.

전 강의의 구와 큰 차이가 없는 모습이다.

Diffuse

Diffuse에서는 빛을 얼마나 받는지를 계산한다.

광원과 물체의 해당지점에서의 법선벡터가 이루는 각도가 작을수록 빛을 많이 받는 것이고, 반대로 각도가 클수록 빛을 적게 받게 된다.

지구의 예시를 보자. 위 이미지에서 (가) (나) (다)를 각각 비교했을 때 위도가 높을수록 해당 지점에서의 법선벡터와 햇빛의 각도가 커지기 때문에, 빛이 들어오는 양이 줄어든다. 따라서 적도부근인 위도가 가장 낮은 (다)에서 태양 고도가 제일 높아 들어오는 빛의 양이 많고 (반대로 법선벡터와 햇빛의 각도는 제일 작다), (가)에서 태양 고도가 제일 낮아 들어오는 빛의 양이 적다. (법선벡터와 햇빛의 각도는 제일 크다)


구현시에는 물체와 빛의 접점에서 물체의 법선벡터와 빛으로 향하는 벡터의 내적 값을 활용한다.

예를 들어 물체의 법선벡터를 A라고 하고, 빛의 광원으로 향하는 벡터를 B라고 하자.

A벡터와 B벡터의 사잇각(세타)가 커질수록 코사인 값은 1에서 점점 작아지다가 90도에서 0, 넘어가면 음수가 된다.

반대로 사잇각이 작아지면 코사인 값은 0에서 점점 커지다가 0도에서 1이 된다.

즉 0이나 음수일 때는 물체가 제대로 빛을 받고 있지 않은 상태이고, 양수일 때는 그 값이 커질수록 광원에 직격으로 빛을 받고 있음을 알 수 있다.

 

 

이를 코드로 구현하면 위와 같다.

왼쪽 이미지에서는 광원이 구의 위쪽에 있으므로 윗부분이 제일 밝고, 내려갈수록 어두워지는 것을 볼 수 있으며

오른쪽 이미지에서는 광원이 화면을 바라보는 기준에서 구의 왼쪽에 있기 때문에 왼쪽 부분이 제일 밝고, 퍼질수록 어두워지는 것을 확인할 수 있다.

Specular

Specular에서는 반짝거림을 계산한다. 광원이 들어왔을 때 매끈한 부분에서는 전반사가 일어나게 되는데, 관측 지점이 이 전반사가 일어나는 각도와 일치하면 그 부분이 반짝거리게 보인다.

Specular를 계산할 때는 전반사 벡터와 관측자가 바라보는 벡터와 방향만 반대인 벡터를 사용한다.

 

 

specular는 제곱한 값을 응용해서 효과를 얼마나 줄지 조절할 수 있는데, 그 값이 낮으면 위 이미지처럼 Diffuse와 별반 다르지 않아 보일 수 있으나...

 

그 값을 증가시켜주면 점점 그 영역이 줄어들어 차이점을 확인할 수 있다.

 

결과

 

Ambient와 Diffuse, Specular를 모두 합치면 위 이미지와 같이 광원에 따라 꽤나 사실적으로 보이는 구를 만들 수 있다.

반응형