长春网站建设硕成传媒,曹妃甸建设局网站,友情链接买卖,WordPress 会员空间插件Visual Studio为开发Direct3D应用程序提供了便捷的模版#xff0c;读者可以不必手动去新建Direct3D中所使用到的基础资源#xff0c;而只需专注于图形的绘制。本小节主要为读者介绍这个模版中用于绘制图形的主要函数及其功能#xff0c;为了能让读者更为清楚地了解如何使用此…Visual Studio为开发Direct3D应用程序提供了便捷的模版读者可以不必手动去新建Direct3D中所使用到的基础资源而只需专注于图形的绘制。本小节主要为读者介绍这个模版中用于绘制图形的主要函数及其功能为了能让读者更为清楚地了解如何使用此模版绘制三维立体图形下面的介绍将分为四部分其中第一部分介绍在Visual Staudio 2012中如何新建Direct3D项目模版第二部分介绍Direct3D项目模版中用于设置观察视点的函数和设置投影矩阵的函数第三部分紧接着来介绍Direct3D项目模版中用于创建着色器和立体图形顶点的函数最后一部分介绍Direct3D项目模版中用于绘制立体图形的函数。 1新建Direct3D项目模版 打开Visual Studio单击文件菜单在出现的下拉菜单栏中选择新建项目弹出新建项目窗口并选择Visual C菜单栏的Windows应用商店选项接着选中Direct3D应用程序如图20-22所示。 图20-22 添加Direct3D项目模版 通过上述的步骤可以新建一个Direct3D应用程序项目作为开发Direct3D应用程序的模版在这个项目中主要包含如下的文件 BasicTimer.h头文件在这个头文件中定义了一个作为计时器的BasicTimer类。 DirectXHelper.h头文件在这个头文件中定义了用于处理异常和读取资源文件的函数。 CubeRenderer.h头文件用于声明在CubeRenderer.cpp源文件中所使用的变量和函数。 Direct3Dbase.h头文件用于声明在Direct3DBase.cpp源文件中所使用的变量和函数。 CubeRenderer.cpp源文件在这个源文件中添加用于绘制立体图形的实现代码。 Direct3DBase.cpp源文件在这个源文件中添加用于新建Direct3D资源的实现代码。 SimplePixelShader.hlsl文件用于解析像素着色器的信息。 SimpleVertexShader.hlsl文件用于解析顶点着色器的信息。 了解了如何在Visual Staudio 2012中新建一个用于开发Direct3D应用程序的模版以后下面将介绍此模版中用于设置观察视点的函数和设置投影矩阵的函数。 2Update函数和CreateWindowSizeDependentResources函数 在介绍Update函数和CreateWindowSizeDependentResources函数之前首先来介绍ModelViewProjectionConstantBuffer结构体此结构体默认定义在CubeRenderer.h头文件中代码如下所示 struct ModelViewProjectionConstantBuffer { DirectX::XMFLOAT4X4 model; DirectX::XMFLOAT4X4 view; DirectX::XMFLOAT4X4 projection; }; 在ModelViewProjectionConstantBuffer结构体中定义了三个XMFLOAT4X4结构体的变量分别是model、view和projection。其中model结构体变量用于表示立体图形的世界矩阵view结构体变量用于表示立体图形的观察矩阵projection结构体变量用于表示立体图形的投影矩阵。 CubeRenderer.cpp源文件的Update函数用于设置观察视点此观察视点用来将三维立体图形呈现在应用窗口中。Update函数的实现代码如下所示 void CubeRenderer::Update(float timeTotal, float timeDelta) { // 未使用的参数 (void) timeDelta; //观察视点的位置X0.0,Y0.7,Z1.5,W0.0 XMVECTOR eye XMVectorSet(0.0f, 0.7f, 1.5f, 0.0f); //观察目标的位置X0.0,Y-0.1,Z0.0,W0.0 XMVECTOR at XMVectorSet(0.0f, -0.1f, 0.0f, 0.0f); //观察视点的向上向量X0.0,Y1.0,Z0.0,W0.0 XMVECTOR up XMVectorSet(0.0f, 1.0f, 0.0f, 0.0f); //设置观察视点 XMStoreFloat4x4(m_constantBufferData.view, XMMatrixTranspose(XMMatrixLookAtRH(eye, at, up))); //设置世界矩阵 XMStoreFloat4x4(m_constantBufferData.model, XMMatrixTranspose(XMMatrixRotationY(timeTotal * XM_PIDIV4))); } 在上面的代码中定义了三个XMVECTOR类型的变量eye、at和up其中eye变量用于储存观察视点的位置at变量用于储存观察目标的位置up变量用于储存观察视点的向上向量。调用XMVectorSet函数将观察视点的位置设为{0.0f0.7f1.5f0.0f }并将观察目标的位置设为{0.0f-1.0f0.0f0.0f }接着将观察视点的向上向量设为{0.0f1.0f0.0f0.0f}。接下来调用XMMatrixLookAtRH函数并使用eye变量、at变量和up变量作为参数得到一个矩阵并以这个矩阵作为参数调用XMMatrixTranspose函数得到一个转置矩阵接着调用XMStoreFloat4x4函数将此转置矩阵存储到view结构体变量中。 然后以参数timeTotal乘以XM_PIDIV4常量所得到的值作为参数调用XMMatrixRotationY 函数得到一个绕Y轴的旋转矩阵并以这个旋转矩阵作为参数调用XMMatrixTranspose函数得到一个转置矩阵最后调用XMStoreFloat4x4函数将这个转置矩阵存储到model结构体变量中使立体图形绕Y轴旋转。 CubeRenderer.cpp源文件的CreateWindowSizeDependentResources函数用于设置投影矩阵此函数的实现代码如下所示 void CubeRenderer::CreateWindowSizeDependentResources() { Direct3DBase::CreateWindowSizeDependentResources(); //定义aspectRatio变量 float aspectRatio m_windowBounds.Width / m_windowBounds.Height; //定义fovAngleY变量 float fovAngleY 70.0f * XM_PI / 180.0f; //设置投影矩阵 XMStoreFloat4x4( m_constantBufferData.projection, XMMatrixTranspose( XMMatrixMultiply( XMMatrixPerspectiveFovRH(fovAngleY, aspectRatio, 0.01f, 100.0f ), XMLoadFloat4x4(m_orientationTransform3D) ) ) ); } 在上面的代码中首先调用定义在Direct3DBase.cpp源文件中的CreateWindowSizeDependentResources函数来新建与应用窗口大小相关的资源。然后定义两个float类型的变量aspectRatio和fovAngleY将应用窗口的宽度除以应用窗口的高度所得到的值赋给aspectRatio变量并将70.0f乘以XM_PI常量再除以180.0f所得到的值赋给fovAngleY变量。接着以aspectRatio变量和fovAngleY变量作为参数调用XMMatrixPerspectiveFovRH函数来得到一个右手透视投影矩阵使用XMMatrixMultiply函数将这个左手透视矩阵乘以XMLoadFloat4x4函数所返回的矩阵得到一个新矩阵并以这个新矩阵作为参数调用XMMatrixTranspose函数得到一个转置矩阵最后调用XMStoreFloat4x4函数将这个转置矩阵存储到projection结构体变量中。