셰이더 - 퍼 픽셀 라이팅 ( per pixel lighting )
포인트 라이트( point light )를 VS 와 PS 로 테스트 해 보았습니다.
포인트 라이트 위치에 대해
정점의 위치가 반지름 영역안에 들어오는지를 체크하여
라이트 색상을 적용시켜주는
테스트 코드입니다.
포지션과 라이트 간의 거리를 구해서
거리값이 라이트 반지름보다 작다면,
포함되는 것이므로
라이트의 diffuse 를 곱해주는 코드입니다.
VS 구현시
VS()
{
//다른계산들
.......
//wpos 는 월드포지션
float fDist = distance( _In.wpos.xyz, _vPLPos.xyz );
float4 pointlight = float4(1,1,1,1);
if( fDist < _fPLRad )
{
float f = fDist / _fPLRad;
//pointlight.rgb += 0.0f;
pointlight.rgb *= (2.f - f);
pointlight.rgb *= _vPLDiffuse.rgb * (2.f - f);
}
//
//pointlight 를 diffuse 에 곱해줌
}
버텍스 정점에 대해 적용되기 때문에,
폴리곤의 모양이 그대로 나타납니다.
PS 구현시
PS()
{
//다른계산들
.......
float fDist = distance( _In.wpos.xyz, _vPLPos.xyz );
float4 pointlight = float4(1,1,1,1);
if( fDist < _fPLRad )
{
float f = fDist / _fPLRad;
//pointlight.rgb += 0.0f;
pointlight.rgb *= (2.f - f);
pointlight.rgb *= _vPLDiffuse.rgb * (2.f - f);
}
//
//pointlight 를 diffuse 에 곱해줌
}
픽셀당 적용하여 깨끗하게 적용된 모습입니다.
아직 빛의 세기 등은 적용하지 않았습니다.
PS 로 테스트 해 본 부분이
퍼 픽셀 라이팅 입니다.
VS 와 PS 에 구현된
코드를 보시면은,
똑같습니다.
차이점은 각각 VS, PS 에서 계산했다는 것
이 뿐입니다.
VS 에서 셋팅된 정점들은
레스터라이저 과정( 레스터라이저 + 보간기 )을 통해
fragment 화 (단편화) 됩니다.
fragment 에 포함된 모든 정보는,
보간된 정보입니다.
정점에 관한 모든 정보가 ( UV, Color, Pos 그 외 PS 로 넘어가는 모든 정보들 )
보간되어 있습니다.
fragment stream 은 PS 에 전달이 됩니다.
PS 는 이 fragment 들을 처리해주는 것으로
단편셰이더라고도 불리웁니다.
즉,
VS 에 적용된 wpos.xyz 과
PS 에 적용된 wpos.xyz 값은 다릅니다.
( PS 에 적용된 wpos 값은 보간기에 의해 보간된 값입니다
- 삼각형으로 연결된 정점들간의 사이값으로 보간이 되었겠지요 )
따라서,
PS 에서 라이트 계산을 해주는 것 만으로도
퍼 픽셀 라이팅이 됩니다.
'프로그래밍' 카테고리의 다른 글
범프매핑 노말매핑 법선매핑 (0) | 2014.06.10 |
---|---|
C++ 문자열 테이블 만들기 ( C++ make string table ), 문자열 파싱 (0) | 2014.05.21 |
BSP 트리 ( bsp tree ) - 06 (0) | 2014.04.21 |
BSP 트리 ( bsp tree ) - 05 (0) | 2014.04.21 |
BSP 트리 ( bsp tree ) - 04 (0) | 2014.04.21 |