그래픽스/DX11

DX11 - 쉐이딩(Blinn-Phong Shading)

뽀또치즈맛 2024. 10. 25. 15:03

 
 
쉐이딩은 조명과 재질의 상호작용을 고려해서 색을 결정하는 과정이다.
이때 vs에서 미리 색을 결정해서 ps에서 보간하는 방법이 있고,
쉐이딩 알고리즘 자체를 ps에서 하는 방법이 있다.
 
둘 중에 어느 것이 다 빠르나면,
픽셀수에 비해 vertex의 수가 훨씬 적기 때문에
vs에서 돌리는 것이 더 빠르다.
대신에 렌더링의 상세도는 조금 떨어질 것이다.
 
요즘에는 GPU가 많이 빨라졌기 때문에 
ps에서 돌리는 경우도 많다.
 
오늘은 ps에서 blinn-pong shading을 구현한다.
 

회전

 
회전을 할 때는 어떤 회전 축에 대해 회전할 것인지 정해야한다.
DX는 왼손 좌표계를 사용하고 있기 때문에 Y축을 기준으로 회전시킨다면,
왼손을 엄지를 위로 쭉 펴고 나머지 손가락들을 감아주는 방향으로 회전하는 것과 같다.
 
X축은 가로에 대한 축이다.
따라서  DX는 왼손 좌표계를 사용하고 있기 때문에 
DX에서 X축에 대한 회전은 엄지를 옆으로 쭉 펴고
나머지 손가락들을 감아주는 방향으로 회전하는 것과 같다.
 

머티리얼

 
머티리얼은 크게 diffuse, ambient, specular에 따라 나뉜다.
 

// 코드 출저 위키피디아 https://en.wikipedia.org/wiki/Blinn%E2%80%93Phong_reflection_model
struct Lighting
{
    float3 Diffuse;
    float3 Specular;
};

struct PointLight
{
	float3 position;
	float3 diffuseColor;
	float  diffusePower;
	float3 specularColor;
	float  specularPower;
};

 
조명에도 직접 조명과 간접 조명이있다.
이를 통해서 좀 더 사실적인 렌더를 한다.
ambient는 조명하고 상관없이 픽셀쉐이더가 가지고 있는 색을 리턴해주면 된다.
( = 물체 자체의 간접광 색깔)
 
diffuse가 조명하고 관련이 있는데,
diffuse는 Light의 r값과 머티리얼의 r값을 곱하는 식으로 간다.(rgb모두 동일)
 

Lambertian Surface

 

참고 https://en.wikipedia.org/wiki/Lambertian_reflectance

램버트 확산 반사 다이어그램. 검은색 화살표는 입사 복사도를 나타내고 , 
빨간색 화살표는 각 방향의 반사 복사 강도를 나타낸다 .
다양한 각도에서 볼 때
반사 복사 강도와 표면의 겉보기 면적은 모두 시야각의 코사인에 따라 달라지므로
반사 복사도 (단위 면적당 강도)는 모든 시야각에서 동일하다.
-90도 아래로 내려가게 되면 빛을 더는 받을 수 가 없다.
다시 +90도 이상부터는 받을 수 있다.
 
Diffuse Surface는
반사가 모든 방향으로 동일하게 퍼지는 것이고
(cos에 의해서 달라지는 것)
즉 Diffuse Surface를 계산할 때는 빛이 어느 방향에서 오는 지?
빛이 많이 받을 수 있는 각도인지 적게 받을 수 있는 각도인지를 알아야한다.
(빛을 얼마나 많이 반사할 지를 하는 계산)이를 계산할 때
램벌트의 코사인 법칙을 사용한다.
 
Specular Surface는 
완전 반사를 통해 (난반사 x) 특정 반사를 통해 강하게 반사한다.
이 때 눈에서 보는 방향과 Specular 각도와 얼마나 동일하냐에 따라
반짝이는 정도(빛이 강하게 들어오는 정도)가 크다.
 

출저 - 위키피디아

 

출저 위키피디아

R*V 대신  N*H 사용 ( R*V 로 대체 가능 )
Phong 셰이딩에서는 접곱을 계속해서 다시 계산한다.
 
 
-실습 예제 박스 구현하기

 
 

 
 
++PLUS++
 
최신 렌더링 기법에서는 레스터라이제이션에서
여러가지 고급 렌더링 기법을 덧붙여 사용하여 
레스터라이제이션 성능을 향상시켜서 쓰고 있다.
 
++++++++
 

 
참고문헌  : 위키피디아
https://en.wikipedia.org/wiki/Lambertian_reflectance