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