本文是DirectX11 With Windows SDK 2-4章的课后作业
答案仅供参考

02 顶点/像素着色器的创建、顶点缓冲区

原文链接: DirectX11 With Windows SDK--02 顶点/像素着色器的创建、顶点缓冲区

  1. 尝试交换三角形第一个和第三个顶点的数据,屏幕将显示什么?为什么?

    会消失, 因为三角形的背面朝向摄像机,不会被画出来

  2. 尝试用6个顶点绘制矩形表面

    具体查看文章评论区

  3. 尝试用4个顶点绘制矩形表面 (提示:D3D11_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP)

     VertexPosColor vertices[] =
     {
         //4p->Rectangle
         { XMFLOAT3(0.0f, 0.5f, 0.0f), XMFLOAT4(0.0f, 1.0f, 0.0f, 1.0f) },
         { XMFLOAT3(0.5f, 0.0f, 0.0f), XMFLOAT4(0.0f, 0.0f, 1.0f, 1.0f) },
         { XMFLOAT3(-0.5f, 0.0f, 0.0f), XMFLOAT4(1.0f, 0.0f, 0.0f, 1.0f) },
         { XMFLOAT3(0.0f, -0.5f, 0.0f), XMFLOAT4(0.0f, 0.0f, 1.0f, 1.0f) },
     };
     m_pd3dImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
     //更改为
     m_pd3dImmediateContext->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);

03 索引缓冲区、常量缓冲区

原文链接:DirectX11 With Windows SDK--03 索引缓冲区、常量缓冲区

  1. 尝试只用5个顶点绘制四棱锥

    详情见评论区

  2. 尝试将四棱锥、立方体的顶点数据放在同一个顶点缓冲区,索引数据也放在同一个索引缓冲区,然后使用这两个缓冲区来绘制出这两个物体(让四棱锥在左边,立方体在右边,可以修改顶点数据,也可以使用变换矩阵)

    详情见评论区

  3. 尝试创建动态顶点缓冲区,然后通过Map和Unmap的方式给顶点缓冲区写入顶点数据。

     //1. 找到 顶点缓冲区描述 部分内容修改如下
     vbd.Usage = D3D11_USAGE_DYNAMIC;
     vbd.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
     // 2.动态更新时可使用如下代码
     //vertices 为顶点信息
     D3D11_MAPPED_SUBRESOURCE mappedData;
     HR(m_pd3dImmediateContext->Map(m_pVertexBuffer.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedData));
     memcpy_s(mappedData.pData, sizeof(vertices),&vertices, sizeof(vertices));
     m_pd3dImmediateContext->Unmap(m_pVertexBuffer.Get(), 0);

04 变换

原文链接:DirectX11 With Windows SDK--04 变换

  1. 修改项目03,在窗口被拉伸的情况下修改透视投影矩阵的宽高比保证物体正常显示。

    这里窗口被拉伸显示不正常的原因是因为我们在初始化proj矩阵时采用的是当时的AspectRatio 我们在窗口变化的时候要动态的修改,在UpdateScene 函数中 在更新常量缓存时添加一行代码 代码如下

     m_CBuffer.proj = XMMatrixTranspose(XMMatrixPerspectiveFovLH(XM_PIDIV2, AspectRatio(), 1.0f, 10000.0f));
  2. 修改项目03,让摄像机位于点(1, 0, -2)观察原点,并使用正交投影观察效果
    修改如下代码
     m_CBuffer.view = XMMatrixTranspose(XMMatrixLookAtLH(
     XMVectorSet(1.0f, 0.0f, -2.0f, 0.0f),
     XMVectorSet(0.0f, 0.0f, 0.0f, 0.0f),
     XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f)
     ));
     m_CBuffer.proj = XMMatrixTranspose(XMMatrixOrthographicLH(10, 10, 1.0f, 10000.0f));
     //其中 XMMatrixOrthographicLH是正交矩阵参数如下
     XMMatrixOrthographicLH(
     float ViewWidth,  // 待投影区域的宽度 
     float ViewHeight, // 高
     float NearZ,      // ***面
     float FarZ        // 远平面
     )
  3. 修改项目03,让立方体中心位于点(3, 0, 0),然后立方体按Z轴绕原点逆时针旋转,同时它也按Z轴绕立方体中心顺时针旋转,速度自拟。

    把步骤拆为3步
    1.Z轴自转
    2.移动到(3,0,0)位置
    3.绕原点Z轴旋转
    代码如下

    //UpdateScene函数中添加
    XMMATRIX m = {
      XMVectorSet(1.0f, 0.0f, 0.0f, 0.0f),
      XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f),
      XMVectorSet(0.0f, 0.0f, 1.0f, 0.0f),
      XMVectorSet(3.0f, 0.0f, 0.0f, 1.0f),
    }; // 平移的矩阵 需要转置
    XMVECTOR Z = { 0.0f,0.0f,1.0f };
    XMMATRIX rotation = XMMatrixRotationAxis(Z,-phi);// 构建旋转矩阵
    m_CBuffer.world = XMMatrixTranspose(rotation * m * XMMatrixRotationZ(theta));
    //先自传,然后平移,之后绕原点转