프로그래밍 2014. 5. 12. 19:29
728x90

 

셰이더 - 퍼 픽셀 라이팅 ( 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 에서 라이트 계산을 해주는 것 만으로도

퍼 픽셀 라이팅이 됩니다.

 

 

 

728x90
posted by BK dddDang
: