Exemple #1
0
void SetupLightingDX9(void)
{
	// 取得Direct3D 9裝置
	LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9();

	device->SetRenderState(D3DRS_LIGHTING, TRUE);
	// 設定環境光
	device->SetRenderState(D3DRS_AMBIENT, ConvertToD3DCOLOR(g_vAmbientLight));
	// 設定光源
	device->LightEnable(0, TRUE);

	D3DLIGHT9 light;
	ZeroMemory( &light, sizeof(light) );

	light.Type = D3DLIGHT_POINT;

	light.Position = *(D3DVECTOR *) &g_Light.m_Position;
	light.Diffuse = *(D3DCOLORVALUE*) &g_Light.m_Diffuse;
	light.Specular = *(D3DCOLORVALUE*) &g_Light.m_Specular;
	light.Range = 100.0f;

	light.Attenuation0 = 1.0f;
	light.Attenuation1 = 0.0f;
	light.Attenuation2 = 0.0f;

	device->SetLight(0, &light);

}
Exemple #2
0
void SetupLightingDX9(void)
{
	// `取得Direct3D9裝置`
	LPDIRECT3DDEVICE9 device = GutGetGraphicsDeviceDX9();

	// `開啟打光功能`
	device->SetRenderState(D3DRS_LIGHTING, TRUE);
	// `開啟/關閉localviewer功能`
	device->SetRenderState(D3DRS_LOCALVIEWER, g_bLocalViewer ? TRUE:FALSE);
	// `開啟/關閉autonormalize功能`
	device->SetRenderState(D3DRS_NORMALIZENORMALS, g_bAutoNormalize ? TRUE:FALSE);
	// `設定環境光`
	device->SetRenderState(D3DRS_AMBIENT, ConvertToD3DCOLOR(g_vGlobal_AmbientLight));
	// `指定反光能力的資料來源, 把它設為經由SetMaterial函式中來設定.`
	device->SetRenderState(D3DRS_AMBIENTMATERIALSOURCE, D3DMCS_MATERIAL);
	device->SetRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_MATERIAL);
	device->SetRenderState(D3DRS_SPECULARMATERIALSOURCE, D3DMCS_MATERIAL);

	device->SetRenderState(D3DRS_SPECULARENABLE, g_bSpecularReflection ? TRUE:FALSE);

	// `設定物件材質的反光能力`
	D3DMATERIAL9 mtrl;
	ZeroMemory( &mtrl, sizeof(mtrl) );
	mtrl.Ambient = *(D3DCOLORVALUE*) &g_vMaterialAmbient;
	mtrl.Diffuse = *(D3DCOLORVALUE*) &g_vMaterialDiffuse;
	mtrl.Specular = *(D3DCOLORVALUE*) &g_vMaterialSpecular;
	mtrl.Emissive = *(D3DCOLORVALUE*) &g_vMaterialEmissive;
	mtrl.Power = g_fMaterialShininess;
	// `經由呼叫SetMaterial來設定材質`
	device->SetMaterial(&mtrl);
	// `設定光源`
	for ( int i=0; i<g_iNumLights; i++ )
	{
		if ( g_Lights[i].m_bEnabled )
		{
			// `打開這盞光`
			device->LightEnable(i, TRUE);
			// `D3D9經由設定D3DLIGHT9 struct來設定光源屬性`
			D3DLIGHT9 light;
			ZeroMemory( &light, sizeof(light) );

			switch(g_Lights[i].m_eType)
			{
			case LIGHT_DIRECTIONAL:
				// `設定成方向光`
				light.Type = D3DLIGHT_DIRECTIONAL;
				light.Direction = *(D3DVECTOR *) &g_Lights[i].m_vDirection;	
				break;
			case LIGHT_POINT:
				// `設定成點光源`
				light.Type = D3DLIGHT_POINT;
				// `設定位置`
				light.Position = *(D3DVECTOR *) &g_Lights[i].m_vPosition;
				// `隨距離的衰減值`
				// 1/(CONSTANT+LINEAR*d+QUADRATIC*d^2)
				// `公式中的CONSTANT, LINEAR, QUADRATIC值`
				light.Attenuation0 = g_Lights[i].m_vAttenuation[0];
				light.Attenuation1 = g_Lights[i].m_vAttenuation[1];
				light.Attenuation2 = g_Lights[i].m_vAttenuation[2];
				break;
			case LIGHT_SPOT:
				// `設定成聚光燈`
				light.Type = D3DLIGHT_SPOT;
				// `設定位置`
				light.Position = *(D3DVECTOR *) &g_Lights[i].m_vPosition;
				// `設定方向`
				light.Direction = *(D3DVECTOR *) &g_Lights[i].m_vDirection;	
				// `隨距離的衰減值`
				// 1/(CONSTANT+LINEAR*d+QUADRATIC*d^2)
				// `公式中的CONSTANT, LINEAR, QUADRATIC值`
				light.Attenuation0 = g_Lights[i].m_vAttenuation[0];
				light.Attenuation1 = g_Lights[i].m_vAttenuation[1];
				light.Attenuation2 = g_Lights[i].m_vAttenuation[2];
				// `光柱圓錐的一半角度`
				light.Phi = FastMath::DegreeToRadian(g_Lights[i].m_fSpotlightCutoff);
				// `Inner Cone的角度, Inner Cone內部沒有角度衰滅.`
				light.Theta = FastMath::DegreeToRadian(g_Lights[i].m_fSpotLightInnerCone);
				// `光柱的角度衰滅值`
				light.Falloff = g_Lights[i].m_fSpotlightExponent;
				break;
			}

			// `光源的Ambient值`
			light.Ambient = *(D3DCOLORVALUE*) &g_Lights[i].m_vAmbientColor;
			// `光源的Diffuse值`
			light.Diffuse = *(D3DCOLORVALUE*) &g_Lights[i].m_vDiffuseColor;
			// `光源的Specular值`
			light.Specular = *(D3DCOLORVALUE*) &g_Lights[i].m_vSpecularColor;
			// `光源有效范圍, 在此把它設定成浮點數所容計的最大值.`
			light.Range = 1000.0f;
			// `用SetLight來設定光源屬性`
			device->SetLight(i, &light);
		}
		else
		{
			// `關閉這盞光`
			device->LightEnable(i, FALSE);
		}
	}
}