纹理,按空格键变换立方体的纹理

Code:
  1. //  
  2. // 2011/1/20  
  3. // cube.cpp文件:  
  4. // 作者:CYM  
  5. // 渲染组旋转立方体在网格模式。演示了顶点和索引缓存,世界和观点变换  
  6. //       *新增功能:按方向键能上下能调整摄像机距离和目标的距离  
  7. //       *新增功能:纹理变化  
  8. //  
  9.   
  10. #include "d3dUtility.h"  
  11.   
  12. //  
  13. // 全局设置  
  14. //  
  15.   
  16. IDirect3DDevice9* Device = 0;           //dx设备对象  
  17. LPDIRECT3DTEXTURE9  g_Texture1 = NULL;  //定义文理1 ugp.tga  
  18. LPDIRECT3DTEXTURE9  g_Texture2 = NULL;  //定义文理2 picture.tga  
  19. D3DLIGHT9  g_light;                     //定义灯光  
  20. D3DMATERIAL9  g_material;               //定义材质  
  21.   
  22. const int Width  = 640;  
  23. const int Height = 480;  
  24.   
  25. IDirect3DVertexBuffer9* VB = 0;  
  26. IDirect3DIndexBuffer9*  IB = 0;  
  27.   
  28. D3DXVECTOR3 position(0.0f, 0.0f, -5.0f);    //视角位置  
  29. D3DXVECTOR3 target(0.0f, 0.0f, 0.0f);       //目标  
  30. D3DXVECTOR3 up(0.0f, 1.0f, 0.0f);           //高度  
  31. D3DXMATRIX V;                               //矩阵,  
  32.   
  33. static int  texType=0;  //纹理类型标识  
  34.   
  35. //  
  36. // 顶点/类和结构  
  37. //  
  38.   
  39. struct Vertex  
  40. {  
  41.     Vertex(){}  
  42.     Vertex(float x, float y, float z, float nx ,float ny , float nz,unsigned long color, float  tu, float tv)  
  43.     {  
  44.         _x = x;  _y = y;  _z = z;  
  45.         _nx=nx;_ny=ny;_nz=nz;  
  46.         _color=color;  
  47.         _tu=tu;_tv=tv;  
  48.     }  
  49.     float _x, _y, _z;  
  50.     float _nx,_ny,_nz;  
  51.     unsigned long _color;  
  52.     float _tu, _tv;  
  53.     static const DWORD FVF;  
  54. };  
  55. const DWORD Vertex::FVF = (D3DFVF_XYZ | D3DFVF_NORMAL | D3DFVF_DIFFUSE | D3DFVF_TEX1);  
  56.   
  57. //  
  58. //框架功能  
  59. //  
  60. bool Setup()  
  61. {  
  62.     //  
  63.     // 创建顶点和索引缓冲.  
  64.     //  
  65.   
  66.     Device->CreateVertexBuffer(  
  67.         24 * sizeof(Vertex),   
  68.         D3DUSAGE_WRITEONLY,  
  69.         Vertex::FVF,  
  70.         D3DPOOL_MANAGED,  
  71.         &VB,  
  72.         0);  
  73.   
  74.     Device->CreateIndexBuffer(  
  75.         36 * sizeof(WORD),  
  76.         D3DUSAGE_WRITEONLY,  
  77.         D3DFMT_INDEX16,  
  78.         D3DPOOL_MANAGED,  
  79.         &IB,  
  80.         0);  
  81.   
  82.     //  
  83.     // 填补缓冲器与立方体数据。  
  84.     //  
  85.   
  86.     // 定义独特的顶点。  
  87.     Vertex* v;  
  88.     VB->Lock(0, 0, (void**)&v, 0);  
  89.   
  90.     // 一个立方体的顶点数据  
  91.     // 填充正面顶点数据  
  92.     v[0] = Vertex(-1.0f, -1.0f, -1.0f,0.0f,0.0f,1.0f,D3DCOLOR_XRGB(255,255,255),0.0f, 0.0f);  
  93.     v[1] = Vertex(-1.0f,  1.0f, -1.0f,0.0f,0.0f,1.0f,D3DCOLOR_XRGB(255,255,255),0.0f, 1.0f);  
  94.     v[2] = Vertex( 1.0f,  1.0f, -1.0f,0.0f,0.0f,1.0f,D3DCOLOR_XRGB(255,255,255),1.0f, 1.0f);  
  95.     v[3] = Vertex( 1.0f, -1.0f, -1.0f,0.0f,0.0f,1.0f,D3DCOLOR_XRGB(255,255,255),1.0f, 0.0f);  
  96.   
  97.     // 填充背面顶点数据  
  98.     v[4] = Vertex(-1.0f, -1.0f, 1.0f,0.0f,0.0f,-1.0f,D3DCOLOR_XRGB(255,255,255),0.0f, 0.0f);  
  99.     v[5] = Vertex( 1.0f, -1.0f, 1.0f,0.0f,0.0f,-1.0f,D3DCOLOR_XRGB(255,255,255),0.0f, 1.0f);  
  100.     v[6] = Vertex( 1.0f,  1.0f, 1.0f,0.0f,0.0f,-1.0f,D3DCOLOR_XRGB(255,255,255),1.0f, 1.0f);  
  101.     v[7] = Vertex(-1.0f,  1.0f, 1.0f,0.0f,0.0f,-1.0f,D3DCOLOR_XRGB(255,255,255),1.0f, 0.0f);  
  102.   
  103.     // 填充顶面顶点数据  
  104.     v[8]  = Vertex(-1.0f, 1.0f, -1.0f,0.0f,1.0f,0.0f,D3DCOLOR_XRGB(255,255,255),0.0f, 0.0f);  
  105.     v[9]  = Vertex(-1.0f, 1.0f,  1.0f,0.0f,1.0f,0.0f,D3DCOLOR_XRGB(255,255,255),0.0f, 1.0f);  
  106.     v[10] = Vertex( 1.0f, 1.0f,  1.0f,0.0f,1.0f,0.0f,D3DCOLOR_XRGB(255,255,255),1.0f, 1.0f);  
  107.     v[11] = Vertex( 1.0f, 1.0f, -1.0f,0.0f,1.0f,0.0f,D3DCOLOR_XRGB(255,255,255),1.0f, 0.0f);  
  108.   
  109.     // 填充底面顶点数据  
  110.     v[12] = Vertex(-1.0f, -1.0f, -1.0f,0.0f,-1.0f,0.0f,D3DCOLOR_XRGB(255,255,255),0.0f, 0.0f);  
  111.     v[13] = Vertex( 1.0f, -1.0f, -1.0f,0.0f,-1.0f,0.0f,D3DCOLOR_XRGB(255,255,255),0.0f, 1.0f);  
  112.     v[14] = Vertex( 1.0f, -1.0f,  1.0f,0.0f,-1.0f,0.0f,D3DCOLOR_XRGB(255,255,255),1.0f, 1.0f);  
  113.     v[15] = Vertex(-1.0f, -1.0f,  1.0f,0.0f,-1.0f,0.0f,D3DCOLOR_XRGB(255,255,255),1.0f, 0.0f);  
  114.   
  115.     // 填充左面顶点数据  
  116.     v[16] = Vertex(-1.0f, -1.0f,  1.0f,-1.0f,0.0f,0.0f,D3DCOLOR_XRGB(255,255,255),0.0f, 0.0f);  
  117.     v[17] = Vertex(-1.0f,  1.0f,  1.0f,-1.0f,0.0f,0.0f,D3DCOLOR_XRGB(255,255,255),0.0f, 1.0f);  
  118.     v[18] = Vertex(-1.0f,  1.0f, -1.0f,-1.0f,0.0f,0.0f,D3DCOLOR_XRGB(255,255,255),1.0f, 1.0f);  
  119.     v[19] = Vertex(-1.0f, -1.0f, -1.0f,-1.0f,0.0f,0.0f,D3DCOLOR_XRGB(255,255,255),1.0f, 0.0f);  
  120.   
  121.     // 填充右面顶点数据  
  122.     v[20] = Vertex( 1.0f, -1.0f, -1.0f,1.0f,0.0f,0.0f,D3DCOLOR_XRGB(255,255,255),0.0f, 0.0f);  
  123.     v[21] = Vertex( 1.0f,  1.0f, -1.0f,1.0f,0.0f,0.0f,D3DCOLOR_XRGB(255,255,255),0.0f, 1.0f);  
  124.     v[22] = Vertex( 1.0f,  1.0f,  1.0f,1.0f,0.0f,0.0f,D3DCOLOR_XRGB(255,255,255),1.0f, 1.0f);  
  125.     v[23] = Vertex( 1.0f, -1.0f,  1.0f,1.0f,0.0f,0.0f,D3DCOLOR_XRGB(255,255,255),1.0f, 0.0f);  
  126.   
  127.     VB->Unlock();  
  128.   
  129.     // 定义三角面的立方体:  
  130.     WORD* i = 0;  
  131.     IB->Lock(0, 0, (void**)&i, 0);  
  132.   
  133.     // 填充正面顶点索引数据  
  134.     i[0] = 0; i[1] = 1; i[2] = 2;  
  135.     i[3] = 0; i[4] = 2; i[5] = 3;  
  136.   
  137.     // 填充背面顶点索引数据  
  138.     i[6] = 4; i[7]  = 5; i[8]  = 6;  
  139.     i[9] = 4; i[10] = 6; i[11] = 7;  
  140.   
  141.     // 填充顶面顶点索引数据  
  142.     i[12] = 8; i[13] =  9; i[14] = 10;  
  143.     i[15] = 8; i[16] = 10; i[17] = 11;  
  144.   
  145.     // 填充底面顶点索引数据  
  146.     i[18] = 12; i[19] = 13; i[20] = 14;  
  147.     i[21] = 12; i[22] = 14; i[23] = 15;  
  148.   
  149.     // 填充左面顶点索引数据  
  150.     i[24] = 16; i[25] = 17; i[26] = 18;  
  151.     i[27] = 16; i[28] = 18; i[29] = 19;  
  152.   
  153.     // 填充右面顶点索引数据  
  154.     i[30] = 20; i[31] = 21; i[32] = 22;  
  155.     i[33] = 20; i[34] = 22; i[35] = 23;  
  156.   
  157.     IB->Unlock();  
  158.   
  159.     //加载纹理  
  160.     D3DXCreateTextureFromFile(Device,"ugp.tga",&g_Texture1);  
  161.     D3DXCreateTextureFromFile(Device,"picture.tga",&g_Texture2);  
  162.     //线性过滤  
  163.     Device->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);  
  164.     Device->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);  
  165.     Device->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);  
  166.   
  167.     // 设置纹理g_Texture1的渲染状态,指定纹理颜色与顶点颜色的混合方法  
  168.     Device->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0);  
  169.     Device->SetTextureStageState(0, D3DTSS_COLOROP,   D3DTOP_MODULATE);  
  170.     Device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);  
  171.     Device->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE);  
  172.   
  173.     // 设置纹理g_Texture2过滤器  
  174.     Device->SetSamplerState(1, D3DSAMP_MINFILTER, D3DTEXF_LINEAR);  
  175.     Device->SetSamplerState(1, D3DSAMP_MAGFILTER, D3DTEXF_LINEAR);  
  176.     Device->SetSamplerState(1, D3DSAMP_MIPFILTER, D3DTEXF_LINEAR);  
  177.   
  178.     // 设置纹理g_Texture2的渲染状态,指定纹理颜色与顶点颜色的混合方法  
  179.     Device->SetTextureStageState(1, D3DTSS_TEXCOORDINDEX, 1);  
  180.     Device->SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_MODULATE);  
  181.     Device->SetTextureStageState(1, D3DTSS_COLORARG1, D3DTA_TEXTURE);  
  182.     Device->SetTextureStageState(1, D3DTSS_COLORARG2, D3DTA_CURRENT);  
  183.   
  184.   
  185.   
  186.     //初始化灯光  
  187.     ::ZeroMemory(&g_light, sizeof(g_light));  
  188.     g_light.Type      = D3DLIGHT_DIRECTIONAL;  
  189.     g_light.Ambient   = D3DXCOLOR(0.8f, 0.8f, 0.8f, 1.0f);  
  190.     g_light.Diffuse   = D3DXCOLOR(1.0f, 1.0f, 1.0f, 1.0f);  
  191.     g_light.Specular  = D3DXCOLOR(0.2f, 0.2f, 0.2f, 1.0f);  
  192.     g_light.Direction = D3DXVECTOR3(1.0f, -1.0f, 0.0f);  
  193.     Device->SetLight(0, &g_light);  //设置灯光  
  194.     Device->LightEnable(0, true);   //激活灯光  
  195.   
  196.     //初始化材质  
  197.     ZeroMemory(&g_material,sizeof(D3DMATERIAL9));  
  198.     g_material.Diffuse.r = 0.4f;  
  199.     g_material.Diffuse.g =0.4f;  
  200.     g_material.Diffuse.b = 0.4f;  
  201.     g_material.Ambient.r = 0.6f;  
  202.     g_material.Ambient.g = 0.6f;  
  203.     g_material.Ambient.b = 0.7f;  
  204.     g_material.Specular.r = 0.4f;  
  205.     g_material.Specular.g = 0.4f;  
  206.     g_material.Specular.b = 0.4f;  
  207.     g_material.Power = 8.0f;  
  208.   
  209.   
  210.     //  
  211.     // 位置和目标照相机。  
  212.     //  
  213.   
  214.     D3DXMatrixLookAtLH(&V, &position, &target, &up);    //摄像机函数  
  215.     Device->SetTransform(D3DTS_VIEW, &V);       //转换为试图  
  216.     //  
  217.     // 投影矩阵的.  
  218.     //  
  219.   
  220.     D3DXMATRIX proj;  
  221.     D3DXMatrixPerspectiveFovLH(  
  222.             &proj,  
  223.             D3DX_PI * 0.5f, // 90 - degree  
  224.             (float)Width / (float)Height,  
  225.             1.0f,  
  226.             1000.0f);  
  227.     Device->SetTransform(D3DTS_PROJECTION, &proj);  
  228.   
  229.     //  
  230.     // 设置渲染模式。  
  231.     //  
  232.     Device->SetRenderState(D3DRS_NORMALIZENORMALS, true);   //正常的渲染等级   
  233.     Device->SetRenderState(D3DRS_SPECULARENABLE, true);     //镜面高光  
  234.     Device->SetRenderState(D3DRS_LIGHTING, true);       //设置渲染方式  
  235.     Device->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);  // 不剔除任何面  
  236.     Device->SetRenderState(D3DRS_AMBIENT,D3DCOLOR_COLORVALUE(0.3f, 0.3f, 0.3f, 1.0f));  //设置环境光  
  237.     return true;  
  238. }  
  239.   
  240. void Cleanup()  
  241. {  
  242.     d3d::Release<LPDIRECT3DTEXTURE9>(g_Texture2);  
  243.     d3d::Release<LPDIRECT3DTEXTURE9>(g_Texture1);  
  244.     d3d::Release<IDirect3DVertexBuffer9*>(VB);  
  245.     d3d::Release<IDirect3DIndexBuffer9*>(IB);  
  246. }  
  247.   
  248. void SetMatrixLookAt(D3DXVECTOR3 position,D3DXVECTOR3 target,D3DXVECTOR3 up,D3DXMATRIX V)  
  249. {  
  250.     D3DXMatrixLookAtLH(&V, &position, &target, &up);    //摄像机函数  
  251.     Device->SetTransform(D3DTS_VIEW, &V);       //转换为试图  
  252. }  
  253.   
  254. bool Display(float timeDelta)  
  255. {  
  256.     if( Device )  
  257.     {  
  258.         //  
  259.         // 旋转立方体:  
  260.         //  
  261.         D3DXMATRIX Rx, Ry;  
  262.   
  263.         // 定义x轴要旋转的角度  
  264.         static  float x = 0.0f;  
  265.         D3DXMatrixRotationX(&Rx, x);  
  266.         x+=timeDelta;  
  267.         // 重置的角度对零当角度达到 2*PI也就是360°  
  268.         if(x > 2*D3DX_PI)     
  269.         { x = 0.0f; }  
  270.   
  271.         // 定义y轴要旋转的角度  
  272.         static float y = 0.0f;  
  273.         D3DXMatrixRotationY(&Ry, y);  
  274.         y += timeDelta;  
  275.   
  276.         // 重置的角度对零当角度达到 2*PI也就是360°  
  277.         if( y >= 2*D3DX_PI )  
  278.             y = 0.0f;  
  279.   
  280.         // 结合x -和y维度旋转变换.  
  281.         D3DXMATRIX p = Rx * Ry;  
  282.   
  283.         Device->SetTransform(D3DTS_WORLD, &p);  
  284.   
  285.         //  
  286.         // 画现场:  
  287.         //  
  288.         Device->Clear(0, 0, D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER, 0xffffffff, 1.0f, 0);  
  289.         Device->BeginScene();  
  290.   
  291.         if(texType==0)  //设置纹理1  
  292.         {  
  293.             Device->SetTexture(0, 0);  
  294.             Device->SetTexture(1, 0);  
  295.             Device->SetTexture(0, g_Texture1);  
  296.         }  
  297.         else if(texType==1) //设置纹理2  
  298.         {  
  299.             Device->SetTexture(0, 0);  
  300.             Device->SetTexture(1, 0);  
  301.             Device->SetTexture(0, g_Texture2);  
  302.         }  
  303.         else if(texType==2) //设置多重纹理  
  304.         {  
  305.             Device->SetTexture(0, 0);  
  306.             Device->SetTexture(1, 0);  
  307.             Device->SetTexture(0, g_Texture1);  
  308.             Device->SetTexture(1, g_Texture2);  
  309.         }  
  310.   
  311.         Device->SetMaterial(&g_material);  
  312.         Device->SetStreamSource(0, VB, 0, sizeof(Vertex));  
  313.         Device->SetIndices(IB);  
  314.         Device->SetFVF(Vertex::FVF);  
  315.         // 画立方体.  
  316.         Device->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 24, 0, 12);  
  317.   
  318.         Device->EndScene();  
  319.         Device->Present(0, 0, 0, 0);  
  320.     }  
  321.     return true;  
  322. }  
  323.   
  324.   
  325. //  
  326. // 消息处理  
  327. //  
  328. LRESULT CALLBACK d3d::WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)  
  329. {  
  330.     switch( msg )  
  331.     {  
  332.     case WM_DESTROY:  
  333.         ::PostQuitMessage(0);  
  334.         break;  
  335.           
  336.     case WM_KEYDOWN:  
  337.         switch(wParam)  
  338.         {  
  339.         case VK_ESCAPE:  
  340.             ::DestroyWindow(hwnd);break;  
  341.   
  342.         case VK_UP:             //摄像机位置靠近目标  
  343.             position.z+1<-1.0f?position.z+=1:position.z;  
  344.             SetMatrixLookAt(position,target,up,V);  
  345.                 break;  
  346.         case VK_DOWN:           //摄像机位置远离目标  
  347.             position.z-=1.0f;  
  348.             SetMatrixLookAt(position,target,up,V);  
  349.                 break;  
  350.         case VK_LEFT:  
  351.             position.x+=0.1f;       //摄像机向左移动,同时观察点也相应移动  
  352.             target.x+=0.1f;  
  353.             SetMatrixLookAt(position,target,up,V);  
  354.                 break;  
  355.         case VK_RIGHT:  
  356.             position.x-=0.1f;       //摄像机向右移动,同时观察点也相应移动  
  357.             target.x-=0.1f;  
  358.             SetMatrixLookAt(position,target,up,V);  
  359.                 break;  
  360.         case VK_SPACE:  
  361.             texType=(texType==2?0:++texType);  
  362.                 break;  
  363.         }  
  364.     }  
  365.     return ::DefWindowProc(hwnd, msg, wParam, lParam);  
  366. }  
  367.   
  368. //  
  369. // 入口函数  
  370. //  
  371. int WINAPI WinMain(HINSTANCE hinstance,  
  372.                    HINSTANCE prevInstance,   
  373.                    PSTR cmdLine,  
  374.                    int showCmd)  
  375. {  
  376.     if(!d3d::InitD3D(hinstance,  
  377.         Width, Height, true, D3DDEVTYPE_HAL, &Device))  
  378.     {  
  379.         ::MessageBox(0, "InitD3D() - FAILED", 0, 0);  
  380.         return 0;  
  381.     }  
  382.           
  383.     if(!Setup())  
  384.     {  
  385.         ::MessageBox(0, "Setup() - FAILED", 0, 0);  
  386.         return 0;  
  387.     }  
  388.   
  389.     d3d::EnterMsgLoop( Display );  
  390.   
  391.     Cleanup();  
  392.   
  393.     Device->Release();  
  394.   
  395.     return 0;  
  396. }  

按空格键后变换纹理

图:多重纹理

纹理1:

 

纹理2:

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值