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 구조체의 주소를 지정하는 것만으로 있다.
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 메서드는 다음 표의 프로퍼티를 가지는 광원을 생성 해, 그 광원을 유효 또는 무효로 한다.
멤버 | 디폴트 |
---|---|
Type | D3DLIGHT_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) |
Range | 0 |
Falloff | 0 |
Attenuation0 | 0 |
Attenuation1 | 0 |
Attenuation2 | 0 |
Theta | 0 |
Phi | 0 |