기본 조명 공식(3) + 라이트 구조 개발 노트

* n개의 라이트를 계산할 때 ( Diffuse + Ambient + Specular )

Atten = 1/( att0i + att1i * d + att2i * d2);
diffuse_Color = max(0, dot(n,l)) * light diffuse * Atten;                // Lambert 공식
specular_Color = pow( max(0, dot(n,h)), material_shininess );    // Blinn 반영 공식

AmbientColor = Material_Emissive + sum( Light_Ambient(+globalAmbient)*Material_Ambient );
DiffuseColor = sum( Material_Diffuse * diffuse_Color ) * VertexColor;
SpecularColor = sum( Material_Specular * specular_Color* SpecularIndensity );
최종 색상 = AmbientColor + DiffuseColor +SpecularColor;

* Tip
float4 GlobalAmbient = Material_ems + Global_amb*Material_amb : 미리 계산해둔다.
float4 LightAmbient = Material_amb*Light_amb : 미리 계산
Specular는 Shininess 값으로, Specular가 적용되는 범위를 넣어주고, 강도(Indensity)값을 주어서 반짝임의 강도를 적용한다.

최종 색상 = GlobalAmbient + sum( Material_dif*diffuse_Color + LightAmbient  );

Directional Light 와 Point/Spot 라이트를 구별해두면, 나중에 계산을 조금 줄일 수 있음..


<상황 1>
- SceneNode 에 Light 를 Attach/Detach/Delete 가능
- Culling 처리 후에, Frustum에 걸린 라이트 들만 일단 따로 Queue 처리
or 일정 영역안에 들어오는 라이트들만 모아둠.
- 모아둔 라이트가 내 화면에 보이는 모든 라이트라고 할 수 있으므로, 이것을 화면에 세팅
- 오브젝트가 충돌되는 라이트들을 검출하여, 쉐이더로 계산.
- ShaderX3 6.2 에 GetRelevantLighs(..) 의 인터페이스를 보고 힌트를 얻었음..

* 동적 라이트와 정적 라이트를 구별해야 하는가?

<상황 2>
SceneNode에 연결을 하였더니, 업데이트 되는 타이밍이, 메쉬의 업데이트 되는 타이밍보다 나중이 될 수 있어서,
라이트 관리자를 만들어서, 관리를 맡기었다.
1. 라이트 관리자에 라이트 추가
2. 씬 업데이트 시작할 때, 화면에 보이는 라이트를 모은다.
3. 오브젝트마다 자신이 영향을 받는 라이트 목록을 만든다.
4. 그 라이트 목록을 가지고, 오브젝트에 라이트 연산을 한다.

트랙백

이 글과 관련된 글 쓰기 (트랙백 보내기)
TrackbackURL : http://cagetu.egloos.com/tb/3461193 [도움말]

덧글

덧글 입력 영역



메모장

내가 먼 훗날에 이 글들을 보았을 때, 좋은 추억이 될 수 있기를...

나를 위해... 나에게 쓰는...

msn: cagetu@hotmail.com
mail: cagetu79@gmail.com
tritter: twitter.com/cagetu