* 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. 그 라이트 목록을 가지고, 오브젝트에 라이트 연산을 한다.
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. 그 라이트 목록을 가지고, 오브젝트에 라이트 연산을 한다.
태그 : 라이트





덧글
cagetu 2007/07/10 18:47 # 답글
http://www.gpgstudy.com/forum/viewtopic.php?topic=2318리니지 2의 캐릭터 라이팅을 어떻게 했을까요?
cagetu 2007/07/20 13:37 # 답글
삼조명...http://blog.naver.com/maxerkr7?Redirect=Log&logNo=140004412046
http://blog.naver.com/gogator100?Redirect=Log&logNo=80003561498
cagetu 2007/07/30 11:39 # 답글
1. Node에 Attach된 녀석들은 그 노드의 자식들에게만 영향을 준다.vs
2. 메쉬가 영향받는 라이트를 구한다.
이 두 차이가, wildMagic3(Gamebryo) 와 Orge3D와의 차이.
어떤 선택을 해야 하나...
1번을 선택하면, 효율은 좋을 거 같은데, 약간 의미상 제약을 주는 것 같고,
2번을 선택하면, 의미상 표현이 맞는 것 같은데, 라이트 개수 * 메쉬 개수 만큼의 순회를 해야 하니, 이를 어쩐다.. ㅡㅡ;;