前回の X ファイルの表示では、テクスチャーも何も張っていなかったので、のっぺりしていました。
今回は、ライトを用いて、車の形が分かるようにします。
いつも通り、以下のファイルをダウンロードしてください。
前回のモデルが夕日に照らされたかのように、オレンジ色に表示されます。
今回は、前回のプログラムから、初期化部分の InitRender を書き換えただけです。
HRESULT InitRender(LPDIRECT3DDEVICE8 lpD3DDEV) { HRESULT hr; LPD3DXBUFFER pD3DXMtrlBuffer; // X ファイルのロード hr = D3DXLoadMeshFromX( "car.x", D3DXMESH_SYSTEMMEM, lpD3DDEV, NULL, &pD3DXMtrlBuffer, &dwNumMaterials, &pMesh ); if(FAILED(hr)) return E_FAIL; // pD3DXMtrlBuffer から、質感やテクスチャーの情報を読み取る D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer(); pMeshMaterials = new D3DMATERIAL8[dwNumMaterials]; pMeshTextures = new LPDIRECT3DTEXTURE8[dwNumMaterials]; for( DWORD i=0; i < dwNumMaterials; i++ ){ pMeshMaterials[i] = d3dxMaterials[i].MatD3D;// 質感のコピー pMeshMaterials[i].Ambient = pMeshMaterials[i].Diffuse;// マテリアルの環境色を設定する hr = D3DXCreateTextureFromFile( lpD3DDEV, d3dxMaterials[i].pTextureFilename, &pMeshTextures[i] ); if(FAILED(hr)) pMeshTextures[i] = NULL; } RELEASE(pD3DXMtrlBuffer); lpD3DDEV->SetRenderState( D3DRS_ZENABLE, TRUE); D3DLIGHT8 light; ZeroMemory( &light, sizeof(D3DLIGHT8) ); light.Type = D3DLIGHT_DIRECTIONAL; light.Diffuse.r = 1.0f; light.Diffuse.g = 0.3f; light.Diffuse.b = 0.3f; D3DXVECTOR3 vecDir; vecDir = D3DXVECTOR3(-1.0f, -1.0f, -0.1f); D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir ); lpD3DDEV->SetLight( 0, &light ); lpD3DDEV->LightEnable( 0, TRUE ); lpD3DDEV->SetRenderState( D3DRS_LIGHTING, TRUE ); lpD3DDEV->SetRenderState( D3DRS_AMBIENT, 0x00202020 ); return S_OK; }
さてさて、追加分ですが、D3DLIGHT8 にライトの設定をした後、lpD3DDEV->SetLight で、その設定を有効にします。
中身ですが、Type の設定を D3DLIGHT_DIRECTIONAL にしました。これは、直訳すると『方向光源』で、方向だけを
持つライトです(通常の和訳は平行光源です)。
太陽のように、非常に遠くにあって、地表に一面に降り注ぐ光を表現しています。
Diffuse はライトの色を設定しています。今回は、赤色の成分が強い光、つまり赤い光を当てています。
次に、vecDir を使って、方向を設定しています。ほぼ、左手上方から光を降り注がせます。
D3DXVec3Normalize は、ライトを『方向』の情報にするために必要な手続きです。
これを行わないと、不自然に明るかったり、暗すぎるライトが出来上がります。
後は、ライトを有効にする設定だけです。
D3DRS_AMBIENT は、前にも出てきた、全体的な明るさを設定するライトで、暗い白色にしました。
描画される絵の、ライトが当たっていない場所を良く見ると、黄色になっています。
これは、元の車の色で、ここが環境光しか当たっていない部分になります。
環境光がない部分は真っ暗になります。現実の物体には、他の物体からの反射などで、
光が直接当たっていない部分も見えます。この効果を表現したものが環境光です。
さて、どうでしょうか?