0001: // ----------------------------------------------------------------------------
0002: //
0003: // draw.cpp - 描画部分
0004: //
0005: // Copyright (c) 2002 IMAGIRE Takashi (imagire@gmail.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: float IdMgr::id;
0017:
0018:
0019: // モデル用
0020: LPDIRECT3DVERTEXBUFFER8 pMeshVB = NULL;
0021: LPDIRECT3DINDEXBUFFER8 pMeshIndex = NULL;
0022: D3DXATTRIBUTERANGE *pSubsetTable = NULL;
0023: DWORD nMeshFaces = 0;
0024: DWORD nMeshVertices = 0;
0025: D3DMATERIAL8 *pMeshMaterials = NULL; // メッシュの質感
0026: LPDIRECT3DTEXTURE8 *pMeshTextures = NULL; // メッシュのテクスチャー
0027: DWORD dwNumMaterials = 0L; // マテリアルの数
0028: FLOAT MeshRadius; // メッシュの大きさ
0029:
0030: // レンダリングテクスチャーの設定
0031: DWORD hVertexShaderNormal=~0;
0032: DWORD hPixelShaderNormal=~0;
0033: DWORD hVertexShaderNormalEdge=~0;
0034: DWORD hPixelShaderNormalEdge=~0;
0035:
0036: LPDIRECT3DTEXTURE8 pTexture;
0037: LPDIRECT3DSURFACE8 pTextureSurface;
0038: LPDIRECT3DSURFACE8 pBackbuffer = NULL;
0039: DWORD hVertexShader=~0;
0040: DWORD hPixelShader=~0;
0041:
0042:
0043: // 最後の一枚絵の描画用
0044: DWORD hFinalVertexShader=~0;
0045: DWORD hFinalPixelShader=~0;
0046: LPDIRECT3DVERTEXBUFFER8 pFinalVB = NULL;
0047: LPDIRECT3DINDEXBUFFER8 pFinalIB = NULL;
0048:
0049: typedef struct {
0050: float x,y,z;
0051: float tu,tv;
0052: }D3D_FINAL_VERTEX;
0053: #define D3DFVF_FINAL_VERTEX (D3DFVF_XYZ | D3DFVF_TEX1)
0054:
0055: DWORD dwFinalDecl[] = {
0056: D3DVSD_STREAM(0),
0057: D3DVSD_REG(D3DVSDE_POSITION, D3DVSDT_FLOAT3 ), //D3DVSDE_POSITION, 0
0058: D3DVSD_REG(D3DVSDE_TEXCOORD0,D3DVSDT_FLOAT2 ), //D3DVSDE_TEXCOORD0, 7
0059: D3DVSD_END()
0060: };
0061:
0062:
0063: // ----------------------------------------------------------------------------
0064: // 外部関数
0065: void InitBg(LPDIRECT3DDEVICE8 lpD3DDev);
0066: void DrawBg(LPDIRECT3DDEVICE8 lpD3DDev);
0067: void CleanBg(LPDIRECT3DDEVICE8 lpD3DDev);
0068:
0069:
0070:
0071: // ----------------------------------------------------------------------------
0072: // Name: LoadXFile(char* filename, LPDIRECT3DDEVICE8 lpD3DDev)
0073: // Desc: X-Fileの読み込み
0074: //-----------------------------------------------------------------------------
0075: HRESULT LoadXFile(char* filename, LPDIRECT3DDEVICE8 lpD3DDev)
0076: {
0077: LPD3DXMESH pMesh, pMeshOpt;
0078: LPD3DXBUFFER pD3DXMtrlBuffer = NULL;
0079: DWORD i;
0080: HRESULT hr;
0081:
0082: hr = D3DXLoadMeshFromX(filename, D3DXMESH_MANAGED,
0083: lpD3DDev, NULL,
0084: &pD3DXMtrlBuffer, &dwNumMaterials,
0085: &pMesh);
0086: if(FAILED(hr)) return E_FAIL;
0087:
0088: //並び替えておく
0089: pMesh->Optimize(D3DXMESHOPT_ATTRSORT, NULL, NULL, NULL, NULL, &pMeshOpt);
0090: RELEASE(pMesh);
0091:
0092: //アトリビュートテーブル
0093: pMeshOpt->GetAttributeTable(NULL,&dwNumMaterials);
0094: pSubsetTable = new D3DXATTRIBUTERANGE[dwNumMaterials];
0095: pMeshOpt->GetAttributeTable(pSubsetTable, &dwNumMaterials);
0096:
0097: // FVF変換
0098: hr = pMeshOpt->CloneMeshFVF(pMeshOpt->GetOptions(), D3DFVF_VERTEX, lpD3DDev, &pMesh);
0099: if(FAILED(hr)) return E_FAIL;
0100: RELEASE(pMeshOpt);
0101: D3DXComputeNormals(pMesh, NULL);
0102:
0103: //Vertex Bufferにコピーする
0104: D3DVERTEX* pSrc;
0105: D3D_CUSTOMVERTEX* pDest;
0106: LPDIRECT3DINDEXBUFFER8 pSrcIndex;
0107: WORD* pISrc;
0108: WORD* pIDest;
0109:
0110: DWORD nMeshVertices = pMesh->GetNumVertices();
0111: DWORD nMeshFaces = pMesh->GetNumFaces();
0112: lpD3DDev->CreateVertexBuffer(nMeshVertices * sizeof(D3D_CUSTOMVERTEX),0,D3DFVF_CUSTOMVERTEX,D3DPOOL_MANAGED,&pMeshVB);
0113: lpD3DDev->CreateIndexBuffer(nMeshFaces * 3 * sizeof(WORD),0,D3DFMT_INDEX16,D3DPOOL_MANAGED,&pMeshIndex);
0114:
0115: LPDIRECT3DVERTEXBUFFER8 pVB;
0116: pMesh->GetVertexBuffer(&pVB);
0117: pVB->Lock(0,0,(BYTE**)&pSrc,0);
0118: pMeshVB->Lock(0,0,(BYTE**)&pDest,0);
0119: MeshRadius = 0.0f;
0120: for(i=0;i<nMeshVertices;i++){
0121: pDest->x = pSrc->x;
0122: pDest->y = pSrc->y;
0123: pDest->z = pSrc->z;
0124: pDest->nx = pSrc->nx;
0125: pDest->ny = pSrc->ny;
0126: pDest->nz = pSrc->nz;
0127: pDest->tu0 = pSrc->tu0;
0128: pDest->tu0 = pSrc->tu0;
0129: // サイズの計算
0130: FLOAT radius = sqrtf( pSrc->x*pSrc->x + pSrc->y*pSrc->y + pSrc->z*pSrc->z );
0131: if (MeshRadius < radius) MeshRadius = radius;
0132:
0133: pSrc += 1;
0134: pDest += 1;
0135: }
0136: pVB->Unlock();
0137: pVB->Release();
0138: pMeshVB->Unlock();
0139:
0140: //インデックスのコピー
0141: pMesh->GetIndexBuffer(&pSrcIndex);
0142: pSrcIndex->Lock(0,0,(BYTE**)&pISrc,0);
0143: pMeshIndex->Lock(0,0,(BYTE**)&pIDest,0);
0144: CopyMemory(pIDest,pISrc,nMeshFaces * 3 * sizeof(WORD));
0145: pSrcIndex->Unlock();
0146: pMeshIndex->Unlock();
0147: pSrcIndex->Release();
0148:
0149: // pD3DXMtrlBuffer から、質感やテクスチャーの情報を読み取る
0150: D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
0151: pMeshTextures = new LPDIRECT3DTEXTURE8[dwNumMaterials];
0152: pMeshMaterials = new D3DMATERIAL8[dwNumMaterials];
0153:
0154: for(i = 0; i < dwNumMaterials; i++){
0155: pMeshMaterials[i] = d3dxMaterials[i].MatD3D;
0156: pMeshMaterials[i].Ambient = pMeshMaterials[i].Diffuse;
0157: hr = D3DXCreateTextureFromFile( lpD3DDev,
0158: d3dxMaterials[i].pTextureFilename,
0159: &pMeshTextures[i] );
0160: if(FAILED(hr)) pMeshTextures[i] = NULL;
0161: }
0162: RELEASE(pD3DXMtrlBuffer);
0163:
0164: RELEASE(pMesh);
0165:
0166: return S_OK;
0167: }
0168: //-----------------------------------------------------------------------------
0169: // Name: InitRenderTexture()
0170: // Desc: レンダリングテクスチャー用の下準備
0171: //-----------------------------------------------------------------------------
0172: HRESULT InitRenderTexture(LPDIRECT3DDEVICE8 lpD3DDev)
0173: {
0174: HRESULT hr;
0175: DWORD i;
0176:
0177: // バーテックスシェーダーを作成する
0178: hr=CVertexShaderMgr::Load(lpD3DDev, "normal.vsh", &hVertexShaderNormal, dwDecl);
0179: if( FAILED(hr) ) return hr;
0180: hr=CPixelShaderMgr::Load(lpD3DDev, "normal.psh", &hPixelShaderNormal);
0181: if( FAILED(hr) ) return hr;
0182: hr=CVertexShaderMgr::Load(lpD3DDev, "normaledge.vsh", &hVertexShaderNormalEdge, dwFinalDecl);
0183: if( FAILED(hr) ) return hr;
0184: hr=CPixelShaderMgr::Load(lpD3DDev, "normaledge.psh", &hPixelShaderNormalEdge);
0185: if( FAILED(hr) ) return hr;
0186: hr=CVertexShaderMgr::Load(lpD3DDev, "vs.vsh", &hVertexShader, dwDecl);
0187: if( FAILED(hr) ) return hr;
0188: hr=CPixelShaderMgr::Load(lpD3DDev, "ps.psh", &hPixelShader);
0189: if( FAILED(hr) ) return hr;
0190: hr=CVertexShaderMgr::Load(lpD3DDev, "final.vsh", &hFinalVertexShader, dwFinalDecl);
0191: if( FAILED(hr) ) return hr;
0192: hr=CPixelShaderMgr::Load(lpD3DDev, "final.psh", &hFinalPixelShader);
0193: if( FAILED(hr) ) return hr;
0194:
0195: // 頂点バッファの作成
0196: D3D_FINAL_VERTEX *pDest;
0197: WORD *pIndex;
0198: hr = lpD3DDev->CreateVertexBuffer( 4 * sizeof(D3D_FINAL_VERTEX),
0199: D3DUSAGE_WRITEONLY, D3DFVF_FINAL_VERTEX, D3DPOOL_MANAGED,
0200: &pFinalVB );
0201: // 頂点をセットアップ
0202: pFinalVB->Lock ( 0, 0, (BYTE**)&pDest, 0 );
0203: for (i = 0; i < 4; i++) {
0204: pDest->x = (i == 0 || i == 1)?-1:(float)1;
0205: pDest->y = (i == 0 || i == 2)?-1:(float)1;
0206: pDest->z = 0.5f;
0207: pDest->tu = (i == 2 || i == 3)?1:(float)0;
0208: pDest->tv = (i == 0 || i == 2)?1:(float)0;
0209: pDest++;
0210: }
0211: pFinalVB->Unlock ();
0212: // インデックスをセットアップ
0213: hr = lpD3DDev->CreateIndexBuffer( 6 * sizeof(WORD),
0214: 0,
0215: D3DFMT_INDEX16, D3DPOOL_MANAGED,
0216: &pFinalIB );
0217: pFinalIB->Lock ( 0, 0, (BYTE**)&pIndex, 0 );
0218: pIndex[0] = 0; pIndex[1] = 1; pIndex[2] = 2;
0219: pIndex[3] = 1; pIndex[4] = 3; pIndex[5] = 2;
0220: pFinalIB->Unlock ();
0221:
0222: // -------------------------------------------------------------------------
0223: // 定数レジスタの設定
0224: // -------------------------------------------------------------------------
0225: float const inv_w = 1.0f / (float)WIDTH;
0226: float const inv_h = 1.0f / (float)HEIGHT;
0227: lpD3DDev->SetVertexShaderConstant(20, &D3DXVECTOR4 (-0.5f*inv_w, -0.5f*inv_h, 0.0f, 0.0f), 1);
0228: lpD3DDev->SetVertexShaderConstant(21, &D3DXVECTOR4 (+0.5f*inv_w, -0.5f*inv_h, 0.0f, 0.0f), 1);
0229: lpD3DDev->SetVertexShaderConstant(22, &D3DXVECTOR4 (-0.5f*inv_w, +0.5f*inv_h, 0.0f, 0.0f), 1);
0230: lpD3DDev->SetVertexShaderConstant(23, &D3DXVECTOR4 (+0.5f*inv_w, +0.5f*inv_h, 0.0f, 0.0f), 1);
0231: // 便利な定数
0232: lpD3DDev->SetVertexShaderConstant(12, &D3DXVECTOR4 (0.0f, 0.5f, 1.0f, 2.0f), 1);
0233:
0234: // z値を0.0fから1.0fに補正する定数
0235: float lz_min = 15.0f;
0236: float lz_max = 50.0f;
0237: float q = lz_max /(lz_max-lz_min);
0238: float qz = lz_max*lz_min/(lz_max-lz_min);
0239: lpD3DDev->SetVertexShaderConstant(15, &D3DXVECTOR4(q,-qz, 0.0f, 0.0f), 1);
0240:
0241: // -------------------------------------------------------------------------
0242: // 描画用テクスチャーを用意する
0243: // -------------------------------------------------------------------------
0244: D3DSURFACE_DESC Desc;
0245: LPDIRECT3DSURFACE8 lpZbuffer = NULL;
0246: if( FAILED(hr = lpD3DDev->GetRenderTarget(&pBackbuffer))) return hr;
0247: if( FAILED(hr = pBackbuffer->GetDesc( &Desc ))) return hr;
0248:
0249: // 深度バッファのサーフェスを確保する
0250: if( FAILED(hr = lpD3DDev->GetDepthStencilSurface( &lpZbuffer ))) return hr;
0251:
0252: // テクスチャーの生成
0253: if( FAILED(hr = lpD3DDev->CreateTexture(Desc.Width, Desc.Height, 1
0254: , D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8
0255: , D3DPOOL_DEFAULT, &pTexture))) return hr;
0256: // テクスチャーとサーフェスを関連づける
0257: if( FAILED(hr = pTexture->GetSurfaceLevel(0,&pTextureSurface))) return hr;
0258: // テクスチャー用の描画と深度バッファを関連付ける
0259: if( FAILED(hr = lpD3DDev->SetRenderTarget(pTextureSurface, lpZbuffer)))
0260: return hr;
0261:
0262: // 描画を元の画面に戻す
0263: lpD3DDev->SetRenderTarget(pBackbuffer, lpZbuffer );
0264:
0265: return S_OK;
0266: }
0267: //-----------------------------------------------------------------------------
0268: // Name: InitRender()
0269: // Desc: Load the mesh and build the material and texture arrays
0270: //-----------------------------------------------------------------------------
0271: D3DXVECTOR4 lightDir(1.0f, 1.0f, 0.5f, 0.0f);
0272:
0273: HRESULT InitRender(LPDIRECT3DDEVICE8 lpD3DDev)
0274: {
0275: HRESULT hr;
0276:
0277: // モデルの読み込み
0278: if ( FAILED(hr = LoadXFile("nsx.x", lpD3DDev)) ) return hr;
0279:
0280: // レンダリングテクスチャー用の初期化
0281: InitRenderTexture(lpD3DDev);
0282:
0283: // 背景部分の初期化
0284: InitBg(lpD3DDev);
0285:
0286: // 不変なレジスタの設定
0287: lpD3DDev->SetRenderState( D3DRS_ZENABLE, TRUE );
0288: for (DWORD i = 0; i < 4; ++i) {
0289: lpD3DDev->SetTextureStageState(i, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
0290: lpD3DDev->SetTextureStageState(i, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
0291: lpD3DDev->SetTextureStageState(i, D3DTSS_MIPFILTER, D3DTEXF_NONE);
0292: lpD3DDev->SetTextureStageState(i,D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP);
0293: lpD3DDev->SetTextureStageState(i,D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP);
0294: }
0295:
0296: // 光源の設定
0297: D3DLIGHT8 light;
0298: ZeroMemory( &light, sizeof(D3DLIGHT8) );
0299: light.Type = D3DLIGHT_DIRECTIONAL;
0300: light.Diffuse.r = 1.0f;
0301: light.Diffuse.g = 1.0f;
0302: light.Diffuse.b = 1.0f;
0303: D3DXVECTOR3 vecDir = D3DXVECTOR3(-lightDir.x, -lightDir.y, lightDir.z);
0304: D3DXVec3Normalize( (D3DXVECTOR3*)&light.Direction, &vecDir );
0305: lpD3DDev->SetLight( 0, &light );
0306: lpD3DDev->LightEnable( 0, TRUE );
0307: lpD3DDev->SetRenderState( D3DRS_AMBIENT, 0x00404040 );
0308:
0309: return S_OK;
0310: }
0311: //-----------------------------------------------------------------------------
0312: // Name: DrawModel()
0313: // Desc: Draw Models
0314: //-----------------------------------------------------------------------------
0315:
0316: VOID DrawModel(LPDIRECT3DDEVICE8 lpD3DDev)
0317: {
0318: D3DXMATRIX mWorld, mView, mProj, m;
0319: D3DXVECTOR4 vl;
0320: DWORD i;
0321:
0322: // ビュー行列
0323: D3DXVECTOR3 eye = D3DXVECTOR3(0.0f,18,30);
0324: D3DXVECTOR3 lookAt = D3DXVECTOR3(0.0f, 0.0f, 0.0f);
0325: D3DXVECTOR3 up = D3DXVECTOR3(0.0f, 1.0f, 0.0f);
0326: D3DXMatrixLookAtLH(&mView, &eye, &lookAt, &up);
0327:
0328: // 射影行列
0329: D3DXMatrixPerspectiveFovLH(&mProj
0330: ,60.0f*PI/180.0f // 視野角
0331: ,(float)WIDTH/(float)HEIGHT // アスペクト比
0332: ,0.01f,100.0f // 最近接距離,最遠方距離
0333: );
0334:
0335: //
0336: // 背景描画
0337: //
0338: D3DXMatrixScaling(&mWorld, 3.0f, 3.0f, 3.0f);
0339: m = mWorld * mView * mProj;
0340: D3DXMatrixTranspose( &m , &m);
0341: lpD3DDev->SetVertexShaderConstant(0,&m, 4);
0342: lpD3DDev->SetVertexShaderConstant(14, &D3DXVECTOR4(0,0,0,0), 1);
0343:
0344: D3DXMatrixInverse( &m, NULL, &mWorld);
0345: D3DXVec4Transform(&vl, &lightDir, &m);
0346: D3DXVec4Normalize(&vl, &vl);
0347: vl[3] = 0.3f;
0348: lpD3DDev->SetVertexShaderConstant(13, &vl, 1);
0349:
0350: DrawBg(lpD3DDev);
0351:
0352: //
0353: // 外側もでる描画
0354: //
0355: lpD3DDev->SetRenderState( D3DRS_LIGHTING, TRUE );
0356:
0357: lpD3DDev->SetStreamSource(0, pMeshVB, sizeof(D3D_CUSTOMVERTEX));
0358: lpD3DDev->SetIndices(pMeshIndex,0);
0359:
0360: int t = timeGetTime();
0361: D3DXMatrixTranslation(&m, 1.5f*MeshRadius, 0,0);
0362: D3DXMatrixRotationY( &mWorld, t/1000.0f );
0363: //D3DXMatrixRotationY( &mWorld, -0.2*PI/2 );
0364: mWorld = m * mWorld;
0365: m = mWorld * mView * mProj;
0366: D3DXMatrixTranspose( &m , &m);
0367: lpD3DDev->SetVertexShaderConstant(0,&m, 4);
0368:
0369: D3DXMatrixInverse( &m, NULL, &mWorld);
0370: D3DXVec4Transform(&vl, &lightDir, &m);
0371: D3DXVec4Normalize(&vl, &vl);
0372: vl[3] = 0.3f;
0373: lpD3DDev->SetVertexShaderConstant(13, &vl, 1);
0374:
0375: IdMgr::Reset();
0376: for(i=0;i<dwNumMaterials;i++){
0377: D3DXVECTOR4 vl;
0378: vl.x = pMeshMaterials[i].Diffuse.r;
0379: vl.y = pMeshMaterials[i].Diffuse.g;
0380: vl.z = pMeshMaterials[i].Diffuse.b;
0381: lpD3DDev->SetVertexShaderConstant(14, &vl, 1);
0382: lpD3DDev->SetVertexShaderConstant(16, &D3DXVECTOR4(0,0,0,IdMgr::GetId()), 1);
0383:
0384: lpD3DDev->SetMaterial( &pMeshMaterials[i] );
0385: lpD3DDev->SetTexture(0,pMeshTextures[i]);
0386: lpD3DDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
0387: pSubsetTable[i].VertexStart,
0388: pSubsetTable[i].VertexCount,
0389: pSubsetTable[i].FaceStart * 3,
0390: pSubsetTable[i].FaceCount);
0391: }
0392: //
0393: // 内側もでる描画
0394: //
0395: D3DXMatrixRotationY( &mWorld, -t/3000.0f );
0396: //D3DXMatrixRotationY( &mWorld, -1.4f*PI/2 );
0397: m = mWorld * mView * mProj;
0398: D3DXMatrixTranspose( &m , &m);
0399: lpD3DDev->SetVertexShaderConstant(0,&m, 4);
0400:
0401: D3DXMatrixInverse( &m, NULL, &mWorld);
0402: D3DXVec4Transform(&vl, &lightDir, &m);
0403: D3DXVec4Normalize(&vl, &vl);
0404: vl[3] = 0.3f;
0405: lpD3DDev->SetVertexShaderConstant(13, &vl, 1);
0406:
0407: IdMgr::Reset();
0408: for(i=0;i<dwNumMaterials;i++){
0409: D3DXVECTOR4 vl;
0410: vl.x = pMeshMaterials[i].Diffuse.r;
0411: vl.y = pMeshMaterials[i].Diffuse.g;
0412: vl.z = pMeshMaterials[i].Diffuse.b;
0413: lpD3DDev->SetVertexShaderConstant(14, &vl, 1);
0414: lpD3DDev->SetVertexShaderConstant(16, &D3DXVECTOR4(0,0,0,IdMgr::GetId()), 1);
0415:
0416: lpD3DDev->SetMaterial( &pMeshMaterials[i] );
0417: lpD3DDev->SetTexture(0,pMeshTextures[i]);
0418: lpD3DDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST,
0419: pSubsetTable[i].VertexStart,
0420: pSubsetTable[i].VertexCount,
0421: pSubsetTable[i].FaceStart * 3,
0422: pSubsetTable[i].FaceCount);
0423: }
0424: lpD3DDev->SetRenderState( D3DRS_LIGHTING, FALSE );
0425: }
0426: //-----------------------------------------------------------------------------
0427: // Name: Render()
0428: // Desc: Draw the scene
0429: //-----------------------------------------------------------------------------
0430: VOID Render(LPDIRECT3DDEVICE8 lpD3DDev)
0431: {
0432: DWORD i;
0433: LPDIRECT3DSURFACE8 lpZbuffer = NULL;
0434:
0435: IdMgr::Reset();
0436:
0437: lpD3DDev->GetDepthStencilSurface( &lpZbuffer );
0438: // -----------------------------------------------------
0439: // 法線エッジの作成
0440: // -----------------------------------------------------
0441: // テクスチャーに描画
0442: lpD3DDev->SetRenderTarget(pTextureSurface, lpZbuffer);
0443: lpD3DDev->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_SELECTARG1);
0444: lpD3DDev->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_DIFFUSE);
0445: lpD3DDev->SetTextureStageState(1,D3DTSS_COLOROP, D3DTOP_DISABLE);
0446: lpD3DDev->SetVertexShader(hVertexShaderNormal);
0447: lpD3DDev->SetPixelShader(hPixelShaderNormal);
0448: DrawModel(lpD3DDev);
0449:
0450: // 描画をバックバッファに戻す
0451: lpD3DDev->SetRenderTarget(pBackbuffer, lpZbuffer );
0452: for (i = 0; i < 4; i++) {
0453: lpD3DDev->SetTextureStageState(i, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP);
0454: lpD3DDev->SetTextureStageState(i, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP);
0455: lpD3DDev->SetTextureStageState(i, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
0456: lpD3DDev->SetTextureStageState(i, D3DTSS_COLORARG1, D3DTA_TEXTURE);
0457: lpD3DDev->SetTexture( i, pTexture ); // テクスチャー
0458: }
0459:
0460: lpD3DDev->SetVertexShader(hVertexShaderNormalEdge);
0461: lpD3DDev->SetPixelShader(hPixelShaderNormalEdge);
0462: lpD3DDev->SetStreamSource( 0, pFinalVB, sizeof(D3D_FINAL_VERTEX) );
0463: lpD3DDev->SetIndices(pFinalIB,0);
0464: lpD3DDev->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, 4, 0, 2 );
0465:
0466: lpD3DDev->SetTexture( 0, NULL);
0467: lpD3DDev->SetTexture( 1, NULL);
0468: lpD3DDev->SetTexture( 2, NULL);
0469: lpD3DDev->SetTexture( 3, NULL);
0470: // -----------------------------------------------------
0471: // 深度エッジと色の作成
0472: // -----------------------------------------------------
0473: // テクスチャーに描画
0474: lpD3DDev->SetRenderTarget(pTextureSurface, lpZbuffer);
0475: lpD3DDev->Clear(0,NULL, D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0),1.0f,0);
0476: lpD3DDev->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_MODULATE);
0477: lpD3DDev->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_TEXTURE);
0478: lpD3DDev->SetTextureStageState(0,D3DTSS_COLORARG2, D3DTA_DIFFUSE);
0479: lpD3DDev->SetTextureStageState(1,D3DTSS_COLOROP, D3DTOP_DISABLE);
0480: lpD3DDev->SetVertexShader(hVertexShader);
0481: lpD3DDev->SetPixelShader(hPixelShader);
0482: DrawModel(lpD3DDev);
0483:
0484: // 描画をバックバッファに戻す
0485: lpD3DDev->SetRenderTarget(pBackbuffer, lpZbuffer );
0486: for (i = 0; i < 4; i++) {
0487: lpD3DDev->SetTextureStageState(i, D3DTSS_ADDRESSU, D3DTADDRESS_CLAMP);
0488: lpD3DDev->SetTextureStageState(i, D3DTSS_ADDRESSV, D3DTADDRESS_CLAMP);
0489: lpD3DDev->SetTextureStageState(i, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
0490: lpD3DDev->SetTextureStageState(i, D3DTSS_COLORARG1, D3DTA_TEXTURE);
0491: lpD3DDev->SetTexture( i, pTexture ); // テクスチャー
0492: }
0493: lpD3DDev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_ZERO);
0494: lpD3DDev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_DESTCOLOR);
0495: lpD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
0496:
0497: lpD3DDev->SetVertexShader(hFinalVertexShader);
0498: lpD3DDev->SetPixelShader(hFinalPixelShader);
0499: lpD3DDev->SetStreamSource( 0, pFinalVB, sizeof(D3D_FINAL_VERTEX) );
0500: lpD3DDev->SetIndices(pFinalIB,0);
0501: lpD3DDev->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, 4, 0, 2 );
0502:
0503: lpD3DDev->SetPixelShader(0);
0504: lpD3DDev->SetTexture( 0, NULL);
0505: lpD3DDev->SetTexture( 1, NULL);
0506: lpD3DDev->SetTexture( 2, NULL);
0507: lpD3DDev->SetTexture( 3, NULL);
0508: lpD3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);
0509: #if 0
0510: // 描画した画面をテクスチャーとして描く
0511: {
0512: struct TLVERTEX
0513: {
0514: float x,y,z,rhw;
0515: float tu,tv;
0516: };
0517: #define FVF_TLVERTEX (D3DFVF_XYZRHW | D3DFVF_TEX1)
0518: lpD3DDev->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_SELECTARG1);
0519: lpD3DDev->SetTextureStageState(0,D3DTSS_COLORARG1, D3DTA_TEXTURE);
0520: lpD3DDev->SetTextureStageState(1,D3DTSS_COLOROP, D3DTOP_DISABLE);
0521: float scale = 512.0f;
0522: TLVERTEX Vertex[4] = {
0523: // x y z rhw tu tv
0524: { 0, 0,0, 1, 0, 0,},
0525: {scale, 0,0, 1, 1, 0,},
0526: {scale,scale,0, 1, 1, 1,},
0527: { 0,scale,0, 1, 0, 1,},
0528: };
0529: lpD3DDev->SetTexture( 0, pTexture );
0530: lpD3DDev->SetVertexShader( FVF_TLVERTEX );
0531: lpD3DDev->SetPixelShader(0);
0532: lpD3DDev->DrawPrimitiveUP( D3DPT_TRIANGLEFAN, 2, Vertex, sizeof( TLVERTEX ) );
0533: }
0534: #endif
0535: }
0536: //-----------------------------------------------------------------------------
0537: // メッシュオブジェクト削除
0538: //-----------------------------------------------------------------------------
0539: void DeleteMeshObject(void)
0540: {
0541: DWORD i;
0542:
0543: if(pMeshVB == NULL) return;
0544:
0545: for(i=0; i<dwNumMaterials; i++){
0546: RELEASE(pMeshTextures[i]);
0547: }
0548: delete[] pMeshTextures;
0549: delete[] pMeshMaterials;
0550: delete[] pSubsetTable;
0551:
0552: RELEASE(pMeshVB);
0553: RELEASE(pMeshIndex);
0554: }
0555: //-----------------------------------------------------------------------------
0556: // Name: CleanRender()
0557: // Desc: 後始末
0558: //-----------------------------------------------------------------------------
0559: void CleanRender(LPDIRECT3DDEVICE8 lpD3DDev)
0560: {
0561: CleanBg(lpD3DDev);
0562:
0563: RELEASE(pTextureSurface);
0564: RELEASE(pTexture);
0565: RELEASE(pBackbuffer);
0566:
0567: RELEASE(pFinalIB);
0568: RELEASE(pFinalVB);
0569: CPixelShaderMgr::Release(lpD3DDev, &hFinalPixelShader);
0570: CVertexShaderMgr::Release(lpD3DDev, &hFinalVertexShader);
0571: CPixelShaderMgr::Release(lpD3DDev, &hPixelShader);
0572: CVertexShaderMgr::Release(lpD3DDev, &hVertexShader);
0573: CPixelShaderMgr::Release(lpD3DDev, &hPixelShaderNormal);
0574: CVertexShaderMgr::Release(lpD3DDev, &hVertexShaderNormal);
0575: CPixelShaderMgr::Release(lpD3DDev, &hPixelShaderNormalEdge);
0576: CVertexShaderMgr::Release(lpD3DDev, &hVertexShaderNormalEdge);
0577:
0578: DeleteMeshObject();
0579: }
0580: