0001: // ---------------------------------------------------------------------------- 0002: // 0003: // draw.cpp - 描画部分 0004: // 0005: // Copyright (c) 2002 IF (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: 0015: #include "Cg/cgD3D.h" 0016: 0017: // Cg 環境 0018: cgDirect3D cg; 0019: cgContextContainer * pContextContainer = 0; 0020: // 頂点シェーダー 0021: cgProgramContainer *pVertexProgramContainer = 0; // 頂点シェーダーを扱うコンテナ 0022: cgBindIter * vertex_mat_iter = 0; // ローカル/射影変換を扱う反復子 0023: // ピクセルシェーダー 0024: cgProgramContainer *pPixelProgramContainer = 0; // ピクセルシェーダーを扱うコンテナ 0025: cgBindIter * tex0_iter = 0; // テクスチャーを扱う反復子 0026: 0027: 0028: 0029: 0030: 0031: 0032: // ---------------------------------------------------------------------------- 0033: // 外部関数 0034: void InitBg(LPDIRECT3DDEVICE8 lpD3DDev); 0035: void DrawBg(LPDIRECT3DDEVICE8 lpD3DDev, D3DXMATRIX &mVP); 0036: void CleanBg(LPDIRECT3DDEVICE8 lpD3DDev); 0037: 0038: 0039: //----------------------------------------------------------------------------- 0040: // Name: InitRender() 0041: // Desc: 初期化 0042: //----------------------------------------------------------------------------- 0043: HRESULT InitRender(LPDIRECT3DDEVICE8 lpD3DDev) 0044: { 0045: // 背景部分の初期化 0046: InitBg(lpD3DDev); 0047: 0048: // プログラマぶるシェーダーを使えるようにする 0049: cg.AddFilePath(".."); 0050: pContextContainer = cg.CreateContextContainer(lpD3DDev); 0051: 0052: // 0053: // 頂点シェーダー 0054: // 0055: cgVertexDefinition vertex_attributes[] = { 0056: {D3DVSDT_FLOAT4, "position", 0}, 0057: {D3DVSDT_FLOAT2, "texcoord0", 0}, 0058: CGVERTEXDEFINITIONEND 0059: }; 0060: 0061: pVertexProgramContainer = pContextContainer->LoadCGProgramFromFile( 0062: "vs.cg", "Vertex Shader", cgDX8VertexProfile, vertex_attributes); 0063: 0064: if (pVertexProgramContainer == NULL) { 0065: // エラー表示 0066: const char * listing = pContextContainer->GetLastListing(); 0067: if (listing == 0) listing = "Could not find cgc.exe."; 0068: cg.NotePad("頂点シェーダープログラムの生成に失敗しました\n\n", listing); // メモ帳に出力 0069: 0070: exit(1); // 終了 0071: } 0072: // 頂点データの反復子と、.cg ファイルの引数を関連付ける 0073: vertex_mat_iter = pVertexProgramContainer->GetParameterBindByName("worldviewproj_matrix"); 0074: 0075: // ここのコメントをはずすと、生成されたソースコードが表示される 0076: // const char * object_code = pVertexProgramContainer->GetProgramObjectCode(); 0077: // cg.NotePad("", object_code); 0078: 0079: 0080: // ここのコメントをはずすと、入力すべき頂点情報が表示される 0081: // const char * vert = pVertexProgramContainer->GetVertexDeclaration(); 0082: // cg.NotePad("cg program expects the vertex be defined like this:\n", vert); 0083: 0084: // 0085: // ピクセルシェーダー 0086: // 0087: pPixelProgramContainer = pContextContainer->LoadCGProgramFromFile( 0088: "ps.cg", "test", cgDX8PixelProfile); 0089: 0090: if (NULL == pPixelProgramContainer) { 0091: // エラー表示 0092: const char * error_text = pContextContainer->GetLastListing(); 0093: cg.NotePad("ピクセルシェーダープログラムの生成に失敗しました\n\n\n", error_text); 0094: 0095: exit(1); // 終了 0096: } 0097: // ここのコメントをはずすと、生成されたソースコードが表示される 0098: // const char *pixel_object_code = pPixelProgramContainer->GetProgramObjectCode(); 0099: // cg.NotePad("", pixel_object_code); 0100: 0101: // テクスチャーの反復子と、.cg ファイルの引数を関連付ける 0102: tex0_iter = pPixelProgramContainer->GetTextureBindByName("tex0"); 0103: int t0 = pPixelProgramContainer->GetTexturePosition(tex0_iter); 0104: 0105: 0106: // 不変なレジスタの設定 0107: lpD3DDev->SetRenderState( D3DRS_ZENABLE, TRUE ); 0108: lpD3DDev->SetRenderState( D3DRS_LIGHTING, FALSE ); 0109: lpD3DDev->SetRenderState( D3DRS_ALPHABLENDENABLE, FALSE); 0110: 0111: return S_OK; 0112: } 0113: 0114: //----------------------------------------------------------------------------- 0115: // Name: Render() 0116: // Desc: Draws the scene 0117: //----------------------------------------------------------------------------- 0118: VOID Render(LPDIRECT3DDEVICE8 lpD3DDev) 0119: { 0120: D3DXMATRIX mWorld, mView, mProj, m; 0121: 0122: // ビュー行列 0123: D3DXVECTOR3 eye = D3DXVECTOR3(0.0f, 2.0f, 4.0f); 0124: D3DXVECTOR3 lookAt = D3DXVECTOR3(0.0f, 1.0f, 0.0f); 0125: D3DXVECTOR3 up = D3DXVECTOR3(0.0f, 1.0f, 0.0f); 0126: // 通常表示 0127: D3DXMatrixLookAtLH(&mView, &eye, &lookAt, &up); 0128: D3DXMatrixPerspectiveFovLH(&mProj 0129: ,60.0f*PI/180.0f // 視野角 0130: ,(float)WIDTH/(float)HEIGHT // アスペクト比 0131: ,0.01f,100.0f // 最近接距離,最遠方距離 0132: ); 0133: D3DXMATRIX mat = mView * mProj; 0134: 0135: // 0136: // 描画 0137: // 0138: 0139: // プログラマぶるシェーダーを有効にする 0140: pVertexProgramContainer->SetShaderActive(); 0141: pPixelProgramContainer->SetShaderActive(); 0142: 0143: DrawBg(lpD3DDev, mat); 0144: } 0145: //----------------------------------------------------------------------------- 0146: // Name: CleanRender() 0147: // Desc: 後始末 0148: //----------------------------------------------------------------------------- 0149: void CleanRender(LPDIRECT3DDEVICE8 lpD3DDev) 0150: { 0151: CleanBg(lpD3DDev); 0152: } 0153: