关于DX中三角形的构造顺序

 今天写了一个简单的程序,显示一个三角形,结果就是看不到在屏幕上,我构造的三角形如下:

  1.     vertices[0].position = D3DXVECTOR3(150.0f,  50.0f, 1.0f);//三个点
  2.     vertices[0].rhw      = 1.0f;
  3.     vertices[0].color    = 0xffff0000;
  4.     vertices[1].position = D3DXVECTOR3(50.0f, 220.0f, 1.0f);//注意这行的变化
  5.     vertices[1].rhw      = 1.0f;
  6.     vertices[1].color    = 0xff0000ff;
  7.     vertices[2].position = D3DXVECTOR3(250.0f, 250.0f, 1.0f);//注意这行的变化
  8.     vertices[2].rhw      = 1.0f;
  9.     vertices[2].color    = 0xffffffff;

应当说是一个简单的程序,可为什么会显示不出来呢?我把顶点又改成下面:

  1.     vertices[0].position = D3DXVECTOR3(150.0f,  50.0f, 1.0f);//三个点
  2.     vertices[0].rhw      = 1.0f;
  3.     vertices[0].color    = 0xffff0000;
  4.     vertices[1].position = D3DXVECTOR3(250.0f, 220.0f, 1.0f);//注意这行的变化
  5.     vertices[1].rhw      = 1.0f;
  6.     vertices[1].color    = 0xff0000ff;
  7.     vertices[2].position = D3DXVECTOR3( 50.0f, 250.0f, 1.0f);//注意这行的变化
  8.     vertices[2].rhw      = 1.0f;
  9.     vertices[2].color    = 0xffffffff;

结果还被我试出来了,屏幕上显示一个三角形。由于以前三角形的顶点是随便写的,后来在纸上一画,立即明白了道理:我以前那个三角形是反时针构造的,而DX中的三角形是顺时针构造的,明白了这个道理,我立即想到了背景剔除。然后我又用前面的三角形,不过我关闭背景剔除功能,结果也能显示出来了:

  1.     vertices[0].position = D3DXVECTOR3(150.0f,  50.0f, 1.0f);//三个点
  2.     vertices[0].rhw      = 1.0f;
  3.     vertices[0].color    = 0xffff0000;
  4.     vertices[1].position = D3DXVECTOR3(50.0f, 220.0f, 1.0f);
  5.     vertices[1].rhw      = 1.0f;
  6.     vertices[1].color    = 0xff0000ff;
  7.     vertices[2].position = D3DXVECTOR3(250.0f, 250.0f, 1.0f);
  8.     vertices[2].rhw      = 1.0f;
  9.     vertices[2].color    = 0xffffffff;
  10.     g_pD3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);

不过这时候看到的三角形是他的反面!

 

顺便赋些代码:

  1. /******************************************************
  2. FileName: CTDUIMessage.h   - TDOnline/UISystem
  3. Author: lsm   Version:        Date: 08/11/4
  4. Description: 索引缓冲区的使用
  5. History:
  6. <author>  <time>  <version>  <note>
  7. ******************************************************/
  8. /*-------------Head------------*/
  9. #include "assert.h"
  10. #include "d3dx9.h"
  11. #pragma warning(disable : 4996)
  12. #include "strsafe.h"
  13. #pragma warning(disable : 4996)
  14. LPDIRECT3D9                g_pD3DObj   = NULL; //D3D 对象
  15. LPDIRECT3DDEVICE9          g_pD3DDev   = NULL; //D3D 设备
  16. LPDIRECT3DVERTEXBUFFER9    g_pVerBuf   = NULL; //顶点缓冲区
  17. LPDIRECT3DINDEXBUFFER9     g_pInBuf    = NULL; //索引缓冲区
  18. TCHAR g_AppName[] = TEXT("D3D");//类名
  19. #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZRHW | D3DFVF_DIFFUSE)//灵活顶点格式
  20. struct CUSTOMVERTEX 
  21. {
  22.     D3DXVECTOR3 position;
  23.     float       rhw;
  24.     D3DCOLOR    color;
  25. };
  26. /*---------------End------------*/
  27. /*==========================================
  28. Function name: InitD3D
  29. Description: 初始化D3D对象
  30. ==========================================*/
  31. HRESULT InitD3D(HWND hWnd)
  32. {
  33.     if((g_pD3DObj = Direct3DCreate9(D3D_SDK_VERSION)) == NULL)//创建3D对象
  34.     {
  35.         assert(false);
  36.         return E_FAIL;
  37.     }
  38.     D3DDISPLAYMODE devMode;
  39.     if (FAILED(g_pD3DObj->GetAdapterDisplayMode(D3DADAPTER_DEFAULT, &devMode)))//获得显卡信息
  40.     {
  41.         assert(false);
  42.         return E_FAIL;
  43.     }
  44.     D3DPRESENT_PARAMETERS d3dpp;
  45.     ZeroMemory(&d3dpp, sizeof(d3dpp));
  46.     d3dpp.Windowed               = true;
  47.     d3dpp.SwapEffect             = D3DSWAPEFFECT_DISCARD;
  48.     d3dpp.BackBufferFormat       = D3DFMT_UNKNOWN;
  49.     if(FAILED(g_pD3DObj->CreateDevice(
  50.                                       D3DADAPTER_DEFAULT,
  51.                                       D3DDEVTYPE_HAL,
  52.                                       hWnd,
  53.                                       D3DCREATE_SOFTWARE_VERTEXPROCESSING,
  54.                                       &d3dpp,
  55.                                       &g_pD3DDev
  56.                                       )))
  57.     {
  58.         assert(false);
  59.         return E_FAIL;
  60.     }
  61.     return S_OK;
  62. }
  63. /*==========================================
  64. Function name: InitVBuf
  65. Description: 填充顶点缓冲区
  66. ==========================================*/
  67. HRESULT InitVBuf()
  68. {
  69.     if (FAILED(g_pD3DDev->CreateVertexBuffer(
  70.                                              3*sizeof(CUSTOMVERTEX),
  71.                                              0,
  72.                                              D3DFVF_CUSTOMVERTEX,
  73.                                              D3DPOOL_DEFAULT,
  74.                                              &g_pVerBuf,
  75.                                              NULL
  76.                                              )))
  77.     {
  78.         return E_FAIL;
  79.     }
  80.     CUSTOMVERTEX *vertices;
  81.     if (FAILED(g_pVerBuf->Lock(0, 0, (void**)&vertices, 0)))//锁住内存
  82.     {
  83.         return E_FAIL;
  84.     }
  85.     vertices[0].position = D3DXVECTOR3(150.0f,  50.0f, 1.0f);//四个点
  86.     vertices[0].rhw      = 1.0f;
  87.     vertices[0].color    = 0xffff0000;
  88.     vertices[1].position = D3DXVECTOR3(50.0f, 220.0f, 1.0f);
  89.     vertices[1].rhw      = 1.0f;
  90.     vertices[1].color    = 0xff0000ff;
  91.     vertices[2].position = D3DXVECTOR3(250.0f, 250.0f, 1.0f);
  92.     vertices[2].rhw      = 1.0f;
  93.     vertices[2].color    = 0xffffffff;
  94.     g_pD3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
  95.     //vertices[3].position = D3DXVECTOR3(250.0f, 250.0f, 0.0f);
  96.     //vertices[3].rhw      = 1.0f;
  97.     //vertices[3].color    = 0xff000fff;
  98.     g_pVerBuf->Unlock();
  99.     //WORD indexBuf[] = {0, 1, 2, 0, 2, 3};
  100.     //void *pIndex;
  101.     //g_pD3DDev->CreateIndexBuffer(sizeof(indexBuf), 0, D3DFMT_INDEX16, D3DPOOL_DEFAULT,&g_pInBuf, NULL);
  102.     //g_pInBuf->Lock(0, sizeof(indexBuf), (void **)&pIndex, 0);
  103.     //memcpy(pIndex, indexBuf, sizeof(indexBuf));
  104.     //g_pInBuf->Unlock();
  105.     g_pD3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
  106.     return S_OK;
  107. }
  108. /*==========================================
  109. Function name: Cleanup
  110. Description: 释放对象
  111. ==========================================*/
  112. VOID Cleanup()
  113. {
  114.     if (g_pVerBuf != NULL)
  115.     {
  116.         g_pVerBuf->Release();
  117.     }
  118.     if (g_pD3DDev != NULL)
  119.     {
  120.         g_pD3DDev->Release();
  121.     }
  122.     if (g_pD3DObj != NULL)
  123.     {
  124.         g_pD3DObj->Release();
  125.     }
  126. }
  127. /*==========================================
  128. Function name: Render
  129. Description: 负责渲染
  130. ==========================================*/
  131. VOID Render()
  132. {
  133.     if (g_pD3DDev == NULL)
  134.     {
  135.         return ;
  136.     }
  137.     g_pD3DDev->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 255), 1, 0);
  138.     if (SUCCEEDED(g_pD3DDev->BeginScene()))
  139.     {
  140.         g_pD3DDev->SetStreamSource(0, g_pVerBuf, 0, sizeof(CUSTOMVERTEX));
  141.         g_pD3DDev->SetFVF(D3DFVF_CUSTOMVERTEX);
  142.         //g_pD3DDev->SetIndices(g_pInBuf);
  143.         //g_pD3DDev->DrawIndexedPrimitive(D3DPT_TRIANGLELIST, 0, 0, 4, 0, 2);
  144.         g_pD3DDev->DrawPrimitive(D3DPT_TRIANGLELIST, 0, 1);
  145.         g_pD3DDev->EndScene();
  146.     }
  147.     g_pD3DDev->Present(NULL, NULL, NULL, NULL);
  148. }
  149. /*==========================================
  150. Function name: MsgProc
  151. Description: 负责消息循环
  152. ==========================================*/
  153. LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
  154. {
  155.     switch(msg)
  156.     {
  157.     case WM_DESTROY:
  158.         Cleanup();
  159.         PostQuitMessage(0);
  160.         return 0;
  161.     }
  162.     return DefWindowProc(hWnd, msg, wParam, lParam);
  163. }
  164. /*==========================================
  165. Function name: WinMain
  166. Description: 程序启动函数
  167. ==========================================*/
  168. INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, INT)
  169. {
  170.     WNDCLASSEX wc = {
  171.                    sizeof(WNDCLASSEX), 
  172.                    CS_CLASSDC, 
  173.                    MsgProc, 
  174.                    0L, 
  175.                    0L, 
  176.                    GetModuleHandle(NULL),
  177.                    NULL,
  178.                    NULL,
  179.                    NULL,
  180.                    NULL,
  181.                    g_AppName,
  182.                    NULL
  183.                    };
  184.     RegisterClassEx(&wc);
  185.     HWND hWnd = CreateWindow(
  186.                              g_AppName, 
  187.                              TEXT("D3D Tutorial 1"), 
  188.                              WS_OVERLAPPEDWINDOW, 
  189.                              100, 
  190.                              100, 
  191.                              300, 
  192.                              300,
  193.                              NULL, 
  194.                              NULL, 
  195.                              wc.hInstance, 
  196.                              NULL 
  197.                              );
  198.     if (hWnd == NULL)
  199.     {
  200.         return -1;
  201.     }
  202.     if(SUCCEEDED(InitD3D(hWnd)))
  203.     {
  204.         if(SUCCEEDED(InitVBuf()))
  205.         {
  206.             ShowWindow(hWnd, SW_SHOWDEFAULT);
  207.             UpdateWindow(hWnd);
  208.             MSG msg;
  209.             ZeroMemory(&msg, sizeof(msg));
  210.             while (msg.message != WM_QUIT)
  211.             {
  212.                 if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
  213.                 {
  214.                     TranslateMessage(&msg);
  215.                     DispatchMessage(&msg);
  216.                 }
  217.                 else
  218.                 {
  219.                     Render();
  220.                 }
  221.             }
  222.         }
  223.     }
  224.     UnregisterClass(g_AppName, wc.hInstance);
  225.     return 0;
  226. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值