3Dプログラミング基本 2-2

~ライトのパラメータ変数を管理・変更~

2-2-1.ライトパラメータ変数を準備

D3DCOLORVALUE diff = {1,1,1,1};                     //  ライト色の変数		
D3DCOLORVALUE spec = {1,1,1,1};                     //  ハイライト色の変数		
D3DXVECTOR3 dir = D3DXVECTOR3(0.5f,-0.7f,0.2f);     //  ライト向きの変数				
            

▲TOP

2-2-2.変数値のセット

//  パラメータセット ライト				
dlight.Diffuse = diff;				
				
//  パラメータセット ハイライト				
dlight.Specular = spec;				
				
//  タイプ				
dlight.Type = D3DLIGHT_DIRECTIONAL;				
				
//  向き				
dlight.Direction = dir;			
        
  

▲TOP

2-2-3.キーボード操作で各パラメータを変更

カーソルキー及びZXキーでライト角度変更、R・G・Bキー+上下キーでライト色変更ができる。

//  ライトのパラメータを変更					
//  ライト方向の変更					
if(DXUTIsKeyDown(VK_UP))					
{					
	dir.y -= 0.1f;				
}					
if(DXUTIsKeyDown(VK_DOWN))					
{					
	dir.y += 0.1f;				
}					
if(DXUTIsKeyDown(VK_LEFT))					
{					
	dir.x -= 0.1f;				
}					
if(DXUTIsKeyDown(VK_RIGHT))					
{					
	dir.x += 0.1f;				
}					
if(DXUTIsKeyDown('Z'))					
{					
	dir.z -= 0.1f;				
}					
if(DXUTIsKeyDown('X'))					
{					
	dir.z += 0.1f;				
}					
					
//  ライト色の変更					
if(DXUTIsKeyDown('R'))              //  赤
{					
	if(DXUTIsKeyDown(VK_UP))				
	{				
		diff.r += 0.1f;			
	}				
	if(DXUTIsKeyDown(VK_DOWN))				
	{				
		diff.r -= 0.1f;			
	}				
}					
if(DXUTIsKeyDown('G'))              //  緑
{					
	if(DXUTIsKeyDown(VK_UP))				
	{				
		diff.g += 0.1f;			
	}				
	if(DXUTIsKeyDown(VK_DOWN))				
	{				
		diff.g -= 0.1f;			
	}				
}					
if(DXUTIsKeyDown('B'))              //  青
{					
	if(DXUTIsKeyDown(VK_UP))				
	{				
		diff.b += 0.1f;			
	}				
	if(DXUTIsKeyDown(VK_DOWN))				
	{				
		diff.b -= 0.1f;			
	}				
}									
        
  

▲TOP

2-2-4.プログラミング

※追加箇所はマーカーで表記

//--------------------------------------------------------------------------------------														
// File: EmptyProject.cpp														
//														
// Empty starting point for new Direct3D applications														
//														
// Copyright (c) Microsoft Corporation. All rights reserved.														
//--------------------------------------------------------------------------------------														
														
#include "dxstdafx.h"														
#include "resource.h"														
														
//  フォントオブジェクト													
LPD3DXFONT pFont;														
														
//  3Dメッシュ変数と関連変数 													
//  CDXUTMeshクラスを使用するには、commonフォルダにある DXUTMesh.cppとDXUTMesh.hをプロジェクトに追加すること													
CDXUTMesh       *g_mesh;    //  メッシュを扱うポインタ変数					
														
void setDirectionalLight();														
D3DCOLORVALUE diff = {1,1,1,1};                     //  ライト色の変数						
D3DCOLORVALUE spec = {1,1,1,1};                     //  ハイライト色の変数						
D3DXVECTOR3 dir = D3DXVECTOR3(0.5f,-0.7f,0.2f);     //  ライト向きの変数	
				
//--------------------------------------------------------------------------------------														
// Rejects any devices that aren't acceptable by returning false														
//--------------------------------------------------------------------------------------														
bool CALLBACK IsDeviceAcceptable( D3DCAPS9* pCaps, D3DFORMAT AdapterFormat, 														
                                  D3DFORMAT BackBufferFormat, bool bWindowed, void* pUserContext )														
{														
    //  Typically want to skip backbuffer formats that don't support alpha blending														
    IDirect3D9* pD3D = DXUTGetD3DObject(); 														
    if( FAILED( pD3D->CheckDeviceFormat( pCaps->AdapterOrdinal, pCaps->DeviceType,														
                    AdapterFormat, D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING, 														
                    D3DRTYPE_TEXTURE, BackBufferFormat ) ) )														
        return false;														
														
    return true;														
}														
																												
//--------------------------------------------------------------------------------------														
// Before a device is created, modify the device settings as needed														
//--------------------------------------------------------------------------------------														
bool CALLBACK ModifyDeviceSettings( DXUTDeviceSettings* pDeviceSettings, const D3DCAPS9* pCaps, void* pUserContext )														
{														
    return true;														
}														
																												
//--------------------------------------------------------------------------------------														
// Create any D3DPOOL_MANAGED resources here 														
//--------------------------------------------------------------------------------------														
HRESULT CALLBACK OnCreateDevice( IDirect3DDevice9* pd3dDevice, const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )														
{														
    return S_OK;														
}																												
														
//--------------------------------------------------------------------------------------														
// Create any D3DPOOL_DEFAULT resources here 														
//--------------------------------------------------------------------------------------														
HRESULT CALLBACK OnResetDevice( IDirect3DDevice9* pd3dDevice, 														
                                const D3DSURFACE_DESC* pBackBufferSurfaceDesc, void* pUserContext )														
{														
    return S_OK;														
}														
																												
//--------------------------------------------------------------------------------------														
// Handle updates to the scene														
//--------------------------------------------------------------------------------------														
void CALLBACK OnFrameMove( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )														
{														
	//  ライトのパラメータを変更													
	//  ライト方向の変更													
	if(DXUTIsKeyDown(VK_UP))													
	{													
		dir.y -= 0.1f;												
	}													
	if(DXUTIsKeyDown(VK_DOWN))													
	{													
		dir.y += 0.1f;												
	}													
	if(DXUTIsKeyDown(VK_LEFT))													
	{													
		dir.x -= 0.1f;												
	}													
	if(DXUTIsKeyDown(VK_RIGHT))													
	{													
		dir.x += 0.1f;												
	}													
	if(DXUTIsKeyDown('Z'))													
	{													
		dir.z -= 0.1f;												
	}													
	if(DXUTIsKeyDown('X'))													
	{													
		dir.z += 0.1f;												
	}													
														
	//  ライト色の変更													
	if(DXUTIsKeyDown('R'))                  //  赤								
	{													
		if(DXUTIsKeyDown(VK_UP))												
		{												
			diff.r += 0.1f;											
		}												
		if(DXUTIsKeyDown(VK_DOWN))												
		{												
			diff.r -= 0.1f;											
		}												
	}													
	if(DXUTIsKeyDown('G'))                  //  緑								
	{													
		if(DXUTIsKeyDown(VK_UP))												
		{												
			diff.g += 0.1f;											
		}												
		if(DXUTIsKeyDown(VK_DOWN))												
		{												
			diff.g -= 0.1f;											
		}												
	}													
	if(DXUTIsKeyDown('B'))                  //  青								
	{													
		if(DXUTIsKeyDown(VK_UP))												
		{												
			diff.b += 0.1f;											
		}												
		if(DXUTIsKeyDown(VK_DOWN))												
		{												
			diff.b -= 0.1f;											
		}												
	}													
														
	//  ディレクションライト処理													
	setDirectionalLight();													
}														
														
//--------------------------------------------------------------------------------------														
// Render the scene 														
//--------------------------------------------------------------------------------------														
void CALLBACK OnFrameRender( IDirect3DDevice9* pd3dDevice, double fTime, float fElapsedTime, void* pUserContext )														
{														
    HRESULT hr;														
														
    //  Clear the render target and the zbuffer 														
    V( pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, D3DCOLOR_ARGB(0, 45, 50, 170), 1.0f, 0) );														
														
    //  Render the scene														
    if( SUCCEEDED( pd3dDevice->BeginScene() ) )														
    {														
		//  メッシュのレンダリング											
		g_mesh->Render( DXUTGetD3DDevice() );   //  レンダリング				
														
		//  文字列の準備と生成											
		TCHAR str[255];												
		RECT rect;												
														
		SetRect( &rect , 0,0,640,480);												
		_stprintf( str ,L"カーソルキー及びZXキーでライト角度変更");												
		pFont->DrawText( NULL,str,-1,&rect,NULL,D3DCOLOR_RGBA(255,255,255,255));												
		SetRect( &rect , 0,20,640,480);												
		_stprintf( str ,L"R・G・Bキー+上下キーで色変更");												
		pFont->DrawText( NULL,str,-1,&rect,NULL,D3DCOLOR_RGBA(255,255,255,255));												
														
		V( pd3dDevice->EndScene() );												
    }														
}														
														
//--------------------------------------------------------------------------------------														
// Handle messages to the application 														
//--------------------------------------------------------------------------------------														
LRESULT CALLBACK MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, 														
                          bool* pbNoFurtherProcessing, void* pUserContext )														
{														
    return 0;														
}														
														
//--------------------------------------------------------------------------------------														
// Release resources created in the OnResetDevice callback here 														
//--------------------------------------------------------------------------------------														
void CALLBACK OnLostDevice( void* pUserContext )														
{														
}														
														
//--------------------------------------------------------------------------------------														
// Release resources created in the OnCreateDevice callback here														
//--------------------------------------------------------------------------------------														
void CALLBACK OnDestroyDevice( void* pUserContext )														
{														
	//  3Dメッシュの解放												
	SAFE_DELETE( g_mesh );													
														
	SAFE_RELEASE( pFont );													
}														
														
//  アプリケーション初期化関数													
void InitApp( void )														
{														
	//  メッシュのロード												
	g_mesh = new CDXUTMesh();                           //  メッシュを実体化しポインタを取得					
	g_mesh->Create(DXUTGetD3DDevice(),L"isu.x");        //  メッシュのロード(これは描画用でない)					
	g_mesh->RestoreDeviceObjects(DXUTGetD3DDevice());   //  描画用メッシュの作成					
														
	/////////////////////////////////////////////////////////////////////////////////////////////													
	//  3D環境の設定												
	//  カメラセット												
	D3DXMATRIX matview;													
	//  注視マトリクスの生成	(カメラ位置  注視点  上方向)		
	D3DXMatrixLookAtLH( &matview , &D3DXVECTOR3(0,10,-10),&D3DXVECTOR3(0,0,0),&D3DXVECTOR3(0,1,0));													
	DXUTGetD3DDevice()->SetTransform(D3DTS_VIEW,&matview);      //  マトリクスのセット		
														
	//  プロジェクション(パース)の生成												
	D3DXMATRIX matproj;
												
	//  注視マトリクスの生成  (視野角   アスペクト比    前方クリッピング平面 後方)		
	D3DXMatrixPerspectiveFovLH ( &matproj , D3DXToRadian(45),640.0f/480.0f , 0.1f,2000.0f);													
	DXUTGetD3DDevice()->SetTransform(D3DTS_PROJECTION,&matproj);    //  マトリクスのセット		
														
}																						
        

↓Initialize everything and go into a render loop

※変更箇所は下部にて別途補足説明をする

//--------------------------------------------------------------------------------------														
// Initialize everything and go into a render loop														
//--------------------------------------------------------------------------------------														
INT WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int )														
{														
    //  Enable run-time memory check for debug builds.														
#if defined(DEBUG) | defined(_DEBUG)														
    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );														
#endif														
														
    //  Set the callback functions														
    DXUTSetCallbackDeviceCreated( OnCreateDevice );														
    DXUTSetCallbackDeviceReset( OnResetDevice );														
    DXUTSetCallbackDeviceLost( OnLostDevice );														
    DXUTSetCallbackDeviceDestroyed( OnDestroyDevice );														
    DXUTSetCallbackMsgProc( MsgProc );														
    DXUTSetCallbackFrameRender( OnFrameRender );														
    DXUTSetCallbackFrameMove( OnFrameMove );														
   														
    //  TODO: Perform any application-level initialization here														
														
    //  Initialize DXUT and create the desired Win32 window and Direct3D device for the application														
    DXUTInit( true, true, true );           //  Parse the command line, handle the default hotkeys, and show msgboxes														
    DXUTSetCursorSettings( true, true );    //  Show the cursor and clip it when in full screen														
    DXUTCreateWindow( L"EmptyProject" );														
    DXUTCreateDevice( D3DADAPTER_DEFAULT, true, 640, 480, IsDeviceAcceptable, ModifyDeviceSettings );														
														
//  フォントの作成													
D3DXCreateFont( DXUTGetD3DDevice(),														
	16,													
	0,													
	FW_NORMAL,													
	1,													
	false,													
	DEFAULT_CHARSET,													
	OUT_DEFAULT_PRECIS,													
	DEFAULT_QUALITY,													
	DEFAULT_PITCH,													
	L"",													
	&pFont);													
														
//  アプリケーションの初期化														
InitApp();														
														
    //  Start the render loop														
    DXUTMainLoop();														
														
    //  TODO: Perform any application-level cleanup here														
														
    return DXUTGetExitCode();														
}														
														
void setDirectionalLight()														
{														
	D3DLIGHT9 dlight;													
	ZeroMemory( &dlight , sizeof( D3DLIGHT9 ));													
														
	//  パラメータセット ライト													
	dlight.Diffuse = diff;													
														
	//  パラメータセット ハイライト													
	dlight.Specular = spec;													
														
	//  タイプ													
	dlight.Type = D3DLIGHT_DIRECTIONAL;													
														
	//  向き													
	dlight.Direction = dir;													
														
	//  情報セット													
	DXUTGetD3DDevice()->SetLight(0,&dlight);													
	DXUTGetD3DDevice()->LightEnable(0,true);													
														
	//  enable													
	DXUTGetD3DDevice()->SetRenderState(D3DRS_LIGHTING, TRUE);													
}												
        

※補足説明※

●59行めの[ dlight.Diffuse = diff; ]

●62行めの[ dlight.Specular = spec; ]

●65行めの[ dlight.Type = D3DLIGHT_DIRECTIONAL; ]

●68行めの[ dlight.Direction = dir; ]

以上は処理を変更した箇所である。

  

2-2-5.動作確認

↓上下左右キー、ZXキーでライト角度変更。

RGBキー+上下キーで赤み、緑み、青みが変更できれば完了です。


2-2-5 動作確認

> 完成例の実行ファイルはここからダウンロード

▲TOP

>「2-3 複数ライトの設定」へ続く