zoukankan      html  css  js  c++  java
  • 3D游戏从头编之D3D(3)

    索引顶点:

      // 顶点原始数据
      CUSTOMVERTEX g_Vertices[] =
      {
         { -1.0f,-1.0f, 0.0f, 0xffff0000, }, // A红色
         { 1.0f,-1.0f, 0.0f, 0xff0000ff, }, // B兰色
         { 1.0f, 0.0f, 0.0f, 0xff00ff00, }, // C绿色
         { 0.0f, 1.0f, 0.0f, 0xffff00ff, }, // D洋红
         { -1.0f, 0.0f, 0.0f, 0xffffffff, }, // E白色
      };

      这五个点具体到图上是这样的:

       引用 3D游戏从头编之D3D(3) - 迷茫 - bendanchenzhicheng的博客

      那索引数据放到哪里呢?我们需要用到一个叫做索引缓冲的东西,看程序:

      LPDIRECT3DINDEXBUFFER8 g_pIB = NULL; // 索引缓冲区

      // 创建索引缓冲区
      if( FAILED( g_pd3dDevice->CreateIndexBuffer( 6*sizeof(WORD),
                             0, 
                             D3DFMT_INDEX16,
                             D3DPOOL_DEFAULT, 
                             &g_pIB ) ) )
      {
        return E_FAIL;
      }


      第一个参数表示缓冲区大小,我们给出了6个点。
      第二个参数暂时不管,填0。 
      第三个参数是索引的格式,我们用16位存储索引值(也就是说最大65535个顶点)。
      第四个参数表示通过什么方式创建,用缺省值就好了
      第五个参数返回缓冲区指针。

      创建的方法和上次讲的顶点缓冲大同小异,创建好了后,我们填入数据:

      // 填充顶点缓冲区
      WORD* pi;
      if( FAILED( g_pIB->Lock( 0, 12, (BYTE**)&pi, 0 ) ) )
        return E_FAIL;
      pi[0] = 0; // A
      pi[1] = 1; // B
      pi[2] = 2; // C
      pi[3] = 0; // A
      pi[4] = 3; // D
      pi[5] = 4; // E
      g_pIB->Unlock();

      好,六个点正好是两个三角形,按我们添的数据,这两个三角形应该是这样的: 

      引用 3D游戏从头编之D3D(3) - 迷茫 - bendanchenzhicheng的博客

      现在我们就有了两个缓冲区,一个顶点缓冲区,放了5个原始顶点的数据;一个索引缓冲区,放了6个索引值,代表了两个三角形的面。
      OK,准备工作就绪了,最重要的是怎么把它们渲染出来,看程序:

      // --渲染图形--

      // 指定渲染源
      g_pd3dDevice->SetStreamSource( 0, g_pVB, sizeof(CUSTOMVERTEX) );
      g_pd3dDevice->SetIndices(g_pIB, 0);

      // 指定自定义的FVF
      g_pd3dDevice->SetVertexShader( D3DFVF_CUSTOMVERTEX );

      // 渲染
      g_pd3dDevice->DrawIndexedPrimitive( D3DPT_TRIANGLELIST, 0, 5, 0, 2);

      和上回的渲染部分比较一下,很明显,多了一个SetIndeces()的步骤。还有就是最后的渲染也由DrawPrimitive()变成了  DrawIndexedPrimivive()。
      DrawIndexedPrimivive()一共有五个参数,我们来简要说明一下(具体查dx8帮助)

      D3DPRIMITIVETYPE Type, // 渲染类型(点、线、面等)
      UINT MinIndex, // 顶点缓冲区中顶点的起始值,一般为0
      UINT NumVertices, // 顶点缓冲区中的顶点数量
      UINT StartIndex, // 索引缓冲区中索引的起始值
      UINT PrimitiveCount // 要渲染图形的数量

  • 相关阅读:
    leetcode53. Maximum Subarray(动态规划)
    MinGW中没有gdb.exe解决办法
    POJ
    POJ 3614 (贪心)
    bzoj 1057 (悬线法求最大子矩阵)
    bzoj1 218 激光炸弹(二位前缀和)
    POJ 2299(归并求逆序对)
    HDU 1394(归并求逆序对)
    POJ1523 Targin求关节点
    HDU6299 贪心
  • 原文地址:https://www.cnblogs.com/bendanchenzhicheng/p/2173194.html
Copyright © 2011-2022 走看看