0001: // ---------------------------------------------------------------------------- 0002: // 0003: // draw.cpp - 描画部分 0004: // 0005: // Copyright (c) 2001 if (if@edokko.com) 0006: // All Rights Reserved. 0007: // 0008: // ---------------------------------------------------------------------------- 0009: #define STRICT 0010: 0011: #include <windows.h> 0012: #include "main.h" 0013: #include "draw.h" 0014: #include "load.h" 0015: 0016: static const int SHADOWMAP_HEIGHT = 512; 0017: static const int SHADOWMAP_WIDTH = 512; 0018: 0019: LPDIRECT3DVERTEXBUFFER8 pMeshVB = NULL; 0020: LPDIRECT3DINDEXBUFFER8 pMeshIndex = NULL; 0021: D3DXATTRIBUTERANGE *pSubsetTable = NULL; 0022: DWORD nMeshFaces = 0; 0023: DWORD nMeshVertices = 0; 0024: D3DMATERIAL8 *pMeshMaterials = NULL; // メッシュの質感 0025: LPDIRECT3DTEXTURE8 *pMeshTextures = NULL; // メッシュのテクスチャー 0026: DWORD dwNumMaterials = 0L; // マテリアルの数 0027: FLOAT MeshRadius; // メッシュの大きさ 0028: 0029: DWORD hVertexShader=~0; // モデルの描画 0030: DWORD hPixelShader=~0; // モデルの描画 0031: 0032: 0033: // 影を作りながら描画 0034: LPDIRECT3DSURFACE8 pBackbuffer = NULL; 0035: LPDIRECT3DSURFACE8 lpZbuffer = NULL; 0036: LPDIRECT3DTEXTURE8 pMaskTexture = NULL; // マスク用テクスチャー 0037: DWORD hShadowPixelShader=~0; 0038: DWORD hShadowVertexShader=~0; 0039: LPDIRECT3DVERTEXBUFFER8 pBlurVB = NULL; 0040: LPDIRECT3DINDEXBUFFER8 pBlurIB = NULL; 0041: 0042: LPDIRECT3DTEXTURE8 pTextureCol; 0043: LPDIRECT3DTEXTURE8 pTextureZ; 0044: LPDIRECT3DSURFACE8 pTextureSurfaceCol; 0045: LPDIRECT3DSURFACE8 pTextureSurfaceZ; 0046: LPDIRECT3DTEXTURE8 pLightTexture; 0047: typedef struct { 0048: float x,y,z; 0049: float tu,tv; 0050: }D3D_BLUR_VERTEX; 0051: #define D3DFVF_BLUR_VERTEX (D3DFVF_XYZ | D3DFVF_TEX1) 0052: 0053: DWORD dwBlurDecl[] = { 0054: D3DVSD_STREAM(0), 0055: D3DVSD_REG(D3DVSDE_POSITION, D3DVSDT_FLOAT3 ), //D3DVSDE_POSITION, 0 0056: D3DVSD_REG(D3DVSDE_TEXCOORD0,D3DVSDT_FLOAT2 ), //D3DVSDE_TEXCOORD0, 7 0057: D3DVSD_END() 0058: }; 0059: 0060: 0061: // ---------------------------------------------------------------------------- 0062: // 外部関数 0063: void InitBg(LPDIRECT3DDEVICE8 lpD3DDev); 0064: void DrawBg(LPDIRECT3DDEVICE8 lpD3DDev); 0065: void CleanBg(LPDIRECT3DDEVICE8 lpD3DDev); 0066: 0067: 0068: 0069: // ---------------------------------------------------------------------------- 0070: // Name: LoadXFile(char* filename, LPDIRECT3DDEVICE8 lpD3DDev) 0071: // Desc: X-Fileの読み込み 0072: //----------------------------------------------------------------------------- 0073: HRESULT LoadXFile(char* filename, LPDIRECT3DDEVICE8 lpD3DDev) 0074: { 0075: LPD3DXMESH pMesh, pMeshOpt; 0076: LPD3DXBUFFER pD3DXMtrlBuffer = NULL; 0077: DWORD i; 0078: HRESULT hr; 0079: 0080: hr = D3DXLoadMeshFromX(filename, D3DXMESH_MANAGED, 0081: lpD3DDev, NULL, 0082: &pD3DXMtrlBuffer, &dwNumMaterials, 0083: &pMesh); 0084: if(FAILED(hr)) return E_FAIL; 0085: 0086: //並び替えておく 0087: pMesh->Optimize(D3DXMESHOPT_ATTRSORT, NULL, NULL, NULL, NULL, &pMeshOpt); 0088: RELEASE(pMesh); 0089: 0090: //アトリビュートテーブル 0091: pMeshOpt->GetAttributeTable(NULL,&dwNumMaterials); 0092: pSubsetTable = new D3DXATTRIBUTERANGE[dwNumMaterials]; 0093: pMeshOpt->GetAttributeTable(pSubsetTable, &dwNumMaterials); 0094: 0095: // FVF変換 0096: hr = pMeshOpt->CloneMeshFVF(pMeshOpt->GetOptions(), D3DFVF_VERTEX, lpD3DDev, &pMesh); 0097: if(FAILED(hr)) return E_FAIL; 0098: RELEASE(pMeshOpt); 0099: D3DXComputeNormals(pMesh, NULL); 0100: 0101: //Vertex Bufferにコピーする 0102: D3DVERTEX* pSrc; 0103: D3D_CUSTOMVERTEX* pDest; 0104: LPDIRECT3DINDEXBUFFER8 pSrcIndex; 0105: WORD* pISrc; 0106: WORD* pIDest; 0107: 0108: DWORD nMeshVertices = pMesh->GetNumVertices(); 0109: DWORD nMeshFaces = pMesh->GetNumFaces(); 0110: lpD3DDev->CreateVertexBuffer(nMeshVertices * sizeof(D3D_CUSTOMVERTEX),0,D3DFVF_CUSTOMVERTEX,D3DPOOL_MANAGED,&pMeshVB); 0111: lpD3DDev->CreateIndexBuffer(nMeshFaces * 3 * sizeof(WORD),0,D3DFMT_INDEX16,D3DPOOL_MANAGED,&pMeshIndex); 0112: 0113: LPDIRECT3DVERTEXBUFFER8 pVB; 0114: pMesh->GetVertexBuffer(&pVB); 0115: pVB->Lock(0,0,(BYTE**)&pSrc,0); 0116: pMeshVB->Lock(0,0,(BYTE**)&pDest,0); 0117: MeshRadius = 0.0f; 0118: for(i=0;i<nMeshVertices;i++){ 0119: pDest->x = pSrc->x; 0120: pDest->y = pSrc->y; 0121: pDest->z = pSrc->z; 0122: pDest->nx = pSrc->nx; 0123: pDest->ny = pSrc->ny; 0124: pDest->nz = pSrc->nz; 0125: pDest->tu0 = pSrc->tu0; 0126: pDest->tu0 = pSrc->tu0; 0127: // サイズの計算 0128: FLOAT radius = sqrtf( pSrc->x*pSrc->x + pSrc->y*pSrc->y + pSrc->z*pSrc->z ); 0129: if (MeshRadius < radius) MeshRadius = radius; 0130: 0131: pSrc += 1; 0132: pDest += 1; 0133: } 0134: pVB->Unlock(); 0135: pVB->Release(); 0136: pMeshVB->Unlock(); 0137: 0138: //インデックスのコピー 0139: pMesh->GetIndexBuffer(&pSrcIndex); 0140: pSrcIndex->Lock(0,0,(BYTE**)&pISrc,0); 0141: pMeshIndex->Lock(0,0,(BYTE**)&pIDest,0); 0142: CopyMemory(pIDest,pISrc,nMeshFaces * 3 * sizeof(WORD)); 0143: pSrcIndex->Unlock(); 0144: pMeshIndex->Unlock(); 0145: pSrcIndex->Release(); 0146: 0147: // pD3DXMtrlBuffer から、質感やテクスチャーの情報を読み取る 0148: D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer(); 0149: pMeshTextures = new LPDIRECT3DTEXTURE8[dwNumMaterials]; 0150: pMeshMaterials = new D3DMATERIAL8[dwNumMaterials]; 0151: 0152: for(i = 0; i < dwNumMaterials; i++){ 0153: pMeshMaterials[i] = d3dxMaterials[i].MatD3D; 0154: pMeshMaterials[i].Ambient = pMeshMaterials[i].Diffuse; 0155: hr = D3DXCreateTextureFromFile( lpD3DDev, 0156: d3dxMaterials[i].pTextureFilename, 0157: &pMeshTextures[i] ); 0158: if(FAILED(hr)) pMeshTextures[i] = NULL; 0159: } 0160: RELEASE(pD3DXMtrlBuffer); 0161: 0162: RELEASE(pMesh); 0163: 0164: return S_OK; 0165: } 0166: //----------------------------------------------------------------------------- 0167: // Name: InitRenderTexture() 0168: // Desc: レンダリングテクスチャー用の下準備 0169: //----------------------------------------------------------------------------- 0170: HRESULT InitRenderTexture(LPDIRECT3DDEVICE8 lpD3DDev) 0171: { 0172: HRESULT hr; 0173: DWORD i; 0174: 0175: // 頂点バッファの作成 0176: D3D_BLUR_VERTEX *pBlurDest; 0177: WORD *pIndex; 0178: lpD3DDev->CreateVertexBuffer( 4 * sizeof(D3D_BLUR_VERTEX), 0179: D3DUSAGE_WRITEONLY, D3DFVF_BLUR_VERTEX, D3DPOOL_MANAGED, 0180: &pBlurVB ); 0181: // 頂点をセットアップ 0182: pBlurVB->Lock ( 0, 0, (BYTE**)&pBlurDest, 0 ); 0183: for (i = 0; i < 4; i++) { 0184: pBlurDest->x = (i == 0 || i == 1)?-1:(float)1; 0185: pBlurDest->y = (i == 0 || i == 2)?-1:(float)1; 0186: pBlurDest->z = 0.0f; 0187: pBlurDest->tu = (i == 2 || i == 3)?1:(float)0; 0188: pBlurDest->tv = (i == 0 || i == 2)?1:(float)0; 0189: pBlurDest++; 0190: } 0191: pBlurVB->Unlock (); 0192: // インデックスをセットアップ 0193: lpD3DDev->CreateIndexBuffer( 6 * sizeof(WORD), 0194: 0, 0195: D3DFMT_INDEX16, D3DPOOL_MANAGED, 0196: &pBlurIB ); 0197: pBlurIB->Lock ( 0, 0, (BYTE**)&pIndex, 0 ); 0198: pIndex[0] = 0; pIndex[1] = 1; pIndex[2] = 2; 0199: pIndex[3] = 1; pIndex[4] = 3; pIndex[5] = 2; 0200: pBlurIB->Unlock (); 0201: 0202: 0203: // 描画用テクスチャーを用意する 0204: if( FAILED(hr = lpD3DDev->GetRenderTarget(&pBackbuffer))) return hr; 0205: if(FAILED(lpD3DDev->GetDepthStencilSurface(&lpZbuffer))) return hr; // 追加 0206: 0207: if(FAILED(hr = lpD3DDev->CreateTexture(SHADOWMAP_WIDTH, SHADOWMAP_HEIGHT, 1 0208: , D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8 0209: , D3DPOOL_DEFAULT, &pTextureCol))) 0210: return hr; 0211: if(FAILED(hr = lpD3DDev->CreateTexture(SHADOWMAP_WIDTH, SHADOWMAP_HEIGHT, 1 0212: , D3DUSAGE_DEPTHSTENCIL, D3DFMT_D24S8 0213: , D3DPOOL_DEFAULT, &pTextureZ))) 0214: return hr; 0215: 0216: if(FAILED(pTextureCol->GetSurfaceLevel(0, &pTextureSurfaceCol))) return E_FAIL; 0217: if(FAILED(pTextureZ->GetSurfaceLevel(0, &pTextureSurfaceZ))) return E_FAIL; 0218: 0219: 0220: if(FAILED(D3DXCreateTextureFromFileEx(lpD3DDev, 0221: "spotlight.bmp", 0222: SHADOWMAP_WIDTH, 0223: SHADOWMAP_HEIGHT, 0224: 1, 0225: D3DUSAGE_RENDERTARGET, 0226: D3DFMT_A8R8G8B8, 0227: D3DPOOL_DEFAULT, 0228: D3DX_DEFAULT, 0229: D3DX_DEFAULT, 0230: 0, 0231: NULL, 0232: NULL, 0233: &pLightTexture))) return hr; 0234: 0235: 0236: // シェ-ダーのロード 0237: if ( FAILED( CPixelShaderMgr::Load(lpD3DDev, "shadow.psh", &hShadowPixelShader)) ) return hr; 0238: if ( FAILED(CVertexShaderMgr::Load(lpD3DDev, "shadow.vsh", &hShadowVertexShader, dwDecl)) ) return hr; 0239: 0240: return S_OK; 0241: } 0242: //----------------------------------------------------------------------------- 0243: // Name: InitRender() 0244: // Desc: Load the mesh and build the material and texture arrays 0245: //----------------------------------------------------------------------------- 0246: HRESULT InitRender(LPDIRECT3DDEVICE8 lpD3DDev) 0247: { 0248: HRESULT hr; 0249: 0250: // モデルの読み込み 0251: if ( FAILED(hr = LoadXFile("nsx.x", lpD3DDev)) ) return hr; 0252: 0253: // マスク用テクスチャーの読み込み 0254: if ( FAILED(CTextureMgr::Load(lpD3DDev, "mask.bmp", &pMaskTexture)) ) return hr; 0255: 0256: // バーテックスシェーダーを作成する 0257: if ( FAILED(CVertexShaderMgr::Load(lpD3DDev, "vs.vsh", &hVertexShader, dwDecl)) ) return hr; 0258: if ( FAILED( CPixelShaderMgr::Load(lpD3DDev, "ps.psh", &hPixelShader)) ) return hr; 0259: 0260: // レンダリングテクスチャー用の初期化 0261: InitRenderTexture(lpD3DDev); 0262: 0263: // 背景部分の初期化 0264: InitBg(lpD3DDev); 0265: 0266: // 不変なレジスタの設定 0267: lpD3DDev->SetRenderState( D3DRS_ZENABLE, TRUE ); 0268: lpD3DDev->SetRenderState( D3DRS_LIGHTING, FALSE ); 0269: lpD3DDev->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE); 0270: lpD3DDev->SetVertexShaderConstant(12, &D3DXVECTOR4(0.0f, 0.5f, 1.0f, 2.0f), 1); 0271: 0272: // デカール 0273: lpD3DDev->SetTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR); 0274: lpD3DDev->SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR); 0275: lpD3DDev->SetTextureStageState(0, D3DTSS_MIPFILTER, D3DTEXF_NONE); 0276: 0277: // 影マップ 0278: lpD3DDev->SetTextureStageState(1, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); 0279: lpD3DDev->SetTextureStageState(1, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); 0280: lpD3DDev->SetTextureStageState(1, D3DTSS_MINFILTER, D3DTEXF_LINEAR); 0281: lpD3DDev->SetTextureStageState(1, D3DTSS_MAGFILTER, D3DTEXF_LINEAR); 0282: lpD3DDev->SetTextureStageState(1, D3DTSS_MIPFILTER, D3DTEXF_NONE); 0283: 0284: // ライトマップ 0285: lpD3DDev->SetTextureStageState(2, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP); 0286: lpD3DDev->SetTextureStageState(2, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP); 0287: lpD3DDev->SetTextureStageState(2, D3DTSS_MINFILTER, D3DTEXF_LINEAR); 0288: lpD3DDev->SetTextureStageState(2, D3DTSS_MAGFILTER, D3DTEXF_LINEAR); 0289: lpD3DDev->SetTextureStageState(2, D3DTSS_MIPFILTER, D3DTEXF_NONE); 0290: 0291: return S_OK; 0292: } 0293: //----------------------------------------------------------------------------- 0294: // Name: Render() 0295: // Desc: Draws the scene 0296: //----------------------------------------------------------------------------- 0297: const float z_min = 1.0f; 0298: const float z_max = 70.0f; 0299: D3DXVECTOR4 lightDir(1.0f, 1.0f, 0.5f, 0.0f); 0300: 0301: VOID DrawModel(LPDIRECT3DDEVICE8 lpD3DDev, BOOL bShadowMap) 0302: { 0303: D3DXMATRIX mVP, mWorld, mView, mProj; 0304: D3DXMATRIX mVPL, mLight, mViewL, mProjL; 0305: D3DXMATRIX m; 0306: D3DXVECTOR4 vl; 0307: DWORD i; 0308: 0309: // 0310: // 通常レンダリング用の行列を作成 0311: // 0312: // ビュー行列 0313: D3DXVECTOR3 eye = D3DXVECTOR3(0.0f,1.4f*MeshRadius,2.5f*MeshRadius); 0314: D3DXVECTOR3 lookAt = D3DXVECTOR3(0.0f, 0.0f, 0.0f); 0315: D3DXVECTOR3 up = D3DXVECTOR3(0.0f, 1.0f, 0.0f); 0316: D3DXMatrixLookAtLH(&mView, &eye, &lookAt, &up); 0317: // 射影行列 0318: D3DXMatrixPerspectiveFovLH(&mProj 0319: , D3DXToRadian(60.0f) // 視野角 0320: , (float)WIDTH/(float)HEIGHT // アスペクト比 0321: , z_min, z_max // 最近接距離,最遠方距離 0322: ); 0323: 0324: mVP = mView * mProj; 0325: 0326: // 0327: // ライト方向からのレンダリング用の行列を作成 0328: // 0329: // ビュー行列 0330: D3DXVECTOR3 l_eye = 30.0f*lightDir; 0331: D3DXVECTOR3 l_lookAt = D3DXVECTOR3(0.0f, 0.0f, 0.0f); 0332: D3DXVECTOR3 l_up = D3DXVECTOR3(0.0f, 1.0f, 0.0f); 0333: D3DXMatrixLookAtLH(&mViewL, &l_eye, &l_lookAt, &l_up); 0334: // 射影行列 0335: D3DXMatrixPerspectiveFovLH(&mProjL 0336: , D3DXToRadian(60.0f) // 視野角 0337: , (float)SHADOWMAP_WIDTH/(float)SHADOWMAP_HEIGHT// アスペクト比 0338: , 1.0f, 70.0f // 最近接距離,最遠方距離 0339: ); 0340: mVPL = mViewL * mProjL; 0341: 0342: // 射影空間から、テクスチャーの空間に変換する 0343: float fOffsetX = 0.5f + (0.5f / (float)SHADOWMAP_WIDTH); 0344: float fOffsetY = 0.5f + (0.5f / (float)SHADOWMAP_HEIGHT); 0345: unsigned int range = 0xFFFFFFFF >> (32 - 24); 0346: float fBias = +0.000001f * (float)range;// カリングを反対にするので、通常とは逆のオフセット 0347: D3DXMATRIX mScaleBias( 0.5f, 0.0f, 0.0f, 0.0f, 0348: 0.0f, -0.5f, 0.0f, 0.0f, 0349: 0.0f, 0.0f, (float)range, 0.0f, 0350: fOffsetX, fOffsetY, fBias, 1.0f ); 0351: 0352: mLight = mVPL * mScaleBias; 0353: 0354: // 0355: // レンダリング状態の設定 0356: // 0357: if(bShadowMap){ 0358: lpD3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_CW); 0359: }else{ 0360: lpD3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_CCW); 0361: } 0362: 0363: // 0364: // 外側もでる描画 0365: // 0366: int t = timeGetTime()%314159; 0367: D3DXMatrixTranslation(&m, 1.5f*MeshRadius, 0,0); 0368: D3DXMatrixRotationY( &mWorld, t/1000.0f ); 0369: //D3DXMatrixRotationY( &mWorld, -0.2*PI/2 ); // 撮影角度 0370: mWorld = m * mWorld; 0371: 0372: if(bShadowMap){ 0373: m = mWorld * mVPL; 0374: }else{ 0375: m = mWorld * mLight; 0376: D3DXMatrixTranspose( &m , &m); 0377: lpD3DDev->SetVertexShaderConstant(4,&m, 4); 0378: 0379: m = mWorld * mVP; 0380: } 0381: D3DXMatrixTranspose( &m , &m); 0382: lpD3DDev->SetVertexShaderConstant(0,&m, 4); 0383: 0384: D3DXMatrixInverse( &m, NULL, &mWorld); 0385: D3DXVec4Transform(&vl, &lightDir, &m); 0386: D3DXVec4Normalize(&vl, &vl); 0387: vl[3] = 0.1f;// w成分は環境色の強さ 0388: lpD3DDev->SetVertexShaderConstant(13, &vl, 1); 0389: 0390: lpD3DDev->SetStreamSource(0, pMeshVB, sizeof(D3D_CUSTOMVERTEX)); 0391: lpD3DDev->SetIndices(pMeshIndex,0); 0392: 0393: for(i=0;i<dwNumMaterials;i++){ 0394: //色をセット 0395: D3DXVECTOR4 vl; 0396: vl.x = pMeshMaterials[i].Diffuse.r; 0397: vl.y = pMeshMaterials[i].Diffuse.g; 0398: vl.z = pMeshMaterials[i].Diffuse.b; 0399: lpD3DDev->SetVertexShaderConstant(14, &vl, 1); 0400: 0401: lpD3DDev->SetTexture(0,pMeshTextures[i]); 0402: lpD3DDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0403: pSubsetTable[i].VertexStart, 0404: pSubsetTable[i].VertexCount, 0405: pSubsetTable[i].FaceStart * 3, 0406: pSubsetTable[i].FaceCount); 0407: } 0408: // 0409: // モデル2 0410: // 0411: D3DXMatrixRotationY( &mWorld, -t/3000.0f ); 0412: //D3DXMatrixRotationY( &mWorld, 1.4f*PI/2 ); // 撮影角度 0413: if(bShadowMap){ 0414: m = mWorld * mVPL; 0415: }else{ 0416: m = mWorld * mLight; 0417: D3DXMatrixTranspose( &m , &m); 0418: lpD3DDev->SetVertexShaderConstant(4,&m, 4); 0419: 0420: m = mWorld * mVP; 0421: } 0422: D3DXMatrixTranspose( &m , &m); 0423: lpD3DDev->SetVertexShaderConstant(0,&m, 4); 0424: 0425: D3DXMatrixInverse( &m, NULL, &mWorld); 0426: D3DXVec4Transform(&vl, &lightDir, &m); 0427: D3DXVec4Normalize(&vl, &vl); 0428: vl[3] = 0.1f;// w成分は環境色の強さ 0429: lpD3DDev->SetVertexShaderConstant(13, &vl, 1); 0430: 0431: for(i=0;i<dwNumMaterials;i++){ 0432: //色をセット 0433: D3DXVECTOR4 vl; 0434: vl.x = pMeshMaterials[i].Diffuse.r; 0435: vl.y = pMeshMaterials[i].Diffuse.g; 0436: vl.z = pMeshMaterials[i].Diffuse.b; 0437: lpD3DDev->SetVertexShaderConstant(14, &vl, 1); 0438: 0439: lpD3DDev->SetTexture(0,pMeshTextures[i]); 0440: lpD3DDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0441: pSubsetTable[i].VertexStart, 0442: pSubsetTable[i].VertexCount, 0443: pSubsetTable[i].FaceStart * 3, 0444: pSubsetTable[i].FaceCount); 0445: } 0446: // 0447: // 背景描画 0448: // 0449: if(!bShadowMap){// シャドウマップ作成時は影にならない遠景は表示しない 0450: D3DXMatrixScaling(&mWorld, 3.0f, 3.0f, 3.0f); 0451: 0452: if(bShadowMap){ 0453: m = mWorld * mVPL; 0454: }else{ 0455: m = mWorld * mLight; 0456: D3DXMatrixTranspose( &m , &m); 0457: lpD3DDev->SetVertexShaderConstant(4,&m, 4); 0458: 0459: m = mWorld * mVP; 0460: } 0461: D3DXMatrixTranspose( &m , &m); 0462: lpD3DDev->SetVertexShaderConstant(0,&m, 4); 0463: 0464: lpD3DDev->SetVertexShaderConstant(13, &D3DXVECTOR4(0.0f, 0.0f, 0.0f, 0.0f), 1); 0465: lpD3DDev->SetVertexShaderConstant(14, &D3DXVECTOR4(0.0f, 0.0f, 0.0f, 0.0f), 1); 0466: DrawBg(lpD3DDev); 0467: } 0468: } 0469: //----------------------------------------------------------------------------- 0470: // Name: Render() 0471: // Desc: Draws the scene 0472: //----------------------------------------------------------------------------- 0473: VOID Render(LPDIRECT3DDEVICE8 lpD3DDev) 0474: { 0475: // ------------------------------------------------------------------------ 0476: // 影マップの作成 0477: // ------------------------------------------------------------------------ 0478: // テクスチャーにレンダリングする 0479: lpD3DDev->SetRenderTarget(pTextureSurfaceCol, pTextureSurfaceZ); 0480: // ビューポートの変更 x y w h min_z max_z 0481: D3DVIEWPORT8 newViewport = {0,0,SHADOWMAP_WIDTH, SHADOWMAP_HEIGHT, 0, 1}; 0482: D3DVIEWPORT8 oldViewport; 0483: lpD3DDev->GetViewport(&oldViewport); 0484: lpD3DDev->SetViewport(&newViewport); 0485: // 高速化のために、深度だけ更新する 0486: lpD3DDev->SetRenderState(D3DRS_COLORWRITEENABLE, 0); 0487: // 深度を初期化する 0488: lpD3DDev->Clear(0, NULL, D3DCLEAR_ZBUFFER, 0x000000, 1.0f, 0L); 0489: 0490: // シェーダーの設定 0491: lpD3DDev->SetVertexShader(hVertexShader); 0492: lpD3DDev->SetPixelShader(hPixelShader); 0493: 0494: DrawModel(lpD3DDev, 1); 0495: 0496: // ------------------------------------------------------------------------ 0497: // シーンの作成 0498: // ------------------------------------------------------------------------ 0499: // 描画を戻す 0500: lpD3DDev->SetRenderTarget(pBackbuffer, lpZbuffer ); 0501: lpD3DDev->SetViewport(&oldViewport); 0502: lpD3DDev->SetRenderState(D3DRS_COLORWRITEENABLE, 0x7); 0503: lpD3DDev->Clear(0, NULL, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x000000, 1.0f, 0L); 0504: 0505: // シェーダーの設定 0506: lpD3DDev->SetVertexShader(hShadowVertexShader); 0507: lpD3DDev->SetPixelShader(hShadowPixelShader); 0508: 0509: lpD3DDev->SetTexture( 1, pTextureZ ); // 影マップ 0510: lpD3DDev->SetTexture( 2, pLightTexture ); // ライトテクスチャー 0511: DrawModel(lpD3DDev, 0); 0512: 0513: // 他でレンダリングしても問題が出ない設定にする 0514: lpD3DDev->SetTexture( 0, NULL ); 0515: lpD3DDev->SetTexture( 1, NULL ); 0516: lpD3DDev->SetTexture( 2, NULL ); 0517: lpD3DDev->SetPixelShader(0); 0518: } 0519: //----------------------------------------------------------------------------- 0520: // メッシュオブジェクト削除 0521: //----------------------------------------------------------------------------- 0522: void DeleteMeshObject(void) 0523: { 0524: DWORD i; 0525: 0526: if(pMeshVB == NULL) return; 0527: 0528: for(i=0; i<dwNumMaterials; i++){ 0529: RELEASE(pMeshTextures[i]); 0530: } 0531: delete[] pMeshTextures; 0532: delete[] pMeshMaterials; 0533: delete[] pSubsetTable; 0534: 0535: RELEASE(pMeshVB); 0536: RELEASE(pMeshIndex); 0537: } 0538: //----------------------------------------------------------------------------- 0539: // Name: CleanRender() 0540: // Desc: 後始末 0541: //----------------------------------------------------------------------------- 0542: void CleanRender(LPDIRECT3DDEVICE8 lpD3DDev) 0543: { 0544: CleanBg(lpD3DDev); 0545: 0546: RELEASE(pTextureSurfaceZ); 0547: RELEASE(pTextureSurfaceCol); 0548: RELEASE(pTextureZ); 0549: RELEASE(pTextureCol); 0550: RELEASE(pLightTexture); 0551: 0552: RELEASE(pBackbuffer); 0553: 0554: CPixelShaderMgr::Release(lpD3DDev, &hShadowPixelShader); 0555: CVertexShaderMgr::Release(lpD3DDev, &hShadowVertexShader); 0556: CPixelShaderMgr::Release(lpD3DDev, &hPixelShader); 0557: CVertexShaderMgr::Release(lpD3DDev, &hVertexShader); 0558: 0559: RELEASE(pMaskTexture); 0560: DeleteMeshObject(); 0561: } 0562: