DirectX Graphics 프로그래밍 가이드 고정 기능 파이프라인 라이트와 머트리얼 라이트의 사용법   [목차열람] [주소복사] [슬롯비우기]
라이트의 사용법
 
Microsoft DirectX 9.0

라이트의 사용법


라이트 속성의 설정과 취득

C++ 애플리케이션으로 라이트 속성을 설정하려면 ,D3DLIGHT9 구조체를 준비해, 다음에 IDirect3DDevice9::SetLight 메서드를 호출한다. IDirect3DDevice9::SetLight 메서드는, 장치가 라이트 속성 세트를 장치 내부의 라이트 속성의 리스트에 배치할 때의 인덱스와 그 라이트 속성을 정의하는 D3DLIGHT9 구조체의 주소를 받는다. 라이트 속성의 갱신이 필요한 때는, 새로운 정보로 IDirect3DDevice9::SetLight 를 호출할 수가 있다.

프로퍼티를 할당할 수 있지 않은 인덱스로 IDirect3DDevice9::SetLight 메서드를 호출할 때마다, 시스템은 라이트 속성 세트를 저장하기 위한 메모리를 할당한다. 애플리케이션에서는, 할당할 수 있는 라이트의 서브 세트를 한 번에 유효하게 해, 수많은 라이트를 설정할 수 있다. 장치가 지원 하는 액티브한 라이트의 최대수를 결정하기 위해서(때문에) 장치 능력을 얻어온다 때는,D3DCAPS9 구조체의 MaxActiveLights 멤버를 확인한다. 라이트를 사용할 필요가 없어졌을 경우는, 그 라이트를 무효로 하는지, 새로운 라이트 속성 세트로 덧쓰기할 수가 있다.

다음의 C++ 의 샘플 코드에서는, 거리의 증가에 의해 감쇠하지 않는, 백색의 포인트 라이트의 프로퍼티를 준비 및 설정한다.

// Assume d3dDevice is a valid pointer to an IDirect3DDevice9 interface.
D3DLIGHT9 d3dLight;
HRESULT   hr;

// Initialize the structure.
ZeroMemory(&d3dLight, sizeof(d3dLight));

// Set up a white point light.
d3dLight.Type = D3DLIGHT_POINT;
d3dLight.Diffuse.r  = 1.0f;
d3dLight.Diffuse.g  = 1.0f;
d3dLight.Diffuse.b  = 1.0f;
d3dLight.Ambient.r  = 1.0f;
d3dLight.Ambient.g  = 1.0f;
d3dLight.Ambient.b  = 1.0f;
d3dLight.Specular.r = 1.0f;
d3dLight.Specular.g = 1.0f;
d3dLight.Specular.b = 1.0f;

// Position it high in the scene and behind the user.
// Remember, these coordinates are in world space, so
// the user could be anywhere in world space, too.  
// For the purposes of this example, assume the user
// is at the origin of world space.
d3dLight.Position.x = 0.0f;
d3dLight.Position.y = 1000.0f;
d3dLight.Position.z = -100. 0f;

// Don't attenuate.
d3dLight.Attenuation0 = 1.0f; 
d3dLight.Range        = 1000.0f;

// Set the property information for the first light.
hr = d3dDevice->SetLight(0, &d3dLight);
if (SUCCEEDED(hr))
	// Handle Success
else
	// Handle failure

라이트 속성 세트는, 다시 IDirect3DDevice9::SetLight 를 호출해 언제라도 갱신할 수 있다. 갱신하는 라이트 속성 세트의 인덱스와 새로운 프로퍼티를 포함한 D3DLIGHT9 구조체의 주소를 지정하는 것만으로 있다.

  라이트 속성 세트를 장치에 할당해도, 추가되는 프로퍼티를 가지는 광원이 유효하게 되는 것은 아니다. 광원을 유효하게 하려면 , 장치에 대해서 IDirect3DDevice9::LightEnable 메서드를 호출한다.

C++ 로, 기존의 광원의 프로퍼티를 모두 얻어오려면, 장치에 대해서 IDirect3DDevice9::GetLight 메서드를 호출한다. IDirect3DDevice9::GetLight 메서드를 호출할 때 프로퍼티를 얻어온다 광원의 0 으로부터 시작되는 인덱스를 제 1 인수에 건네주어,D3DLIGHT9 구조체의 주소를 제 2 인수에 건네준다. 장치는,D3DLIGHT9 구조체에 값을 설정해, 지정된 인덱스의 광원에서 그 장치가 사용하는 라이트 속성을 기술한다.

다음 샘플 코드는, 이 처리를 나타내고 있다.

// Assume d3dDevice is a valid pointer to an IDirect3DDevice9 interface.
HRESULT hr;
D3DLIGHT9 light;

// Get the property information for the first light.
hr = pd3dDevice->GetLight(0, &light);
if (SUCCEEDED(hr))
	// Handle Success
else
	// Handle failure

장치내에서 할당할 수 있는 광원의 범위외의 인덱스를 지정 하면,IDirect3DDevice9::GetLight 메서드는 실패해,D3DERR_INVALIDCALL 를 돌려준다.

라이트의 유효/무효

신내의 광원의 라이트 속성 세트를 할당하면 장치에 대해서 IDirect3DDevice9::LightEnable 메서드를 호출하는 것으로, 그 광원을 유효하게 할 수가 있다. 새롭게 할당한 광원은, 디폴트에서는 무효가 되어 있다. IDirect3DDevice9::LightEnable 메서드는, 2 개의 파라미터를 받는다. 제 1 인수에는, 메서드로 처리하는 광원의 인덱스 (0 으로부터 시작된다)를 설정한다. 제 2 인수에는, 라이트를 유효하게 하는 경우는 TRUE, 무효로 하는 경우는 FALSE 를 설정한다.

다음 코드는, 이 메서드를 사용해, 장치의 광원 프로퍼티의 리스트내의 최초의 광원을 유효하게 하는 방법을 나타내고 있다.

// Assume d3dDevice is a valid pointer to an IDirect3DDevice9 interface.
HRESULT hr;

hr = pd3dDevice->LightEnable(0, TRUE);
if (SUCCEEDED(hr))
	// Handle Success
else
	// Handle failure

장치가 지원 하는 액티브한 라이트의 최대수를 결정하기 위해서(때문에) 장치 능력을 얻어온다 때는,D3DCAPS9 구조체의 MaxActiveLights 멤버를 확인한다.

IDirect3DDevice9::SetLight 로 설정하는 프로퍼티가 없는 라이트를 유효 또는 무효로 하는 경우,IDirect3DDevice9::LightEnable 메서드는 다음 표의 프로퍼티를 가지는 광원을 생성 해, 그 광원을 유효 또는 무효로 한다.

멤버디폴트
TypeD3DLIGHT_DIRECTIONAL
Diffuse(R:1, G:1, B:1, A:0)
Specular(R:0, G:0, B:0, A:0)
Ambient(R:0, G:0, B:0, A:0)
Position(0, 0, 0)
Direction(0, 0, 1)
Range0
Falloff0
Attenuation00
Attenuation10
Attenuation20
Theta0
Phi0


© 2002 Microsoft Corporation. All rights reserved.
↑TOP