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

~ディレクションライト作成~

2-1-1.基礎知識:ライトの種類について

Direct3Dで使用できるライトは全部で3種類。それぞれメリット・デメリットがあるので、そのイメージをまとめてみた。

(今回ライトの存在を認識できるようオブジェクトに影をおいてあるが、これは通常ではでませんのであしからず。影もちゃんと自分で出さないと出ません)


1.ディレクショナルライト(平行ライト)

平行ライト 平行ライトの説明

2・ポイントライト(点ライト)

点ライト 点ライトの説明

3.スポットライト

スポットライト スポットライトの説明

▲TOP

2-1-2.関数setDirectionalLight()の作成

まずはライトの基本である、ディレクショナルナイト(平行ライト)のパラメータ設定を行う関数を作成し、InitApp()の中でコールしてみる。


void setDirectionalLight()									
{																		
	D3DLIGHT9 dlight;								
	ZeroMemory( &dlight , sizeof( D3DLIGHT9 ) );								
									
	//  パラメータセット:ライトの色 ��れぞれ 0~1で							
	dlight.Diffuse.r = 1.0f;                            //  赤	
	dlight.Diffuse.g = 1.0f;                            //  緑	
	dlight.Diffuse.b = 1.0f;                            //  青	
									
	//  パラメータセット:ハイライトの色 それぞれ 0~1で							
	dlight.Specular.r = 1.0f;								
	dlight.Specular.g = 1.0f;								
	dlight.Specular.b = 1.0f;								
									
	//  パラメータセット:ライト種類 平行ライト+ライトの向き情報							
	dlight.Type = D3DLIGHT_DIRECTIONAL;								
	dlight.Direction = D3DXVECTOR3(0.5f,-0.7f,0.2f);								
									
	//  ライト情報のセット							
	DXUTGetD3DDevice()->SetLight( 0, &dlight );         //  0番ライトに情報をセット		
	DXUTGetD3DDevice()->LightEnable( 0 , true );        //  0番ライト有効		
									
	//  Direct3Dによるライティングを有効にする							
	DXUTGetD3DDevice()->SetRenderState( D3DRS_LIGHTING, TRUE);								
}									
        
平行ライト制御での重要なパラメータ
Diffuse ライトの色 rgbaの4つのパラメータに 0~1.0f が設定可能
Specular ハイライトの色 rgbaの4つのパラメータに 0~1.0f が設定可能
Type ライトの種類、現実的には D3DLIGHT_DIRECTIONAL と D3DLIGHT_POINT 等
Direction ライトの方向を3Dベクトルで設定

※色を保存する Diffuse、Specular、Ambient は D3DCOLORVALUE型構造体 rgba の4つのメンバを持つ。

▲TOP

2-1-3.プログラミング

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

※isu.Xについては、基本①の1-2で入手できるのでそこで入手してきて欲しい。

※commonフォルダへの追加やの追加はここでは省略するので、各自でやって欲しい。

//--------------------------------------------------------------------------------------														
// 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();														
//--------------------------------------------------------------------------------------														
// 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 )														
{														
	//  ディレクションライト処理													
	setDirectionalLight();													
}														
        

↓ Render the scene

													
//--------------------------------------------------------------------------------------														
// 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"ディレクションライト:オン");												
		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 ));													
														
	//  パラメータセット:ライトの色 それぞれ 0~1で												
	dlight.Diffuse.r = 1.0f;    //	赤						
	dlight.Diffuse.g = 1.0f;    //	緑						
	dlight.Diffuse.b = 1.0f;    //	青						
														
	//  パラメータセット:ハイライトの色 それぞれ 0~1で												
	dlight.Specular.r = 1.0f;													
	dlight.Specular.g = 1.0f;													
	dlight.Specular.b = 1.0f;													
														
	//  パラメータセット:ライト種類 平行ライト+ライトの向き情報												
	dlight.Type = D3DLIGHT_DIRECTIONAL;													
	dlight.Direction = D3DXVECTOR3(0.5f,-0.7f,0.2f);													
														
	//  情報セット													
	DXUTGetD3DDevice()->SetLight(0,&dlight);													
	DXUTGetD3DDevice()->LightEnable(0,true);													
														
	//  enable													
	DXUTGetD3DDevice()->SetRenderState(D3DRS_LIGHTING, TRUE);													
}					
        

2-1-4.動作確認

↓ディレクションライトが動作していれば完了です。


2-1-4 動作確認

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

▲TOP

>「2-2 ライトのパラメータ変数を管理・変更」へ続く