sinWaveVertexShader.cpp
上传用户:junlon
上传日期:2022-01-05
资源大小:39075k
文件大小:5k
源码类别:

DirextX编程

开发平台:

Visual C++

  1. #include "zfxd3dUtility.h"
  2. #include "Terrain.h"
  3. #include <stdio.h>
  4. // D3D对象接口
  5. IDirect3D9* g_pd3d;
  6. // D3D设备接口
  7. IDirect3DDevice9* g_pd3dDevice;
  8. // 字体
  9. ID3DXFont* g_pFont = NULL;
  10. D3DXMATRIX g_proj;
  11. LPDIRECT3DVERTEXSHADER9 vertexShader;
  12. CZFXTerrain g_terrain;
  13. // 建立渲染环境
  14. bool Setup()
  15. {
  16. float height[200][200];
  17. for(int i=0;i<200;i++){
  18. for (int j=0;j<200;j++){
  19. height[i][j] = 0;
  20. }
  21. }
  22. g_terrain.CreateTerrain(g_pd3dDevice, 80, 80, 20, 20, height);
  23. // 设定渲染状态
  24. g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
  25. // 设置投影矩阵
  26. D3DXMatrixPerspectiveFovLH(
  27. &g_proj,
  28. D3DX_PI * 0.25f, // 45 - degree
  29. 1,
  30. 1.0f,
  31. 1000.0f);
  32. LPD3DXBUFFER pShaderBuffer, pErrorBuffer;
  33. D3DXAssembleShaderFromFile("vertex.vsd", 0, 0, D3DXSHADER_DEBUG, &pShaderBuffer, &pErrorBuffer);
  34. g_pd3dDevice->CreateVertexShader((DWORD*)(pShaderBuffer->GetBufferPointer()), &vertexShader);
  35. g_pd3dDevice->SetVertexShader(vertexShader);
  36. return true;
  37. }
  38. bool DrawTextX()
  39. {
  40. //用于渲染侦FPS
  41. static int tmLastTime = GetTickCount();
  42. int tmNow = GetTickCount();
  43. //用于计算渲染FPS
  44. static int nFrameCount = 0;
  45. static int nFPS = 0;
  46. if(tmNow - tmLastTime > 1000)
  47. {
  48. //计算FPS
  49. tmLastTime = tmNow;
  50. nFPS = nFrameCount;
  51. nFrameCount = 0;
  52. }
  53. nFrameCount ++;
  54. char str[500];
  55. RECT rect;
  56. rect.left = rect.top = 10;
  57. rect.bottom = rect.top + 30;
  58. rect.right = rect.left + 260;
  59. sprintf(str, "Current FPS:%d, please press Q to toggle WireFrame mode, 
  60. and press LButton to enable a different Light source", nFPS);
  61. g_pFont->DrawTextA(NULL, str, (int)strlen(str), &rect, DT_LEFT|DT_NOCLIP|DT_WORDBREAK, 0xffffff00);
  62. return true;
  63. }
  64. bool Display()
  65. {
  66. // 获取两次进入函数入口的时间间隔
  67. static float lastTime = (float)timeGetTime();
  68. float curTime  = (float)timeGetTime();
  69. float timeDelta = (curTime - lastTime)*0.001f;
  70. lastTime = curTime;
  71. // 设定视口矩阵,你可以通过按下上下左右键改变视角
  72. static float angle  = (3.0f * D3DX_PI) / 2.0f;
  73. static float height = 10.f;
  74. if( ::GetAsyncKeyState(VK_LEFT) & 0x8000f )
  75. angle -= 0.5f * timeDelta;
  76. if( ::GetAsyncKeyState(VK_RIGHT) & 0x8000f )
  77. angle += 0.5f * timeDelta;
  78. if( ::GetAsyncKeyState(VK_UP) & 0x8000f )
  79. height += 1.5f * timeDelta;
  80. if( ::GetAsyncKeyState(VK_DOWN) & 0x8000f )
  81. height -= 1.5f * timeDelta;
  82. D3DXVECTOR3 eyept( cosf(angle) * 10.f, height, sinf(angle) * 10.f );
  83. D3DXVECTOR3 lookAt(0.0f, 0.0f, 0.0f);
  84. D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);
  85. D3DXMATRIX view_mat;
  86. D3DXMatrixLookAtLH(&view_mat, &eyept, &lookAt, &up);
  87. D3DXMATRIX matWorld, matWorldViewProj, matT;
  88. D3DXMatrixIdentity(&matWorld);
  89. D3DXMatrixMultiply(&matWorldViewProj, &g_proj, &view_mat);
  90. matWorldViewProj = matWorld * view_mat * g_proj;
  91. D3DXMatrixTranspose(&matT, &matWorldViewProj);
  92. g_pd3dDevice->SetVertexShaderConstantF(0, (float*)&matT, 4);
  93. D3DXVECTOR4 vec4f, vec4Phase;
  94. vec4f.x = vec4f.y = vec4f.z = vec4f.w = 0.1f;//频率
  95. vec4Phase.x = vec4Phase.y = vec4Phase.z = vec4Phase.w = curTime;//当前时间
  96. g_pd3dDevice->SetVertexShaderConstantF(4, (float*)&vec4f, 1);
  97. g_pd3dDevice->SetVertexShaderConstantF(5, (float*)&vec4Phase, 1);
  98. g_pd3dDevice->SetVertexShader(vertexShader);
  99. // 绘制场景
  100. g_pd3dDevice->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0x00000000, 1.0f, 0);
  101. g_pd3dDevice->BeginScene();
  102. g_terrain.RenderTerrain(g_pd3dDevice, D3DFILL_WIREFRAME);
  103. g_pd3dDevice->SetVertexShader(NULL);
  104. // 在屏幕上写字
  105. if(g_pFont)
  106. DrawTextX();
  107. g_pd3dDevice->EndScene();
  108. g_pd3dDevice->Present(0, 0, 0, 0);
  109. return true;
  110. }
  111. bool CleanUp()
  112. {
  113. g_pd3dDevice->SetVertexShader(NULL);
  114. SAFE_RELEASE(vertexShader);
  115. SAFE_RELEASE(g_pd3dDevice);
  116. SAFE_RELEASE(g_pd3d);
  117. return true;
  118. }
  119. int WINAPI WinMain(HINSTANCE hInstance,
  120.    HINSTANCE prevInstance, 
  121.    PSTR cmdLine,
  122.    int showCmd)
  123. {
  124. // 应用程序初始化
  125. if(!InitD3DApp(hInstance, true/*true代表窗口模式*/, 
  126. D3DDEVTYPE_HAL, &g_pd3d, &g_pd3dDevice, "light"/*窗口标题*/, 1024, 768))
  127. {
  128. MessageBoxW(0, L"应用程序初始化失败", 0, 0);
  129. return 0;
  130. }
  131. // 创建字体
  132. if(!InitDXFont(g_pd3dDevice, &g_pFont, "Times New Roman"))
  133. g_pFont = NULL;
  134. Setup();
  135. // 进入消息循环
  136. MSG msg;
  137. ZeroMemory(&msg, sizeof(msg));
  138. while(msg.message != WM_QUIT)
  139. {
  140. if(PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
  141. {
  142. TranslateMessage(&msg);
  143. DispatchMessage(&msg);
  144. }
  145. else
  146. {
  147. Display();
  148. }
  149. }
  150. CleanUp();
  151. return 0;
  152. }
  153. // 消息循环函数
  154. LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
  155. {
  156. static bool bWireFrame = false;
  157. switch( msg )
  158. {
  159. case WM_DESTROY:
  160. ::PostQuitMessage(0);
  161. break;
  162. case WM_LBUTTONDOWN:
  163. // g_nlight_Enabled++;
  164. break;
  165. case WM_KEYDOWN:
  166. if( wParam == VK_ESCAPE )
  167. ::DestroyWindow(hwnd);
  168. break;
  169. case WM_CHAR:
  170. if(wParam == 'q')
  171. bWireFrame = !bWireFrame;
  172. if(bWireFrame)
  173. g_pd3dDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_WIREFRAME );
  174. else
  175. g_pd3dDevice->SetRenderState( D3DRS_FILLMODE, D3DFILL_SOLID );
  176. break;
  177. }
  178. return ::DefWindowProc(hwnd, msg, wParam, lParam);
  179. }